@robinpath/box
Advanced tools
| /** | ||
| * RobinPath Box Module (Node port) | ||
| * | ||
| * Box Content API v2.0 — file storage, folders, shared links. Shares the | ||
| * credential contract, metadata shape, and error taxonomy of the other | ||
| * file-storage modules (Dropbox, OneDrive, Google Drive) so the visual editor | ||
| * can render them identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes a | ||
| * credential slug as its first argument. The host registers a CredentialStore | ||
| * on the runtime and this module resolves tokens at call time via the | ||
| * injected ModuleHost. | ||
| * | ||
| * Box supports both OAuth 2.0 (three-legged + refresh) and JWT app auth. This | ||
| * module authenticates with a Bearer access_token; when refresh_token + | ||
| * client_id + client_secret are present it transparently refreshes the token | ||
| * on 401 and writes the new value back into the vault. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - box : { access_token, refresh_token?, client_id?, client_secret? } | ||
| * → Bearer auth on api.box.com. Refresh is performed against | ||
| * api.box.com/oauth2/token with grant_type=refresh_token. | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureBox(h: ModuleHost): void; | ||
| export declare const BoxFunctions: Record<string, BuiltinHandler>; | ||
| export declare const BoxCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const BoxFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const BoxModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=box.d.ts.map |
| {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../src/box.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhD;AAqrBD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAQvD,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,oBAAoB,EA0CpD,CAAC;AAoDF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA4XhE,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,cAiC/B,CAAC"} |
+1033
| /** | ||
| * RobinPath Box Module (Node port) | ||
| * | ||
| * Box Content API v2.0 — file storage, folders, shared links. Shares the | ||
| * credential contract, metadata shape, and error taxonomy of the other | ||
| * file-storage modules (Dropbox, OneDrive, Google Drive) so the visual editor | ||
| * can render them identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes a | ||
| * credential slug as its first argument. The host registers a CredentialStore | ||
| * on the runtime and this module resolves tokens at call time via the | ||
| * injected ModuleHost. | ||
| * | ||
| * Box supports both OAuth 2.0 (three-legged + refresh) and JWT app auth. This | ||
| * module authenticates with a Bearer access_token; when refresh_token + | ||
| * client_id + client_secret are present it transparently refreshes the token | ||
| * on 401 and writes the new value back into the vault. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - box : { access_token, refresh_token?, client_id?, client_secret? } | ||
| * → Bearer auth on api.box.com. Refresh is performed against | ||
| * api.box.com/oauth2/token with grant_type=refresh_token. | ||
| */ | ||
| import { Buffer } from "node:buffer"; | ||
| import { readFile } from "node:fs/promises"; | ||
| import { mkdir, writeFile } from "node:fs/promises"; | ||
| import { dirname } from "node:path"; | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Box module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureBox(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://api.box.com/2.0/"; | ||
| const UPLOAD_BASE = "https://upload.box.com/api/2.0/"; | ||
| const TOKEN_URL = "https://api.box.com/oauth2/token"; | ||
| const CREDENTIAL_TYPE = "box"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return !!v && typeof v === "object" && "error" in v && "code" in v; | ||
| } | ||
| async function resolveToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.access_token ?? ""); | ||
| if (!token) { | ||
| return errorReturn("Credential has no `access_token` field.", "token_missing"); | ||
| } | ||
| return { token, credentialSlug, fields }; | ||
| } | ||
| async function refreshAccessToken(refreshToken, clientId, clientSecret) { | ||
| const body = new URLSearchParams({ | ||
| grant_type: "refresh_token", | ||
| refresh_token: refreshToken, | ||
| client_id: clientId, | ||
| client_secret: clientSecret, | ||
| }).toString(); | ||
| let response; | ||
| try { | ||
| response = await fetch(TOKEN_URL, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/x-www-form-urlencoded" }, | ||
| body, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded = {}; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : {}; | ||
| } | ||
| catch { | ||
| decoded = {}; | ||
| } | ||
| const status = response.status; | ||
| const accessToken = String(decoded.access_token ?? ""); | ||
| if (status < 200 || status >= 300 || !accessToken) { | ||
| const msg = String(decoded.error_description ?? decoded.error ?? "Refresh failed."); | ||
| return errorReturn(msg, "token_exchange_failed", { status }); | ||
| } | ||
| return { | ||
| token: accessToken, | ||
| refresh_token: typeof decoded.refresh_token === "string" | ||
| ? decoded.refresh_token | ||
| : undefined, | ||
| }; | ||
| } | ||
| async function writeBackTokens(slug, fields, newAccessToken, newRefreshToken) { | ||
| try { | ||
| await host().credentials.set(slug, CREDENTIAL_TYPE, { | ||
| ...fields, | ||
| access_token: newAccessToken, | ||
| ...(newRefreshToken ? { refresh_token: newRefreshToken } : {}), | ||
| }); | ||
| } | ||
| catch { | ||
| // Best-effort — caller still has the refreshed token in memory. | ||
| } | ||
| } | ||
| async function maybeRefreshAndRetry(resolved, retry) { | ||
| const refreshToken = String(resolved.fields.refresh_token ?? ""); | ||
| const clientId = String(resolved.fields.client_id ?? ""); | ||
| const clientSecret = String(resolved.fields.client_secret ?? ""); | ||
| if (!refreshToken || !clientId || !clientSecret) | ||
| return null; | ||
| const refreshed = await refreshAccessToken(refreshToken, clientId, clientSecret); | ||
| if (isErrorReturn(refreshed)) | ||
| return null; | ||
| await writeBackTokens(resolved.credentialSlug, resolved.fields, refreshed.token, refreshed.refresh_token); | ||
| return retry(refreshed.token); | ||
| } | ||
| // ── HTTP helpers ─────────────────────────────────────────────────────── | ||
| function boxError(status, decoded, retryAfterHeader) { | ||
| const messageRaw = decoded.message; | ||
| const summary = typeof messageRaw === "string" && messageRaw | ||
| ? messageRaw | ||
| : `Box returned HTTP ${status}.`; | ||
| let code = "box_error"; | ||
| if (status === 404) { | ||
| code = "not_found"; | ||
| } | ||
| else if (status === 409) { | ||
| code = "conflict"; | ||
| } | ||
| else if (status === 429) { | ||
| code = "rate_limited"; | ||
| } | ||
| else if (status === 401) { | ||
| code = "token_missing"; | ||
| } | ||
| else if (status === 403) { | ||
| code = "permission_denied"; | ||
| } | ||
| else if (status === 400 || status === 422) { | ||
| code = "validation_failed"; | ||
| } | ||
| const out = { | ||
| error: summary, | ||
| code, | ||
| status, | ||
| box_error: decoded, | ||
| }; | ||
| if (retryAfterHeader) { | ||
| const n = parseInt(retryAfterHeader, 10); | ||
| if (!Number.isNaN(n)) | ||
| out.retry_after = n; | ||
| } | ||
| return out; | ||
| } | ||
| async function httpJson(token, method, pathAndQuery, body) { | ||
| const url = API_BASE + pathAndQuery.replace(/^\/+/, ""); | ||
| const headers = { | ||
| Authorization: `Bearer ${token}`, | ||
| Accept: "application/json", | ||
| }; | ||
| if (body !== undefined && body !== null) { | ||
| headers["Content-Type"] = "application/json"; | ||
| } | ||
| const init = { method, headers }; | ||
| if (body !== undefined && body !== null) { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(url, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| const raw = await response.text(); | ||
| if (status === 204 || raw === "") { | ||
| if (status >= 200 && status < 300) | ||
| return { ok: true }; | ||
| return boxError(status, { raw }, response.headers.get("retry-after")); | ||
| } | ||
| let decoded = null; | ||
| try { | ||
| decoded = JSON.parse(raw); | ||
| } | ||
| catch { | ||
| decoded = { raw: raw.slice(0, 500) }; | ||
| } | ||
| if (status >= 200 && status < 300) { | ||
| if (decoded && typeof decoded === "object") | ||
| return decoded; | ||
| return { raw }; | ||
| } | ||
| return boxError(status, decoded && typeof decoded === "object" | ||
| ? decoded | ||
| : { raw: raw.slice(0, 500) }, response.headers.get("retry-after")); | ||
| } | ||
| async function callJson(credentialSlug, method, pathAndQuery, body) { | ||
| const resolved = await resolveToken(credentialSlug); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const first = await httpJson(resolved.token, method, pathAndQuery, body); | ||
| if (isErrorReturn(first) && first.status === 401) { | ||
| const retry = await maybeRefreshAndRetry(resolved, (tok) => httpJson(tok, method, pathAndQuery, body)); | ||
| if (retry) | ||
| return retry; | ||
| } | ||
| return first; | ||
| } | ||
| // ── Upload content resolver ──────────────────────────────────────────── | ||
| async function resolveUploadBytes(content) { | ||
| if (typeof content === "string") { | ||
| return Buffer.from(content, "utf8"); | ||
| } | ||
| if (content && typeof content === "object") { | ||
| const obj = content; | ||
| if (typeof obj.base64 === "string") { | ||
| try { | ||
| const decoded = Buffer.from(obj.base64, "base64"); | ||
| const normalized = obj.base64.replace(/\s+/g, "").replace(/=+$/, ""); | ||
| const reencoded = decoded.toString("base64").replace(/=+$/, ""); | ||
| if (normalized.length > 0 && reencoded !== normalized) { | ||
| return errorReturn("Invalid base64 content.", "no_source"); | ||
| } | ||
| return decoded; | ||
| } | ||
| catch { | ||
| return errorReturn("Invalid base64 content.", "no_source"); | ||
| } | ||
| } | ||
| if (typeof obj.path === "string") { | ||
| const path = obj.path; | ||
| try { | ||
| return await readFile(path); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(`Cannot read file at ${path} (${e instanceof Error ? e.message : String(e)}).`, "no_source"); | ||
| } | ||
| } | ||
| if (typeof obj.url === "string") { | ||
| let resp; | ||
| try { | ||
| resp = await fetch(obj.url); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| if (resp.status < 200 || resp.status >= 300) { | ||
| return errorReturn(`Upstream ${obj.url} returned HTTP ${resp.status}.`, "transport"); | ||
| } | ||
| const ab = await resp.arrayBuffer(); | ||
| return Buffer.from(ab); | ||
| } | ||
| } | ||
| return errorReturn("Content must be a string or an object with `base64`, `path`, or `url`.", "no_source"); | ||
| } | ||
| // ── Multipart upload helper ──────────────────────────────────────────── | ||
| async function httpUpload(token, attributes, fileName, bytes) { | ||
| const boundary = "----RobinPathBoxBoundary" + Date.now().toString(16); | ||
| const crlf = "\r\n"; | ||
| const attrHead = Buffer.from(`--${boundary}${crlf}` + | ||
| `Content-Disposition: form-data; name="attributes"${crlf}` + | ||
| `Content-Type: application/json${crlf}${crlf}` + | ||
| JSON.stringify(attributes) + | ||
| crlf, "utf8"); | ||
| const fileHead = Buffer.from(`--${boundary}${crlf}` + | ||
| `Content-Disposition: form-data; name="file"; filename="${fileName.replace(/"/g, "")}"${crlf}` + | ||
| `Content-Type: application/octet-stream${crlf}${crlf}`, "utf8"); | ||
| const tail = Buffer.from(`${crlf}--${boundary}--${crlf}`, "utf8"); | ||
| const body = Buffer.concat([attrHead, fileHead, bytes, tail]); | ||
| let response; | ||
| try { | ||
| response = await fetch(UPLOAD_BASE + "files/content", { | ||
| method: "POST", | ||
| headers: { | ||
| Authorization: `Bearer ${token}`, | ||
| "Content-Type": `multipart/form-data; boundary=${boundary}`, | ||
| }, | ||
| body, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| const raw = await response.text(); | ||
| let decoded = null; | ||
| if (raw !== "") { | ||
| try { | ||
| decoded = JSON.parse(raw); | ||
| } | ||
| catch { | ||
| decoded = { raw: raw.slice(0, 500) }; | ||
| } | ||
| } | ||
| if (status < 200 || status >= 300) { | ||
| return boxError(status, decoded && typeof decoded === "object" | ||
| ? decoded | ||
| : { raw: raw.slice(0, 500) }, response.headers.get("retry-after")); | ||
| } | ||
| return decoded ?? { ok: true }; | ||
| } | ||
| async function callUpload(credentialSlug, attributes, fileName, bytes) { | ||
| const resolved = await resolveToken(credentialSlug); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const first = await httpUpload(resolved.token, attributes, fileName, bytes); | ||
| if (isErrorReturn(first) && first.status === 401) { | ||
| const retry = await maybeRefreshAndRetry(resolved, (tok) => httpUpload(tok, attributes, fileName, bytes)); | ||
| if (retry) | ||
| return retry; | ||
| } | ||
| return first; | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const listItems = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const folderId = args[1] !== undefined && args[1] !== null ? String(args[1]) : "0"; | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| const sp = new URLSearchParams(); | ||
| if (opts.fields !== undefined) { | ||
| const f = Array.isArray(opts.fields) | ||
| ? opts.fields.map((x) => String(x)).join(",") | ||
| : String(opts.fields); | ||
| sp.set("fields", f); | ||
| } | ||
| if (opts.limit !== undefined) | ||
| sp.set("limit", String(Number(opts.limit) | 0)); | ||
| if (opts.offset !== undefined) | ||
| sp.set("offset", String(Number(opts.offset) | 0)); | ||
| if (opts.sort !== undefined) | ||
| sp.set("sort", String(opts.sort)); | ||
| if (opts.direction !== undefined) | ||
| sp.set("direction", String(opts.direction)); | ||
| if (opts.usemarker !== undefined) { | ||
| sp.set("usemarker", String(Boolean(opts.usemarker))); | ||
| } | ||
| if (opts.marker !== undefined) | ||
| sp.set("marker", String(opts.marker)); | ||
| const qs = sp.toString(); | ||
| const path = `folders/${encodeURIComponent(folderId)}/items${qs ? "?" + qs : ""}`; | ||
| return (await callJson(cred, "GET", path)); | ||
| }; | ||
| const getFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (!fileId) { | ||
| return errorReturn("`fileId` is required.", "validation_failed"); | ||
| } | ||
| const sp = new URLSearchParams(); | ||
| if (opts.fields !== undefined) { | ||
| const f = Array.isArray(opts.fields) | ||
| ? opts.fields.map((x) => String(x)).join(",") | ||
| : String(opts.fields); | ||
| sp.set("fields", f); | ||
| } | ||
| const qs = sp.toString(); | ||
| const path = `files/${encodeURIComponent(fileId)}${qs ? "?" + qs : ""}`; | ||
| return (await callJson(cred, "GET", path)); | ||
| }; | ||
| const uploadFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileName = String(args[1] ?? ""); | ||
| const content = args[2]; | ||
| const parentFolderId = args[3] !== undefined && args[3] !== null && args[3] !== "" ? String(args[3]) : "0"; | ||
| const opts = (args[4] && typeof args[4] === "object" ? args[4] : {}); | ||
| if (!fileName) { | ||
| return errorReturn("`fileName` is required.", "validation_failed"); | ||
| } | ||
| const bytes = await resolveUploadBytes(content); | ||
| if (isErrorReturn(bytes)) | ||
| return bytes; | ||
| if (bytes.length > 50 * 1024 * 1024) { | ||
| return errorReturn("Single-shot uploads are capped at 50 MB. Use a Box upload session for larger files.", "too_large"); | ||
| } | ||
| const attributes = { | ||
| name: fileName, | ||
| parent: { id: parentFolderId }, | ||
| }; | ||
| if (typeof opts.contentCreatedAt === "string") { | ||
| attributes.content_created_at = opts.contentCreatedAt; | ||
| } | ||
| if (typeof opts.contentModifiedAt === "string") { | ||
| attributes.content_modified_at = opts.contentModifiedAt; | ||
| } | ||
| if (typeof opts.description === "string") { | ||
| attributes.description = opts.description; | ||
| } | ||
| return (await callUpload(cred, attributes, fileName, bytes)); | ||
| }; | ||
| const downloadFile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const fileId = String(args[1] ?? ""); | ||
| const savePath = args[2] !== undefined && args[2] !== null ? String(args[2]) : ""; | ||
| if (!fileId) { | ||
| return errorReturn("`fileId` is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveToken(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const runDownload = async (token) => { | ||
| let response; | ||
| try { | ||
| response = await fetch(`${API_BASE}files/${encodeURIComponent(fileId)}/content`, { | ||
| method: "GET", | ||
| headers: { Authorization: `Bearer ${token}` }, | ||
| redirect: "follow", | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| if (status < 200 || status >= 300) { | ||
| const raw = await response.text(); | ||
| let decoded = null; | ||
| if (raw !== "") { | ||
| try { | ||
| decoded = JSON.parse(raw); | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| } | ||
| return boxError(status, decoded && typeof decoded === "object" | ||
| ? decoded | ||
| : { raw: raw.slice(0, 200) }, response.headers.get("retry-after")); | ||
| } | ||
| const ab = await response.arrayBuffer(); | ||
| const buf = Buffer.from(ab); | ||
| const result = { | ||
| size: buf.length, | ||
| content_type: response.headers.get("content-type") ?? null, | ||
| }; | ||
| if (savePath !== "") { | ||
| try { | ||
| const dir = dirname(savePath); | ||
| if (dir && dir !== ".") { | ||
| await mkdir(dir, { recursive: true }); | ||
| } | ||
| } | ||
| catch (e) { | ||
| return errorReturn(`Could not create directory for ${savePath} (${e instanceof Error ? e.message : String(e)}).`, "write_error"); | ||
| } | ||
| try { | ||
| await writeFile(savePath, buf); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(`Could not write to ${savePath} (${e instanceof Error ? e.message : String(e)}).`, "write_error"); | ||
| } | ||
| result.path = savePath; | ||
| } | ||
| else { | ||
| result.content = buf.toString("utf8"); | ||
| result.base64 = buf.toString("base64"); | ||
| } | ||
| return result; | ||
| }; | ||
| const first = await runDownload(resolved.token); | ||
| if (isErrorReturn(first) && first.status === 401) { | ||
| const retried = await maybeRefreshAndRetry(resolved, runDownload); | ||
| if (retried) | ||
| return retried; | ||
| } | ||
| return first; | ||
| }; | ||
| const createFolder = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const name = String(args[1] ?? ""); | ||
| const parentFolderId = args[2] !== undefined && args[2] !== null && args[2] !== "" ? String(args[2]) : "0"; | ||
| if (!name) { | ||
| return errorReturn("`name` is required.", "validation_failed"); | ||
| } | ||
| return (await callJson(cred, "POST", "folders", { | ||
| name, | ||
| parent: { id: parentFolderId }, | ||
| })); | ||
| }; | ||
| const deleteItem = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const itemType = String(args[1] ?? "").toLowerCase(); | ||
| const itemId = String(args[2] ?? ""); | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (itemType !== "file" && itemType !== "folder") { | ||
| return errorReturn("`itemType` must be 'file' or 'folder'.", "validation_failed"); | ||
| } | ||
| if (!itemId) { | ||
| return errorReturn("`itemId` is required.", "validation_failed"); | ||
| } | ||
| let path = itemType === "file" | ||
| ? `files/${encodeURIComponent(itemId)}` | ||
| : `folders/${encodeURIComponent(itemId)}`; | ||
| if (itemType === "folder" && opts.recursive !== undefined) { | ||
| path += `?recursive=${Boolean(opts.recursive) ? "true" : "false"}`; | ||
| } | ||
| return (await callJson(cred, "DELETE", path)); | ||
| }; | ||
| const getSharedLink = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const itemType = String(args[1] ?? "").toLowerCase(); | ||
| const itemId = String(args[2] ?? ""); | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (itemType !== "file" && itemType !== "folder") { | ||
| return errorReturn("`itemType` must be 'file' or 'folder'.", "validation_failed"); | ||
| } | ||
| if (!itemId) { | ||
| return errorReturn("`itemId` is required.", "validation_failed"); | ||
| } | ||
| const shared_link = {}; | ||
| if (opts.access !== undefined) { | ||
| shared_link.access = String(opts.access); | ||
| } | ||
| if ("canDownload" in opts) { | ||
| shared_link.permissions = { can_download: Boolean(opts.canDownload) }; | ||
| } | ||
| if (typeof opts.unsharedAt === "string") { | ||
| shared_link.unshared_at = opts.unsharedAt; | ||
| } | ||
| if (typeof opts.password === "string") { | ||
| shared_link.password = opts.password; | ||
| } | ||
| const path = itemType === "file" | ||
| ? `files/${encodeURIComponent(itemId)}?fields=shared_link` | ||
| : `folders/${encodeURIComponent(itemId)}?fields=shared_link`; | ||
| return (await callJson(cred, "PUT", path, { | ||
| shared_link: Object.keys(shared_link).length > 0 ? shared_link : { access: "open" }, | ||
| })); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const BoxFunctions = { | ||
| listItems, | ||
| getFile, | ||
| uploadFile, | ||
| downloadFile, | ||
| createFolder, | ||
| delete: deleteItem, | ||
| getSharedLink, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const BoxCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Box Access Token", | ||
| icon: "cloud", | ||
| fields: [ | ||
| { | ||
| name: "access_token", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "Bearer token from OAuth2 or JWT app auth", | ||
| description: "Box access token obtained via OAuth 2.0 (three-legged flow) or JWT app auth. Create an app at https://app.box.com/developers/console and generate a token; for long-lived access use `refresh_token` + `client_id` + `client_secret` so the module auto-refreshes expired tokens.", | ||
| }, | ||
| { | ||
| name: "refresh_token", | ||
| title: "Refresh Token", | ||
| type: "password", | ||
| required: false, | ||
| placeholder: "Optional — enables auto-refresh", | ||
| description: "Optional. When present with client_id + client_secret, the module exchanges it for a fresh access_token on 401 and writes both tokens back into the vault.", | ||
| }, | ||
| { | ||
| name: "client_id", | ||
| title: "Client ID", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "Box app Client ID", | ||
| description: "Box app's Client ID — required for refresh.", | ||
| }, | ||
| { | ||
| name: "client_secret", | ||
| title: "Client Secret", | ||
| type: "password", | ||
| required: false, | ||
| placeholder: "Box app Client Secret", | ||
| description: "Box app's Client Secret — required for refresh.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Metadata: parameters + errors ────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `box` credential. The access token is decrypted at call time and never appears in logs.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_box", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const fileIdParam = { | ||
| name: "fileId", | ||
| title: "File ID", | ||
| description: "Numeric Box file id (e.g. `12345678901`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "12345678901", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but has no `access_token` field.", | ||
| token_exchange_failed: "Refresh attempt failed — check client_id/client_secret.", | ||
| transport: "Network failure calling api.box.com.", | ||
| box_error: "Box returned an error — see `box_error` and `status`.", | ||
| not_found: "The file or folder does not exist, or the token lacks access.", | ||
| conflict: "A file or folder already exists with the same name at the destination.", | ||
| permission_denied: "The token does not have permission for this resource (HTTP 403).", | ||
| rate_limited: "Box rate limited the request. Retry after `retry_after` seconds.", | ||
| validation_failed: "Box rejected the request payload (HTTP 400/422).", | ||
| no_source: "Upload content must be a string or `{base64}`/`{path}`/`{url}`.", | ||
| too_large: "Single-shot uploads are capped at 50 MB. Use an upload session.", | ||
| write_error: "Could not write the downloaded bytes to `savePath`.", | ||
| }; | ||
| // ── Function metadata ────────────────────────────────────────────────── | ||
| export const BoxFunctionMetadata = { | ||
| listItems: { | ||
| title: "List folder items", | ||
| summary: "List the files and folders inside a Box folder", | ||
| description: "Calls `GET /2.0/folders/{folder_id}/items`. Pass `'0'` (or leave empty) for the root folder. Paginate via `limit`/`offset` or the marker mode (`usemarker:true` + `marker`).", | ||
| group: "files", | ||
| action: "query", | ||
| icon: "folder-open", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["box", "list", "folder", "files"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "folderId", | ||
| title: "Folder ID", | ||
| description: "Numeric Box folder id. Pass `'0'` for the user's root folder (default if empty).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: "0", | ||
| defaultValue: "0", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n fields : comma-joined string or array of field names (e.g. ['name','size','modified_at'])\n limit : int — page size (default 100)\n offset : int — pagination offset\n sort : 'name' | 'id' | 'date'\n direction : 'ASC' | 'DESC'\n usemarker : bool — switch to marker-based pagination\n marker : opaque marker returned by a previous call", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Object with `.entries[]` (each `{type,id,name,…}`), `.total_count`, `.limit`, `.offset`.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "List root folder", | ||
| code: 'box.listItems "my_box" "0"', | ||
| }, | ||
| { | ||
| title: "Narrow fields", | ||
| code: 'box.listItems "my_box" "1234" {fields:["name","size","modified_at"], limit:50}', | ||
| }, | ||
| ], | ||
| example: 'box.listItems "my_box" "0"', | ||
| }, | ||
| getFile: { | ||
| title: "Get file", | ||
| summary: "Fetch file metadata by id", | ||
| description: "Calls `GET /2.0/files/{file_id}`. Returns `{type,id,name,size,etag,sha1,parent,created_at,modified_at,…}`. Pass `options.fields` to narrow the payload.", | ||
| group: "files", | ||
| action: "read", | ||
| icon: "file-text", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["box", "file", "metadata"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n fields : comma-joined string or array of field names", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 2, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Full file metadata record.", | ||
| errors: commonErrors, | ||
| example: 'box.getFile "my_box" "12345678901"', | ||
| }, | ||
| uploadFile: { | ||
| title: "Upload file", | ||
| summary: "Upload a new file to a folder", | ||
| description: "Calls `POST https://upload.box.com/api/2.0/files/content`. Content is a UTF-8 string, or an object `{base64|path|url}`. Single-shot uploads are capped at 50 MB — larger files need an upload session (not yet implemented).", | ||
| group: "content", | ||
| action: "upload", | ||
| icon: "upload-cloud", | ||
| capability: "upload_files", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["box", "upload", "write"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "fileName", | ||
| title: "File name", | ||
| description: "Name of the uploaded file, including extension.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "backup-2026-04.json", | ||
| }, | ||
| { | ||
| name: "content", | ||
| title: "File content", | ||
| description: 'Either a plain string (UTF-8 text) or an object:\n {base64: "..."} — decode and upload bytes\n {path: "/var/..."} — read the file from the host\n {url: "https://..."} — fetch, then upload', | ||
| dataType: "any", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| }, | ||
| { | ||
| name: "parentFolderId", | ||
| title: "Parent folder ID", | ||
| description: "Folder id to upload into. Default `'0'` (root).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: "0", | ||
| defaultValue: "0", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n contentCreatedAt : ISO-8601 timestamp\n contentModifiedAt : ISO-8601 timestamp\n description : string", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "`{ entries: [{type:'file', id, name, size, sha1, …}], total_count: 1 }`.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Upload JSON string", | ||
| code: 'box.uploadFile "my_box" "backup.json" \'{"posts":[]}\' "0"', | ||
| }, | ||
| { | ||
| title: "Mirror a file from disk", | ||
| code: 'box.uploadFile "my_box" "db.sql" {path:"/var/backups/db.sql"} "1234"', | ||
| }, | ||
| ], | ||
| example: 'box.uploadFile "my_box" "hello.txt" "Hello" "0"', | ||
| }, | ||
| downloadFile: { | ||
| title: "Download file", | ||
| summary: "Read bytes from a Box file", | ||
| description: "Calls `GET /2.0/files/{file_id}/content`. Box responds with a 302 to a CDN URL; fetch follows it automatically. Pass `savePath` to stream bytes to disk, otherwise the response includes `.content` (UTF-8) and `.base64`.", | ||
| group: "content", | ||
| action: "download", | ||
| icon: "download-cloud", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "modifies_filesystem"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["box", "download", "read"], | ||
| parameters: [ | ||
| credentialParam, | ||
| fileIdParam, | ||
| { | ||
| name: "savePath", | ||
| title: "Save to (server path)", | ||
| description: "Optional absolute path on the host. If given, bytes are written there and the response excludes inline content.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: "/var/www/uploads/backup.json", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "`{size, content_type, content?, base64?, path?}` — `content`/`base64` when inline, `path` when saved to disk.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { title: "Inline", code: 'box.downloadFile "my_box" "12345678901"' }, | ||
| { | ||
| title: "To disk", | ||
| code: 'box.downloadFile "my_box" "12345678901" "/tmp/out.bin"', | ||
| }, | ||
| ], | ||
| example: 'box.downloadFile "my_box" "12345678901"', | ||
| }, | ||
| createFolder: { | ||
| title: "Create folder", | ||
| summary: "Create a new folder inside a parent folder", | ||
| description: "Calls `POST /2.0/folders` with `{name, parent:{id}}`. Parent defaults to `'0'` (root). Box returns 409 if a folder with that name already exists at the target.", | ||
| group: "files", | ||
| action: "write", | ||
| icon: "folder-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["box", "folder", "mkdir"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "name", | ||
| title: "Folder name", | ||
| description: "Name of the new folder.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "Backups 2026-04", | ||
| }, | ||
| { | ||
| name: "parentFolderId", | ||
| title: "Parent folder ID", | ||
| description: "Folder id to create inside. Default `'0'` (root).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: "0", | ||
| defaultValue: "0", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "`{type:'folder', id, name, parent:{id}, …}`.", | ||
| errors: commonErrors, | ||
| example: 'box.createFolder "my_box" "Backups" "0"', | ||
| }, | ||
| delete: { | ||
| title: "Delete file or folder", | ||
| summary: "Trash a file or folder", | ||
| description: "Calls `DELETE /2.0/files/{id}` or `DELETE /2.0/folders/{id}`. Folders support `options.recursive:true` to delete non-empty folders (defaults to `false` — Box rejects with 409 if the folder contains items).", | ||
| group: "files", | ||
| action: "delete", | ||
| icon: "trash-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["box", "delete", "remove"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "itemType", | ||
| title: "Item type", | ||
| description: "Either `file` or `folder`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "file", | ||
| validation: { pattern: "^(file|folder)$" }, | ||
| }, | ||
| { | ||
| name: "itemId", | ||
| title: "Item ID", | ||
| description: "Numeric Box id for the file or folder.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "12345678901", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n recursive : bool — for folders, allow deleting non-empty folders", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 2, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "`{ok: true}` on 204.", | ||
| errors: commonErrors, | ||
| example: 'box.delete "my_box" "file" "12345678901"', | ||
| }, | ||
| getSharedLink: { | ||
| title: "Create / refresh shared link", | ||
| summary: "Get or update a public shared link for a file or folder", | ||
| description: "Calls `PUT /2.0/files/{id}` or `PUT /2.0/folders/{id}` with a `shared_link` object. Box returns the current shared link in the response's `shared_link` field; calling without options creates an `open` link with default permissions.", | ||
| group: "sharing", | ||
| action: "write", | ||
| icon: "share-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["box", "share", "link"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "itemType", | ||
| title: "Item type", | ||
| description: "Either `file` or `folder`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "file", | ||
| validation: { pattern: "^(file|folder)$" }, | ||
| }, | ||
| { | ||
| name: "itemId", | ||
| title: "Item ID", | ||
| description: "Numeric Box id.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "12345678901", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n access : 'open' (default) | 'company' | 'collaborators'\n canDownload : bool\n unsharedAt : ISO-8601 expiry timestamp\n password : string — password-protect the link", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Full item with `.shared_link.url`, `.shared_link.access`, `.shared_link.effective_access`, etc.", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Open link", | ||
| code: 'box.getSharedLink "my_box" "file" "12345678901"', | ||
| }, | ||
| { | ||
| title: "Password-protected", | ||
| code: 'box.getSharedLink "my_box" "file" "12345678901" {access:"open", password:"s3cret", canDownload:true}', | ||
| }, | ||
| ], | ||
| example: 'box.getSharedLink "my_box" "file" "12345678901"', | ||
| }, | ||
| }; | ||
| // ── Module metadata ──────────────────────────────────────────────────── | ||
| export const BoxModuleMetadata = { | ||
| slug: "box", | ||
| title: "Box", | ||
| summary: "Files, folders, and shared links via the Box Content API", | ||
| description: "Drive Box (box.com) from RobinPath scripts. Every method takes a saved `box` credential slug as its first argument; the access token is decrypted at call time, scrubbed from logs, and recorded in the audit trail.\n\nReturns the parsed Box response object as-is — read `.entries[]` for listings, `.shared_link.url` for shared links, `.id`/`.name` for file metadata. Errors are returned as `{error, code, status, box_error?}` rather than thrown.\n\nBox folder ids are numeric strings; the root folder is always `'0'`. When the credential holds `refresh_token` + `client_id` + `client_secret`, expired access tokens are refreshed transparently and both tokens are written back into the vault.", | ||
| category: "storage", | ||
| icon: "icon.svg", | ||
| color: "#0061D5", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/box", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| files: { | ||
| title: "Files & Folders", | ||
| description: "List items, read metadata, create folders, delete entries.", | ||
| order: 1, | ||
| }, | ||
| content: { | ||
| title: "Content", | ||
| description: "Upload and download raw file bytes.", | ||
| order: 2, | ||
| }, | ||
| sharing: { | ||
| title: "Sharing", | ||
| description: "Create public shared links for files and folders.", | ||
| order: 3, | ||
| }, | ||
| }, | ||
| methods: Object.keys(BoxFunctions), | ||
| }; | ||
| //# sourceMappingURL=box.js.map |
| {"version":3,"file":"box.js","sourceRoot":"","sources":["../src/box.ts"],"names":[],"mappings":"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"} |
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const BoxModule: ModuleAdapter; | ||
| export default BoxModule; | ||
| export { BoxModule }; | ||
| export { BoxFunctions, BoxFunctionMetadata, BoxModuleMetadata, BoxCredentialTypes, configureBox, } from "./box.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,SAAS,EAAE,aAQhB,CAAC;AAEF,eAAe,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,UAAU,CAAC"} |
| import { BoxFunctions, BoxFunctionMetadata, BoxModuleMetadata, BoxCredentialTypes, configureBox, } from "./box.js"; | ||
| const BoxModule = { | ||
| name: "box", | ||
| functions: BoxFunctions, | ||
| functionMetadata: BoxFunctionMetadata, | ||
| moduleMetadata: BoxModuleMetadata, | ||
| credentialTypes: BoxCredentialTypes, | ||
| configure: configureBox, | ||
| global: false, | ||
| }; | ||
| export default BoxModule; | ||
| export { BoxModule }; | ||
| export { BoxFunctions, BoxFunctionMetadata, BoxModuleMetadata, BoxCredentialTypes, configureBox, } from "./box.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,UAAU,CAAC;AAElB,MAAM,SAAS,GAAkB;IAC/B,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,YAAY;IACvB,gBAAgB,EAAE,mBAAmB;IACrC,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,UAAU,CAAC"} |
+21
-10
| { | ||
| "name": "@robinpath/box", | ||
| "version": "0.1.2", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,21 +23,32 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Box module for RobinPath.", | ||
| "description": "Box Content API v2.0 — files, folders, shared links, search. Uses the encrypted credential vault (OAuth2 access token).", | ||
| "keywords": [ | ||
| "box", | ||
| "cloud storage" | ||
| "cloud storage", | ||
| "file storage", | ||
| "files", | ||
| "folders", | ||
| "sharing", | ||
| "productivity" | ||
| ], | ||
| "license": "MIT", | ||
| "robinpath": { | ||
| "category": "cloud-storage", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 19, | ||
| "baseUrl": "https://api.box.com" | ||
| "category": "storage", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 7, | ||
| "baseUrl": "https://api.box.com/2.0", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/box | ||
| ```bash | ||
| npm install @robinpath/box | ||
| robinpath add @robinpath/box | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
81303
2117.76%10
400%1082
Infinity%2
100%6
200%