From 596b7f0eeb5faeffc036e5da5d0a881f149e712b Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Mon, 14 Jul 2025 19:43:04 -0500 Subject: [PATCH 01/14] Initial Draft --- package.json | 27 +- src/bucketManager.js | 168 -- src/gatewayManager.js | 221 --- src/helpers.js | 42 - src/index.js | 905 ++++++++- src/nameManager.js | 251 --- src/objectManager.js | 603 ------ src/pinManager.js | 298 --- test/bucketManager.spec.cjs | 147 -- test/bucketManager.spec.mjs | 147 -- test/gatewayManager.spec.cjs | 125 -- test/gatewayManager.spec.mjs | 125 -- test/index.spec.cjs | 809 ++++++++ test/index.spec.mjs | 809 ++++++++ test/nameManager.spec.cjs | 141 -- test/nameManager.spec.mjs | 141 -- test/objectManager.spec.cjs | 357 ---- test/objectManager.spec.mjs | 325 --- test/pinManager.spec.cjs | 262 --- test/pinManager.spec.mjs | 263 --- yarn.lock | 3612 ++++++++++++++++------------------ 21 files changed, 4189 insertions(+), 5589 deletions(-) delete mode 100644 src/bucketManager.js delete mode 100644 src/gatewayManager.js delete mode 100644 src/helpers.js delete mode 100644 src/nameManager.js delete mode 100644 src/objectManager.js delete mode 100644 src/pinManager.js delete mode 100644 test/bucketManager.spec.cjs delete mode 100644 test/bucketManager.spec.mjs delete mode 100644 test/gatewayManager.spec.cjs delete mode 100644 test/gatewayManager.spec.mjs create mode 100644 test/index.spec.cjs create mode 100644 test/index.spec.mjs delete mode 100644 test/nameManager.spec.cjs delete mode 100644 test/nameManager.spec.mjs delete mode 100644 test/objectManager.spec.cjs delete mode 100644 test/objectManager.spec.mjs delete mode 100644 test/pinManager.spec.cjs delete mode 100644 test/pinManager.spec.mjs diff --git a/package.json b/package.json index 4183897..e472351 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@filebase/sdk", - "version": "1.0.6", + "version": "2.0.0", "description": "SDK for Interacting with Filebase Services [S3(Buckets, Objects), IPFS(Gateways, Pins) IPNS(Names)]", "repository": { "type": "git", @@ -38,28 +38,23 @@ "ipns", "sdk", "web3", - "distributed" + "distributed", + "decentralized" ], "devDependencies": { "clean-jsdoc-theme": "4.2.17", "jsdoc": "4.0.2", - "prettier": "3.1.0", + "prettier": "3.6.2", "tsup": "8.0.1", - "typescript": "5.3.3" + "typescript": "5.3.3", + "uuid": "11.1.0" }, "dependencies": { - "@aws-sdk/client-s3": "3.478.0", - "@aws-sdk/lib-storage": "3.478.0", - "@helia/car": "1.0.4", - "@helia/mfs": "3.0.1", - "@helia/unixfs": "1.4.3", - "@ipld/car": "5.2.4", - "axios": "1.6.2", - "blockstore-fs": "1.1.10", - "blockstore-core": "4.4.1", - "datastore-core": "9.2.9", - "p-queue": "8.0.1", - "uuid": "9.0.1", + "@aws-sdk/client-s3": "3.842.0", + "@aws-sdk/s3-request-presigner": "3.844.0", + "axios": "1.10.0", + "ipns": "10.1.2", + "kubo-rpc-client": "5.2.0", "winston": "3.12.0" } } diff --git a/src/bucketManager.js b/src/bucketManager.js deleted file mode 100644 index f09c1ac..0000000 --- a/src/bucketManager.js +++ /dev/null @@ -1,168 +0,0 @@ -import { - CreateBucketCommand, - DeleteBucketCommand, - GetBucketAclCommand, - ListBucketsCommand, - PutBucketAclCommand, PutBucketTaggingCommand, - S3Client, -} from "@aws-sdk/client-s3"; - -/** Provides methods for managing buckets in an S3 endpoint. */ -class BucketManager { - #DEFAULT_ENDPOINT = "https://s3.filebase.com"; - #DEFAULT_REGION = "us-east-1"; - - #client; - - /** - * @summary Creates a new instance of the constructor. - * @param {string} clientKey - The access key ID for authentication. - * @param {string} clientSecret - The secret access key for authentication. - * @tutorial quickstart-bucket - * @example - * import { BucketManager } from "@filebase/sdk"; - * const bucketManager = new BucketManager("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD"); - */ - constructor(clientKey, clientSecret) { - const clientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_S3_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT, - clientConfiguration = { - credentials: { - accessKeyId: clientKey, - secretAccessKey: clientSecret, - }, - endpoint: clientEndpoint, - region: this.#DEFAULT_REGION, - forcePathStyle: true, - }; - this.#client = new S3Client(clientConfiguration); - } - - /** - * @typedef {Object} bucket - * @property {string} Name The name of the bucket - * @property {date} Date the bucket was created - */ - - /** - * @summary Creates a new bucket with the specified name. - * @param {string} name - The name of the bucket to create. - * @returns {Promise} - A promise that resolves when the bucket is created. - * @example - * // Create bucket with name of `create-bucket-example` - * await bucketManager.create(`create-bucket-example`); - */ - async create(name) { - const command = new CreateBucketCommand({ - Bucket: name, - }); - - return await this.#client.send(command); - } - - /** - * @summary Lists the buckets in the client. - * @returns {Promise>} - A promise that resolves with an array of objects representing the buckets in the client. - * @example - * // List all buckets - * await bucketManager.list(); - */ - async list() { - const command = new ListBucketsCommand({}), - { Buckets } = await this.#client.send(command); - - return Buckets; - } - - /** - * @summary Deletes the specified bucket. - * @param {string} name - The name of the bucket to delete. - * @returns {Promise} - A promise that resolves when the bucket is deleted. - * @example - * // Delete bucket with name of `bucket-name-to-delete` - * await bucketManager.delete(`bucket-name-to-delete`); - */ - async delete(name) { - const command = new DeleteBucketCommand({ - Bucket: name, - }); - - await this.#client.send(command); - return true; - } - - /** - * @summary Sets the privacy of a given bucket. - * @param {string} name - The name of the bucket to toggle. - * @param {boolean} targetState - The new target state. [true=private,false=public] - * @returns {Promise} A promise that resolves to true if the bucket was successfully toggled. - * @example - * // Toggle bucket with label of `toggle-bucket-example` - * await bucketManager.setPrivacy(`toggle-bucket-example`, true); // Enabled - * await bucketManager.setPrivacy(`toggle-bucket-example`, false); // Disabled - */ - - async setPrivacy(name, targetState) { - const command = new PutBucketAclCommand({ - Bucket: name, - ACL: targetState ? "private" : "public-read", - }); - - await this.#client.send(command); - return true; - } - - /** - * @summary Gets the privacy of a given bucket - * @param {string} name - The name of the bucket to query. - * @returns {Promise} A promise that resolves to true if the bucket is private. - */ - async getPrivacy(name) { - const command = new GetBucketAclCommand({ - Bucket: name, - }); - - const response = await this.#client.send(command), - readPermission = response.Grants.find((grant) => { - return grant.Grantee.Type === "Group" && grant.Permission === "READ"; - }); - return !(typeof readPermission !== "undefined"); - } - - /** - * @summary Generates the IPFS Directory/Folder CID for a given bucket - * @param {string} name - The name of the bucket to use. - * @returns {Promise} A promise that resolves with the CID of the new directory/folder - */ - async generateCid(name) { - const command = new PutBucketTaggingCommand({ - Bucket: name, - Tagging: { - TagSet: [ - { - Key: "generateBucketCid", - Value: "true" - } - ] - } - }); - - let cid = false; - command.middlewareStack.add( - (next) => async (args) => { - const response = await next(args); - - // Get cid from headers - cid = response.response.headers["x-amz-meta-cid"]; - return response; - } - ); - - await this.#client.send(command); - return cid; - } -} - -export default BucketManager; diff --git a/src/gatewayManager.js b/src/gatewayManager.js deleted file mode 100644 index b87dd29..0000000 --- a/src/gatewayManager.js +++ /dev/null @@ -1,221 +0,0 @@ -import axios from "axios"; -import { apiErrorHandler } from "./helpers.js"; - -class GatewayManager { - #DEFAULT_ENDPOINT = "https://api.filebase.io"; - #DEFAULT_TIMEOUT = 60000; - - #client; - - /** - * @summary Creates a new instance of the constructor. - * @param {string} clientKey - The access key ID for authentication. - * @param {string} clientSecret - The secret access key for authentication. - * @tutorial quickstart-gateway - * @example - * import { GatewayManager } from "@filebase/sdk"; - * const gatewayManager = new GatewayManager("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD"); - */ - constructor(clientKey, clientSecret) { - const clientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_GW_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT, - encodedToken = Buffer.from(`${clientKey}:${clientSecret}`).toString( - "base64", - ), - baseURL = `${clientEndpoint}/v1/gateways`; - this.#client = axios.create({ - baseURL: baseURL, - timeout: this.#DEFAULT_TIMEOUT, - headers: { Authorization: `Bearer ${encodedToken}` }, - }); - } - - /** - * @typedef {Object} gateway - * @property {string} name Name for the gateway - * @property {string} domain Custom Domain for the gateway - * @property {boolean} enabled Whether the gateway is enabled or not - * @property {string} private Whether the gateway is scoped to users content - * @property {date} created_at Date the gateway was created - * @property {date} updated_at Date the gateway was last updated - */ - - /** - * @typedef {Object} gatewayOptions - * @property {boolean} [domain] Optional Domain to allow for using a Custom Domain - * @property {string} [enabled] Optional Toggle to use for enabling the gateway - * @property {boolean} [private] Optional Boolean determining if gateway is Public or Private - */ - - /** - * @summary Creates a gateway with the given name and options - * @param {string} name Unique name across entire platform for the gateway. Must be a valid subdomain name. - * @param {gatewayOptions} [options] - * @returns {Promise} - A promise that resolves to the value of a gateway. - * @example - * // Create gateway with name of `create-gateway-example` and a custom domain of `cname.mycustomdomain.com`. - * // The custom domain must already exist and have a CNAME record pointed at `create-gateway-example.myfilebase.com`. - * await gatewayManager.create(`create-gateway-example`, { - * domain: `cname.mycustomdomain.com` - * }); - */ - async create(name, options = {}) { - try { - let createOptions = { - name, - }; - if (typeof options.domain === "string") { - createOptions.domain = options.domain; - } - if (typeof options.enabled === "boolean") { - createOptions.enabled = options.enabled; - } - if (typeof options.private === "boolean") { - createOptions.private = options.private; - } - const createResponse = await this.#client.request({ - method: "POST", - data: createOptions, - }); - return createResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Deletes a gateway with the given name. - * @param {string} name - The name of the gateway to delete. - * @returns {Promise} - A promise that resolves to true if the gateway was successfully deleted. - * @example - * // Delete gateway with name of `delete-gateway-example` - * await gatewayManager.delete(`delete-name-example`); - */ - async delete(name) { - try { - await this.#client.request({ - method: "DELETE", - url: `/${name}`, - validateStatus: (status) => { - return status === 204; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Returns the value of a gateway - * @param {string} name - Parameter representing the name to get. - * @returns {Promise} - A promise that resolves to the value of a gateway. - * @example - * // Get gateway with name of `gateway-get-example` - * await gatewayManager.get(`gateway-get-example`); - */ - async get(name) { - try { - const getResponse = await this.#client.request({ - method: "GET", - url: `/${name}`, - validateStatus: (status) => { - return status === 200 || status === 404; - }, - }); - return getResponse.status === 200 ? getResponse.data : false; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Returns a list of gateways - * @returns {Promise>} - A promise that resolves to an array of gateways. - * @example - * // List all gateways - * await gatewayManager.list(); - */ - async list() { - try { - const getResponse = await this.#client.request({ - method: "GET", - }); - return getResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Updates the specified gateway. - * @param {string} name - The name of the gateway to update. - * @param {gatewayOptions} options - The options for the update operation. - * - * @returns {Promise} - A Promise that resolves to true if the gateway was updated. - * @example - * // Update gateway with name of `update-gateway-example` and set the gateway to only serve CIDs pinned by user. - * await gatewayManager.update(`update-gateway-example`, { - * private: true - * }); - */ - async update(name, options) { - try { - const updateOptions = { - name, - }; - if (options?.domain) { - updateOptions.domain = String(options.private); - } - if (options?.enabled) { - updateOptions.enabled = Boolean(options.enabled); - } - if (options?.private) { - updateOptions.private = Boolean(options.private); - } - await this.#client.request({ - method: "PUT", - url: `/${name}`, - data: updateOptions, - validateStatus: (status) => { - return status === 200; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Toggles the enabled state of a given gateway. - * @param {string} name - The name of the gateway to toggle. - * @param {boolean} targetState - The new target state. - * @returns {Promise} A promise that resolves to true if the gateway was successfully toggled. - * @example - * // Toggle gateway with label of `toggle-gateway-example` - * await gatewayManager.toggle(`toggle-gateway-example`, true); // Enabled - * await gatewayManager.toggle(`toggle-gateway-example`, false); // Disabled - */ - async toggle(name, targetState) { - try { - await this.#client.request({ - method: "PUT", - url: `/${name}`, - data: { - enabled: Boolean(targetState), - }, - validateStatus: (status) => { - return status === 200; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } -} - -export default GatewayManager; diff --git a/src/helpers.js b/src/helpers.js deleted file mode 100644 index 9f604b2..0000000 --- a/src/helpers.js +++ /dev/null @@ -1,42 +0,0 @@ -import axios from "axios"; - -const GATEWAY_DEFAULT_TIMEOUT = 60000; - -async function downloadFromGateway(cid, options) { - if (typeof options.endpoint !== "string") { - throw new Error(`Default Gateway must be set`); - } - - const downloadHeaders = {}; - if (options.token) { - downloadHeaders["x-filebase-gateway-token"] = options.token; - } - - const downloadResponse = await axios.request({ - method: "GET", - baseURL: options.endpoint, - url: `/ipfs/${cid}`, - headers: downloadHeaders, - type: "stream", - timeout: options?.timeout || GATEWAY_DEFAULT_TIMEOUT, - }); - return downloadResponse.data; -} - -function apiErrorHandler(err) { - if ( - err?.response && - err?.response?.status && - (err.response.status.toString()[0] === "4" || - err.response.status.toString()[0] === "5") - ) { - throw new Error( - err.response.data.error?.details || - err.response.data.error?.reason || - err, - ); - } - throw err; -} - -export { downloadFromGateway, apiErrorHandler }; diff --git a/src/index.js b/src/index.js index 8687af6..956f352 100644 --- a/src/index.js +++ b/src/index.js @@ -1,13 +1,892 @@ -import BucketManager from "./bucketManager.js"; -import GatewayManager from "./gatewayManager.js"; -import NameManager from "./nameManager.js"; -import ObjectManager from "./objectManager.js"; -import PinManager from "./pinManager.js"; - -export { - BucketManager, - GatewayManager, - NameManager, - ObjectManager, - PinManager, -}; +import axios from "axios"; +import { + CopyObjectCommand, + CreateBucketCommand, + DeleteBucketCommand, + DeleteObjectCommand, + GetBucketTaggingCommand, + GetObjectCommand, + HeadObjectCommand, + ListBucketsCommand, + ListObjectsV2Command, + PutBucketTaggingCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; +import { create, globSource } from "kubo-rpc-client"; +import { unmarshalIPNSRecord } from "ipns"; + +class FilebaseClient { + #DEFAULT_IPFS_ENDPOINT = "https://rpc.filebase.io"; + #DEFAULT_S3_ENDPOINT = "https://s3.filebase.com"; + #DEFAULT_REGION = "us-east-1"; + + #DEFAULT_ENDPOINT = "https://api.filebase.io"; + #DEFAULT_TIMEOUT = 60000; + + #GATEWAY_DEFAULT_TIMEOUT = 60000; + #PUBLIC_IPFS_GATEWAY = "https://ipfs.filebase.io"; + #VALID_FORMATS = ["ipns-record", "raw", "car"]; + + #default_bucket; + #default_gateway = this.#PUBLIC_IPFS_GATEWAY; + + #ipfs_credentials; + #ipfs_client; + #gateways_client; + #names_client; + #s3_client; + + /** + * @typedef {Object} clientOptions + * @property {string} [bucket] The bucket to use for file operations (optional) + */ + + /** + * @summary Creates a new instance of the constructor. + * @param {string} clientKey - The access key ID for authentication. + * @param {string} clientSecret - The secret access key for authentication. + * @param {clientOptions} [options] - Options for the client (optional) + * @tutorial quickstart-bucket + * @example + * import FilebaseClient from "@filebase/sdk"; + * const client = new FilebaseClient("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD"); + */ + constructor(clientKey, clientSecret, options) { + //region S3 Client + const clientEndpoint = + process.env.NODE_ENV === "test" + ? process.env.TEST_S3_ENDPOINT || this.#DEFAULT_S3_ENDPOINT + : this.#DEFAULT_S3_ENDPOINT; + this.#s3_client = new S3Client({ + credentials: { + accessKeyId: clientKey, + secretAccessKey: clientSecret, + }, + endpoint: clientEndpoint, + region: this.#DEFAULT_REGION, + forcePathStyle: true, + }); + //endregion + + //region IPFS Client + const ipfsEndpoint = + process.env.NODE_ENV === "test" + ? process.env.TEST_IPFS_ENDPOINT || this.#DEFAULT_IPFS_ENDPOINT + : this.#DEFAULT_IPFS_ENDPOINT; + this.#ipfs_credentials = `${clientKey}:${clientSecret}`; + let ipfsCredentials = this.#ipfs_credentials; + if (options?.bucket) { + ipfsCredentials = `${ipfsCredentials}:${options.bucket}`; + this.#default_bucket = options.bucket; + } + this.#ipfs_client = create({ + url: ipfsEndpoint, + headers: { + Authorization: `Bearer ${Buffer.from(ipfsCredentials).toString("base64")}`, + }, + }); + //endregion + + //region Gateways Client + const gatewayClientEndpoint = + process.env.NODE_ENV === "test" + ? process.env.TEST_GW_ENDPOINT || + options?.gateway?.endpoint || + this.#DEFAULT_ENDPOINT + : options?.gateway?.endpoint || this.#DEFAULT_ENDPOINT; + this.#gateways_client = axios.create({ + baseURL: `${gatewayClientEndpoint}/v1/gateways`, + timeout: this.#DEFAULT_TIMEOUT, + headers: { + common: { + Authorization: `Bearer ${Buffer.from(this.#ipfs_credentials).toString("base64")}`, + }, + }, + }); + //endregion + + //region Names Client + const namesClientEndpoint = + process.env.NODE_ENV === "test" + ? process.env.TEST_NAME_ENDPOINT || this.#DEFAULT_ENDPOINT + : this.#DEFAULT_ENDPOINT; + this.#names_client = axios.create({ + baseURL: `${namesClientEndpoint}/v1/names`, + timeout: this.#DEFAULT_TIMEOUT, + headers: { + common: { + Authorization: `Bearer ${Buffer.from(this.#ipfs_credentials).toString("base64")}`, + }, + }, + }); + //endregion + } + + //region Utility Methods + #apiErrorHandler(err) { + if ( + err?.response && + err?.response?.status && + (err.response.status.toString()[0] === "4" || + err.response.status.toString()[0] === "5") + ) { + throw new Error( + err.response.data.error?.details || + err.response.data.error?.reason || + err, + ); + } + throw err; + } + + #getIpfsCredentials(bucket) { + let encodedCredentials = this.#ipfs_credentials; + if (bucket) { + encodedCredentials = `${encodedCredentials}:${bucket}`; + } else if (this.#default_bucket) { + encodedCredentials = `${encodedCredentials}:${this.#default_bucket}`; + } else { + throw new Error("Bucket must be set"); + } + return Buffer.from(encodedCredentials).toString("base64"); + } + //endregion + + //region Bucket Methods + /** + * @typedef {Object} bucket + * @property {string} Name The name of the bucket + * @property {date} Date the bucket was created + */ + + /** + * @summary Creates a new bucket with the specified name. + * @param {string} name - The name of the bucket to create. + * @returns {Promise} - A promise that resolves when the bucket is created. + * @example + * // Create bucket with name of `create-bucket-example` + * await client.createBucket(`create-bucket-example`); + */ + async createBucket(name) { + const command = new CreateBucketCommand({ + Bucket: name, + }); + + return await this.#s3_client.send(command); + } + + /** + * @summary Lists the buckets in the client. + * @returns {Promise>} - A promise that resolves with an array of objects representing the buckets in the client. + * @example + * // List all buckets + * await client.listBuckets(); + */ + async listBuckets() { + const command = new ListBucketsCommand({}), + { Buckets } = await this.#s3_client.send(command); + + return Buckets; + } + + /** + * @summary Deletes the specified bucket. + * @param {string} name - The name of the bucket to delete. + * @returns {Promise} - A promise that resolves when the bucket is deleted. + * @example + * // Delete bucket with name of `bucket-name-to-delete` + * await client.deleteBucket(`bucket-name-to-delete`); + */ + async deleteBucket(name) { + const command = new DeleteBucketCommand({ + Bucket: name, + }); + + await this.#s3_client.send(command); + return true; + } + + /** + * @summary Generates the IPFS Directory/Folder CID for a given bucket + * @param {string} name - The name of the bucket to use. + * @returns {Promise} A promise that resolves with the CID of the new directory/folder + */ + async generateBucketCid(name) { + const command = new PutBucketTaggingCommand({ + Bucket: name, + Tagging: { + TagSet: [ + { + Key: "generateBucketCid", + Value: "true", + }, + ], + }, + }); + + let cid = false; + command.middlewareStack.add((next) => async (args) => { + const response = await next(args); + + // Get cid from headers + cid = response.response.headers["x-amz-meta-cid"]; + return response; + }); + + await this.#s3_client.send(command); + return cid; + } + + async getBucketCid(name) { + const getCidCommand = new GetBucketTaggingCommand({ + Bucket: name, + }); + const getCidResponse = await this.#s3_client.send(getCidCommand); + if ( + typeof getCidResponse !== "undefined" && + getCidResponse.TagSet !== "undefined" + ) { + const resolvedTag = getCidResponse.TagSet.find((element) => { + return element.Key === "CID"; + }); + if (typeof resolvedTag !== "undefined" && resolvedTag.Value !== "") { + return resolvedTag.Value; + } + } + throw new Error(`Failed to Fetch CID for Bucket`); + } + //endregion + + //region File Methods + async uploadDirectory(path, sourceDirectory, options = {}) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + const importOptions = {}; + if (options?.includeHiddenFiles === true) { + importOptions["hidden"] = true; + delete options["includeHiddenFiles"]; + } + const uploadResults = []; + for await (const uploadResult of this.#ipfs_client.addAll( + globSource(path, "*", importOptions), + options, + )) { + uploadResults.push(uploadResult); + } + return uploadResults; + } + + async uploadFile(path, content, options = {}) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers = options.headers || {}; + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + options.searchParams = options.searchParams || {}; + options.searchParams["preserve-filenames"] = "true"; + return await this.#ipfs_client.add( + { + path, + content, + }, + options, + ); + } + + async uploadFiles(fileStream, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + const uploadResults = []; + for await (const uploadResult of this.#ipfs_client.addAll( + fileStream, + options, + )) { + uploadResults.push(uploadResult); + } + return uploadResults; + } + + pinFile(ipfsPath, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + return this.#ipfs_client.pin.add(ipfsPath, options); + } + + pinFiles(source, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + return this.#ipfs_client.pin.addAll(source, options); + } + + async downloadFile(path, options) { + const command = new GetObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: path, + }), + response = await this.#s3_client.send(command); + + return response.Body; + } + + async deleteFile(path, options) { + const command = new DeleteObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: path, + }); + + await this.#s3_client.send(command); + return true; + } + + async copyFile(from, to, options) { + const copySource = `${ + options?.sourceBucket || this.#default_bucket + }/${from}`, + command = new CopyObjectCommand({ + CopySource: copySource, + Bucket: options?.destinationBucket || this.#default_bucket, + Key: to, + }); + + await this.#s3_client.send(command); + return true; + } + + /** + * @typedef {Object} listFilesResult + * @property {Array} entries List of Files stored in the Bucket + * @property {string} entries.cid CID of the Object + * @property {string} entries.name Name of the Object + * @property {number} entries.size Size in Bytes of the Object + * @property {string} entries.lastModified Date Last Modified of the Object + * @property {function} [nextPage] Convenience function to get the next page of files + */ + + /** + * @typedef {Object} listObjectOptions + * @property {string} [Bucket] The name of the bucket. If not provided, the default bucket will be used. + * @property {string|null} [ContinuationToken=null] Continues listing from this objects name. + * @property {string|null} [Delimiter=null] Character used to group keys + * @property {number} [MaxKeys=1000] The maximum number of objects to retrieve. Defaults to 1000. + */ + + /** + * Retrieves a list of files from a specified bucket. + * + * @param {string} prefix - The prefix to filter the files list with. + * @param {listObjectOptions} [options] - The options for listing files. + * @returns {Promise} - A promise that resolves to an array of files. + * @example + * // List files in bucket with a limit of 1000 + * await filebaseClient.listFiles('my-favorites-folder', { + * MaxKeys: 1000 + * }); + */ + async listFiles( + prefix = undefined, + options = { + Bucket: this.#default_bucket, + ContinuationToken: null, + Delimiter: null, + MaxKeys: 1000, + }, + ) { + const listOptions = { + ...options, + Prefix: prefix, + }; + if (listOptions?.MaxKeys && listOptions.MaxKeys > 100000) { + throw new Error(`MaxKeys Maximum value is 100000`); + } + const bucket = listOptions?.Bucket || this.#default_bucket, + limit = listOptions?.MaxKeys || 1000, + commandOptions = { + Bucket: bucket, + MaxKeys: limit, + }, + command = new ListObjectsV2Command({ + ...listOptions, + ...commandOptions, + }); + + const { Contents, IsTruncated, NextContinuationToken } = + await this.#s3_client.send(command); + const listResponse = { + entries: Contents.map((item) => { + return { + cid: item.CID, + name: item.Key, + size: item.Size, + lastModified: item.LastModified, + }; + }), + }; + if (IsTruncated) { + listResponse["nextPage"] = this.listFiles(prefix, { + ...options, + ContinuationToken: NextContinuationToken, + }); + } + return listResponse; + } + + /** + * @typedef {Object} objectOptions + * @property {string} [bucket] - The bucket to pin the IPFS CID into. + */ + + /** + * @typedef {Object} objectHeadResult + * @property {string} cid The CID of the uploaded object + * @property {array} [entries] If a directory then returns an array of the containing objects + * @property {string} entries.cid The CID of the uploaded object + * @property {string} entries.path The path of the object + */ + + /** + * @summary Gets an objects info and metadata using the S3 API. + * @param {string} path - The key of the object to be inspected. + * @param {objectOptions} [options] - The options for inspecting the object. + * @returns {Promise} + */ + async getFileMetadata(path, options) { + try { + const command = new HeadObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: path, + }); + return await this.#s3_client.send(command); + } catch (err) { + if (err.name === "NotFound") { + return false; + } + throw err; + } + } + + async generatePresignedUrl(objectKey, expiresInSeconds = 3600, options) { + const command = new GetObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: objectKey, + }); + + try { + return await getSignedUrl(this.#s3_client, command, { + expiresIn: expiresInSeconds, // URL valid for 1 hour by default + }); + } catch (error) { + console.error("Error generating presigned download URL:", error); + throw error; + } + } + //endregion + + //region IPNS Name Methods + /** + * @typedef {Object} name + * @property {string} label Descriptive label for the Key + * @property {string} network_key IPNS Key CID + * @property {string} cid Value that name Publishes + * @property {number} sequence Version Number for the name + * @property {boolean} enabled Whether the name is being Published or not + * @property {date} published_at Date the name was last published to the DHT + * @property {date} created_at Date the name was created + * @property {date} updated_at Date the name was last updated + */ + + /** + * @typedef {Object} nameOptions + * @property {boolean} [enabled] Whether the name is enabled or not. + */ + + /** + * @summary Creates a new IPNS name with the given name as the label and CID. + * @param {string} label - The label of the new IPNS name. + * @param {string} cid - The CID of the IPNS name. + * @param {nameOptions} [options] - Additional options for the IPNS name. + * @returns {Promise} - A Promise that resolves with the response JSON. + * @example + * // Create IPNS name with label of `create-name-example` and CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` + * await client.createIpnsName(`create-name-example`, `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm`); + */ + async createIpnsName( + label, + cid, + options = { + enabled: true, + }, + ) { + try { + const createResponse = await this.#names_client.request({ + method: "POST", + data: { + label, + cid, + enabled: options?.enabled !== false, + }, + }); + return createResponse.data; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Returns the value of an IPNS name + * @param {string} label - Parameter representing the label of the name to resolve. + * @returns {Promise} - A promise that resolves to the value of a name. + * @example + * // Get IPNS name with label of `list-name-example` + * await nameManager.get(`list-name-example`); + */ + async getIpnsName(label) { + try { + const getResponse = await this.#names_client.request({ + method: "GET", + url: `/${label}`, + validateStatus: (status) => { + return status === 200 || status === 404; + }, + }); + return getResponse.status === 200 ? getResponse.data : false; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Imports a user's IPNS private key. + * @param {string} label - The label for the IPNS name. + * @param {string} cid - The CID (Content Identifier) of the data. + * @param {string} privateKey - The existing private key encoded in Base64. + * @param {nameOptions} [options] - Additional options for the IPNS name. + * @returns {Promise} - A Promise that resolves to the server response. + * @example + * // Import IPNS private key with label of `create-name-example`, CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` + * // and a private key encoded with base64 + * await client.importIpnsName( + * `create-name-example`, + * `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` + * `BASE64_ENCODED_PRIVATEKEY` + * ); + */ + async importIpnsName( + label, + cid, + privateKey, + options = { + enabled: true, + }, + ) { + try { + const importResponse = await this.#names_client.request({ + method: "POST", + data: { + label, + cid, + network_private_key: privateKey, + enabled: options?.enabled !== false, + }, + }); + return importResponse.data; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Updates the specified name with the given CID. + * @param {string} label - The label of the name to update. + * @param {string} cid - The cid to associate with the name. + * @param {nameOptions} options - The options for the set operation. + * + * @returns {Promise} - A Promise that resolves to true if the IPNS name was updated. + * @example + * // Update name with label of `update-name-example` and set the value of the IPNS name. + * await client.updateIpnsName(`update-name-example`, `bafybeidt4nmaci476lyon2mvgfmwyzysdazienhxs2bqnfpdainzjuwjom`); + */ + async updateIpnsName(label, cid, options = {}) { + try { + const updateOptions = { + cid, + }; + if (options?.enabled) { + updateOptions.enabled = Boolean(options.enabled); + } + await this.#names_client.request({ + method: "PUT", + url: `/${label}`, + data: updateOptions, + validateStatus: (status) => { + return status === 200; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + async resolveIpnsName(value) { + try { + const resolvedIpnsName = await this.#fetchIpnsRecord(value); + const buf = Buffer.from(resolvedIpnsName); + const body = new Uint8Array(buf, 0, buf.byteLength); + const ipnsRecord = unmarshalIPNSRecord(body); + return ipnsRecord.value; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Returns a list of IPNS names + * @returns {Promise>} - A promise that resolves to an array of names. + * @example + * // List all IPNS names + * await client.listIpnsNames(); + */ + async listIpnsNames() { + try { + const listResponse = await this.#names_client.request({ + method: "GET", + }); + return listResponse.data; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Deletes an IPNS name with the given label. + * @param {string} label - The label of the IPNS name to delete. + * @returns {Promise} - A promise that resolves to true if the IPNS name was successfully deleted. + * @example + * // List IPNS name with label of `delete-name-example` + * await client.deleteIpnsName(`delete-name-example`); + */ + async deleteIpnsName(label) { + try { + await this.#names_client.request({ + method: "DELETE", + url: `/${label}`, + validateStatus: (status) => { + return status === 204; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + //endregion + + //region Gateway Methods + /** + * @typedef {Object} gateway + * @property {string} name Name for the gateway + * @property {string} domain Custom Domain for the gateway + * @property {boolean} enabled Whether the gateway is enabled or not + * @property {string} private Whether the gateway is scoped to users content + * @property {date} created_at Date the gateway was created + * @property {date} updated_at Date the gateway was last updated + */ + + /** + * @typedef {Object} gatewayOptions + * @property {boolean} [domain] Optional Domain to allow for using a Custom Domain + * @property {string} [enabled] Optional Toggle to use for enabling the gateway + * @property {boolean} [private] Optional Boolean determining if gateway is Public or Private + */ + + /** + * @summary Creates a gateway with the given name and options + * @param {string} name Unique name across entire platform for the gateway. Must be a valid subdomain name. + * @param {gatewayOptions} [options] + * @returns {Promise} - A promise that resolves to the value of a gateway. + * @example + * // Create gateway with name of `create-gateway-example` and a custom domain of `cname.mycustomdomain.com`. + * // The custom domain must already exist and have a CNAME record pointed at `create-gateway-example.myfilebase.com`. + * await client.createGateway(`create-gateway-example`, { + * domain: `cname.mycustomdomain.com` + * }); + */ + async createGateway(name, options = {}) { + try { + let createOptions = { + name, + }; + if (typeof options.domain === "string") { + createOptions.domain = options.domain; + } + if (typeof options.enabled === "boolean") { + createOptions.enabled = options.enabled; + } + if (typeof options.private === "boolean") { + createOptions.private = options.private; + } + const createResponse = await this.#gateways_client.request({ + method: "POST", + data: createOptions, + }); + return createResponse.data; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Returns the value of a gateway + * @param {string} name - Parameter representing the name to get. + * @returns {Promise} - A promise that resolves to the value of a gateway. + * @example + * // Get gateway with name of `gateway-get-example` + * await client.getGateway(`gateway-get-example`); + */ + async getGateway(name) { + try { + const getResponse = await this.#gateways_client.request({ + method: "GET", + url: `/${name}`, + validateStatus: (status) => { + return status === 200 || status === 404; + }, + }); + return getResponse.status === 200 ? getResponse.data : false; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Returns a list of gateways + * @returns {Promise>} - A promise that resolves to an array of gateways. + * @example + * // List all gateways + * await client.listGateways(); + */ + async listGateways() { + try { + const getResponse = await this.#gateways_client.request({ + method: "GET", + }); + return getResponse.data; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Deletes a gateway with the given name. + * @param {string} name - The name of the gateway to delete. + * @returns {Promise} - A promise that resolves to true if the gateway was successfully deleted. + * @example + * // Delete gateway with name of `delete-gateway-example` + * await client.deleteGateway(`delete-name-example`); + */ + async deleteGateway(name) { + try { + await this.#gateways_client.request({ + method: "DELETE", + url: `/${name}`, + validateStatus: (status) => { + return status === 204; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + + /** + * @summary Updates the specified gateway. + * @param {string} name - The name of the gateway to update. + * @param {gatewayOptions} options - The options for the update operation. + * + * @returns {Promise} - A Promise that resolves to true if the gateway was updated. + * @example + * // Update gateway with name of `update-gateway-example` and set the gateway to only serve CIDs pinned by user. + * await client.updateGateway(`update-gateway-example`, { + * private: true + * }); + */ + async updateGateway(name, options) { + try { + const updateOptions = { + name, + }; + if (options?.domain) { + updateOptions.domain = String(options.private); + } + if (options?.enabled) { + updateOptions.enabled = Boolean(options.enabled); + } + if (options?.private) { + updateOptions.private = Boolean(options.private); + } + await this.#gateways_client.request({ + method: "PUT", + url: `/${name}`, + data: updateOptions, + validateStatus: (status) => { + return status === 200; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + //endregion + + //region Content Fetch Methods + async fetchContentByCid(cid, options = {}) { + return this.#fetchContentFromGateway(cid, "ipfs", options); + } + + async fetchContentByIpnsName(cid, options = {}) { + return this.#fetchContentFromGateway(cid, "ipns", options); + } + + async #fetchIpnsRecord(cid) { + return this.#fetchContentFromGateway(cid, "ipns", { + format: "ipns-record", + }); + } + + async #fetchContentFromGateway(cid, resolver, options) { + const selectedEndpoint = options?.endpoint || this.#default_gateway; + if (typeof selectedEndpoint !== "string") { + throw new Error( + "A valid gateway endpoint must be configured or provided.", + ); + } + + const downloadHeaders = {}; + if (options.token) { + downloadHeaders["x-filebase-gateway-token"] = options.token; + } + + if (options.format) { + if (this.#VALID_FORMATS.includes(options.format)) { + downloadHeaders["Accept"] = + `application/vnd.ipfs.${options.format.toLowerCase()}`; + } else { + throw new Error(`Invalid Format [${options.format}]`); + } + } + + const downloadResponse = await axios.request({ + method: "GET", + baseURL: selectedEndpoint, + url: `/${resolver}/${cid}`, + headers: downloadHeaders, + responseType: "arraybuffer", + timeout: options?.timeout || this.#GATEWAY_DEFAULT_TIMEOUT, + }); + return downloadResponse.data; + } + //endregion +} + +export default FilebaseClient; \ No newline at end of file diff --git a/src/nameManager.js b/src/nameManager.js deleted file mode 100644 index 54a02df..0000000 --- a/src/nameManager.js +++ /dev/null @@ -1,251 +0,0 @@ -import axios from "axios"; -import { apiErrorHandler } from "./helpers.js"; - -/** Provides methods for managing names in an REST endpoint. */ -class NameManager { - #DEFAULT_ENDPOINT = "https://api.filebase.io"; - #DEFAULT_TIMEOUT = 60000; - - #client; - - /** - * @summary Creates a new instance of the constructor. - * @param {string} clientKey - The access key ID for authentication. - * @param {string} clientSecret - The secret access key for authentication. - * @tutorial quickstart-name - * @example - * import { NameManager } from "@filebase/sdk"; - * const nameManager = new NameManager("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD"); - */ - constructor(clientKey, clientSecret) { - const clientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_NAME_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT, - encodedToken = Buffer.from(`${clientKey}:${clientSecret}`).toString( - "base64", - ), - baseURL = `${clientEndpoint}/v1/names`; - this.#client = axios.create({ - baseURL: baseURL, - timeout: this.#DEFAULT_TIMEOUT, - headers: { Authorization: `Bearer ${encodedToken}` }, - }); - } - - /** - * @typedef {Object} name - * @property {string} label Descriptive label for the Key - * @property {string} network_key IPNS Key CID - * @property {string} cid Value that name Publishes - * @property {number} sequence Version Number for the name - * @property {boolean} enabled Whether the name is being Published or not - * @property {date} published_at Date the name was last published to the DHT - * @property {date} created_at Date the name was created - * @property {date} updated_at Date the name was last updated - */ - - /** - * @typedef {Object} nameOptions - * @property {boolean} [enabled] Whether the name is enabled or not. - */ - - /** - * @summary Creates a new IPNS name with the given name as the label and CID. - * @param {string} label - The label of the new IPNS name. - * @param {string} cid - The CID of the IPNS name. - * @param {nameOptions} [options] - Additional options for the IPNS name. - * @returns {Promise} - A Promise that resolves with the response JSON. - * @example - * // Create IPNS name with label of `create-name-example` and CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` - * await nameManager.create(`create-name-example`, `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm`); - */ - async create( - label, - cid, - options = { - enabled: true, - }, - ) { - try { - const createResponse = await this.#client.request({ - method: "POST", - data: { - label, - cid, - enabled: options?.enabled !== false, - }, - }); - return createResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Imports a user's IPNS private key. - * @param {string} label - The label for the IPNS name. - * @param {string} cid - The CID (Content Identifier) of the data. - * @param {string} privateKey - The existing private key encoded in Base64. - * @param {nameOptions} [options] - Additional options for the IPNS name. - * @returns {Promise} - A Promise that resolves to the server response. - * @example - * // Import IPNS private key with label of `create-name-example`, CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` - * // and a private key encoded with base64 - * await nameManager.import( - * `create-name-example`, - * `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` - * `BASE64_ENCODED_PRIVATEKEY` - * ); - */ - async import( - label, - cid, - privateKey, - options = { - enabled: true, - }, - ) { - try { - const importResponse = await this.#client.request({ - method: "POST", - data: { - label, - cid, - network_private_key: privateKey, - enabled: options?.enabled !== false, - }, - }); - return importResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Updates the specified name with the given CID. - * @param {string} label - The label of the name to update. - * @param {string} cid - The cid to associate with the name. - * @param {nameOptions} options - The options for the set operation. - * - * @returns {Promise} - A Promise that resolves to true if the IPNS name was updated. - * @example - * // Update name with label of `update-name-example` and set the value of the IPNS name. - * await nameManager.update(`update-name-example`, `bafybeidt4nmaci476lyon2mvgfmwyzysdazienhxs2bqnfpdainzjuwjom`); - */ - async update(label, cid, options = {}) { - try { - const updateOptions = { - cid, - }; - if (options?.enabled) { - updateOptions.enabled = Boolean(options.enabled); - } - await this.#client.request({ - method: "PUT", - url: `/${label}`, - data: updateOptions, - validateStatus: (status) => { - return status === 200; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Returns the value of an IPNS name - * @param {string} label - Parameter representing the label of the name to resolve. - * @returns {Promise} - A promise that resolves to the value of a name. - * @example - * // Get IPNS name with label of `list-name-example` - * await nameManager.get(`list-name-example`); - */ - async get(label) { - try { - const getResponse = await this.#client.request({ - method: "GET", - url: `/${label}`, - validateStatus: (status) => { - return status === 200 || status === 404; - }, - }); - return getResponse.status === 200 ? getResponse.data : false; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Returns a list of IPNS names - * @returns {Promise>} - A promise that resolves to an array of names. - * @example - * // List all IPNS names - * await nameManager.list(); - */ - async list() { - try { - const listResponse = await this.#client.request({ - method: "GET", - }); - return listResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Deletes an IPNS name with the given label. - * @param {string} label - The label of the IPNS name to delete. - * @returns {Promise} - A promise that resolves to true if the IPNS name was successfully deleted. - * @example - * // List IPNS name with label of `delete-name-example` - * await nameManager.delete(`delete-name-example`); - */ - async delete(label) { - try { - await this.#client.request({ - method: "DELETE", - url: `/${label}`, - validateStatus: (status) => { - return status === 204; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Toggles the enabled state of a given IPNS name. - * @param {string} label - The label of the IPNS name to toggle. - * @param {boolean} targetState - The new target state. - * @returns {Promise} A promise that resolves to true if the IPNS name was successfully toggled. - * @example - * // Toggle IPNS name with label of `toggle-name-example` - * await nameManager.toggle(`toggle-name-example`, true); // Enabled - * await nameManager.toggle(`toggle-name-example`, false); // Disabled - */ - async toggle(label, targetState) { - try { - await this.#client.request({ - method: "PUT", - url: `/${label}`, - data: { - enabled: targetState, - }, - validateStatus: (status) => { - return status === 200; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } -} - -export default NameManager; diff --git a/src/objectManager.js b/src/objectManager.js deleted file mode 100644 index b53eea1..0000000 --- a/src/objectManager.js +++ /dev/null @@ -1,603 +0,0 @@ -// Environment Imports -import logger from "./logger.js"; -// S3 Imports -import { - CopyObjectCommand, - DeleteObjectCommand, - GetObjectCommand, - HeadObjectCommand, - ListObjectsV2Command, - S3Client, -} from "@aws-sdk/client-s3"; -import { Upload } from "@aws-sdk/lib-storage"; -// Helia Imports -import { CarWriter } from "@ipld/car"; -import { car } from "@helia/car"; -import { mfs } from "@helia/mfs"; -import { unixfs } from "@helia/unixfs"; -import { MemoryBlockstore } from "blockstore-core"; -import { MemoryDatastore } from "datastore-core"; -// Utility Imports -import { v4 as uuidv4 } from "uuid"; -import { downloadFromGateway } from "./helpers.js"; -import PQueue from "p-queue"; - -/** Interacts with an S3 client to perform various operations on objects in a bucket. */ -class ObjectManager { - #DEFAULT_ENDPOINT = "https://s3.filebase.com"; - #DEFAULT_REGION = "us-east-1"; - #DEFAULT_MAX_CONCURRENT_UPLOADS = 4; - - #client; - #credentials; - #defaultBucket; - #gatewayConfiguration; - #maxConcurrentUploads; - - /** - * @typedef {Object} objectManagerOptions Optional settings for the constructor. - * @property {string} [bucket] Default bucket to use. - * @property {objectDownloadOptions} [gateway] Default gateway to use. - * @property {number} [maxConcurrentUploads] The maximum number of concurrent uploads. - */ - - /** - * @typedef {Object} objectDownloadOptions Optional settings for downloading objects - * @property {string} endpoint Default gateway to use. - * @property {string} [token] Token for the default gateway. - * @property {number} [timeout=60000] Timeout for the default gateway - */ - - /** - * @summary Creates a new instance of the constructor. - * @param {string} clientKey - The access key ID for authentication. - * @param {string} clientSecret - The secret access key for authentication. - * @param {objectManagerOptions} options - Optional settings for the constructor. - * @tutorial quickstart-object - * @example - * import { ObjectManager } from "@filebase/sdk"; - * const objectManager = new ObjectManager("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD", { - * bucket: "my-default-bucket", - * maxConcurrentUploads: 4, - * gateway: { - * endpoint: "https://my-default-gateway.mydomain.com - * token: SUPER_SECRET_GATEWAY_TOKEN - * } - * }); - */ - constructor(clientKey, clientSecret, options) { - const clientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_S3_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT, - clientConfiguration = { - credentials: { - accessKeyId: clientKey, - secretAccessKey: clientSecret, - }, - endpoint: clientEndpoint, - region: this.#DEFAULT_REGION, - forcePathStyle: true, - }; - this.#defaultBucket = options?.bucket; - this.#maxConcurrentUploads = - options?.maxConcurrentUploads || this.#DEFAULT_MAX_CONCURRENT_UPLOADS; - this.#credentials = { - key: clientKey, - secret: clientSecret, - }; - this.#client = new S3Client(clientConfiguration); - - this.#gatewayConfiguration = { - endpoint: options?.gateway?.endpoint, - token: options?.gateway?.token, - timeout: options?.gateway?.timeout, - }; - } - - /** - * @typedef {Object} objectOptions - * @property {string} [bucket] - The bucket to pin the IPFS CID into. - */ - - /** - * @typedef {Object} objectHeadResult - * @property {string} cid The CID of the uploaded object - * @property {function} download Convenience function to download the object via S3 or the selected gateway - * @property {array} [entries] If a directory then returns an array of the containing objects - * @property {string} entries.cid The CID of the uploaded object - * @property {string} entries.path The path of the object - */ - - /** - * If the source parameter is an array of objects, it will pack multiple files into a CAR file for upload. - * The method returns a Promise that resolves to an object containing the CID (Content Identifier) of the uploaded file - * and an optional entries object when uploading a CAR file. - * - * @summary Uploads a file or a CAR file to the specified bucket. - * @param {string} key - The key or path of the file in the bucket. - * @param {Buffer|ReadableStream|Array} source - The content of the object to be uploaded. - * If an array of files is provided, each file should have a 'path' property specifying the path of the file - * and a 'content' property specifying the content of the file. The SDK will then construct a CAR file locally - * and use that as the content of the object to be uploaded. - * @param {Object} [metadata] Optional metadata for pin object - * @param {objectOptions} [options] - The options for uploading the object. - * @returns {Promise} - * @example - * // Upload Object - * await objectManager.upload("my-object", Buffer.from("Hello World!")); - * // Upload Object with Metadata - * await objectManager.upload("my-custom-object", Buffer.from("Hello Big World!"), { - * "application": "my-filebase-app" - * }); - * // Upload Directory - * await objectManager.upload("my-first-directory", [ - * { - * path: "/testObjects/1.txt", // Virtual Path to store contents at within IPFS Folder/Directory - * content: Buffer.from("upload test object", "utf-8"), - * }, - * { - * path: "/testObjects/deep/1.txt", - * content: Buffer.from("upload deep test object", "utf-8"), - * }, - * { - * path: "/topLevel.txt", - * content: Buffer.from("upload top level test object", "utf-8"), - * }, - * ]); - */ - async upload(key, source, metadata, options) { - // Generate Upload UUID - const uploadUUID = uuidv4(); - const uploadLogger = logger.child({ uploadUUID }); - - // Setup Upload Options - const bucket = options?.bucket || this.#defaultBucket, - uploadOptions = { - client: this.#client, - params: { - Bucket: bucket, - Key: key, - Body: source, - Metadata: metadata || {}, - }, - queueSize: this.#maxConcurrentUploads, - partSize: 26843546, //25.6Mb || 250Gb Max File Size - }; - - // Pack Multiple Files into CAR file for upload - let parsedEntries = {}; - if (Array.isArray(source)) { - // Mark Upload as a CAR file import - uploadOptions.params.Metadata = { - ...uploadOptions.params.Metadata, - import: "car", - }; - source.sort((a, b) => { - return countSlashes(b.path) - countSlashes(a.path); - }); - - let temporaryCarFilePath, temporaryBlockstoreDir; - try { - // Setup Blockstore - let temporaryBlockstore = new MemoryBlockstore(), - temporaryDatastore = new MemoryDatastore(); - if (isNode()) { - const { mkdir } = await import("node:fs/promises"); - const { FsBlockstore } = await import("blockstore-fs"); - const os = await import("node:os"); - const path = await import("node:path"); - temporaryBlockstoreDir = path.resolve( - os.tmpdir(), - "filebase-sdk", - "uploads", - uploadUUID, - ); - temporaryCarFilePath = `${temporaryBlockstoreDir}/main.car`; - await mkdir(temporaryBlockstoreDir, { recursive: true }); - temporaryBlockstore = new FsBlockstore(temporaryBlockstoreDir); - } - let createdFiles = new Map(); - const heliaFs = unixfs({ - blockstore: temporaryBlockstore, - }); - uploadLogger.verbose("UNIXFS_ADD", { - count: source.length, - }); - let createFilePromises = []; - const queue = new PQueue({ concurrency: 50 }); - for (let entry of source) { - entry.path = entry.path.startsWith("/") ? entry.path : `/${entry.path}`; - if (entry.content === null) { - continue; - } - const task = (async () => { - await queue.add(async () => { - uploadLogger.silly("SOURCE_IMPORT_STARTED", { - path: entry.path, - size: queue.size, - }); - - if (isNode()) { - const { Readable } = await import("node:stream"); - let createdFile; - if ( - (entry.type === "import" && entry.content !== null) || - entry.content instanceof Readable - ) { - let filehandle; - try { - if (entry.type === "import") { - const { open } = await import("node:fs/promises"); - const path = await import("node:path"); - filehandle = await open(path.resolve(entry.content), "r"); - entry.content = filehandle.createReadStream(); - } - createdFile = await heliaFs.addByteStream(entry.content); - } catch (err) { - if (typeof filehandle !== "undefined") { - await filehandle.close(); - } - throw err; - } - if (typeof filehandle !== "undefined") { - await filehandle.close(); - } - } else if (entry.content !== null) { - createdFile = await heliaFs.addBytes(entry.content); - } else { - return; - } - createdFiles.set(entry.path, createdFile); - uploadLogger.verbose("SOURCE_IMPORT_COMPLETED", { - path: entry.path, - size: queue.size, - }); - } else { - let createdFile; - if (entry.type === "import" && entry.content !== null) { - createdFile = await heliaFs.addByteStream(entry.content); - } else if (entry.content !== null) { - createdFile = await heliaFs.addBytes(entry.content); - } else { - return; - } - createdFiles.set(entry.path, createdFile); - uploadLogger.verbose("SOURCE_IMPORT_COMPLETED", { - path: entry.path, - size: queue.size, - }); - } - }); - })(); - if (queue.size > 150) { - await queue.onSizeLessThan(100); - } - createFilePromises.push(task); - uploadLogger.verbose("SOURCE_IMPORT_QUEUED", { - path: entry.path, - size: queue.size, - }); - } - await Promise.all(createFilePromises); - uploadLogger.verbose("UNIXFS_ADDED", { - count: createdFiles.size, - }); - - const heliaMfs = mfs({ - blockstore: temporaryBlockstore, - datastore: temporaryDatastore, - }); - uploadLogger.verbose("MFS_ADDING", { - count: source.length, - output: temporaryCarFilePath, - }); - for (const entry of source) { - if (entry.content === null) { - uploadLogger.silly("MFS_DIR_CREATING", { - path: entry.path, - }); - await heliaMfs.mkdir(entry.path); - uploadLogger.verbose("MFS_DIR_CREATED", { - path: entry.path, - }); - } else { - const entryFile = createdFiles.get(entry.path); - uploadLogger.silly("MFS_FILE_COPY", { - cid: entryFile, - path: entry.path, - }); - await heliaMfs.cp(entryFile, entry.path, { - force: true, - }); - uploadLogger.verbose("MFS_FILE_COPIED", { - cid: entryFile, - path: entry.path, - }); - } - } - for (const entry of source) { - parsedEntries[entry.path] = await heliaMfs.stat(entry.path); - uploadLogger.silly("MFS_PATH_STAT", parsedEntries[entry.path]); - } - parsedEntries["/"] = await heliaMfs.stat("/"); - const rootEntry = parsedEntries["/"]; - uploadLogger.verbose("MFS_ADDED", { - root: rootEntry, - count: Object.keys(parsedEntries).length, - }); - - // Get carFile stream here - uploadLogger.verbose("CAR_EXPORTING", { - root: rootEntry, - }); - const carExporter = car({ blockstore: temporaryBlockstore }), - { writer, out } = CarWriter.create([rootEntry.cid]); - - if (isNode()) { - const { createReadStream, createWriteStream } = await import( - "node:fs" - ); - const { Readable } = await import("node:stream"); - // Put carFile stream to disk - const output = createWriteStream(temporaryCarFilePath); - Readable.from(out).pipe(output); - await carExporter.export(rootEntry.cid, writer); - uploadLogger.verbose("CAR_EXPORTED", { - root: rootEntry, - }); - - // Set Uploader to Read from carFile on disk - uploadOptions.params.Body = createReadStream(temporaryCarFilePath); - } - - // Upload carFile via S3 - uploadLogger.verbose("CAR_UPLOADING", { - entry: rootEntry, - source: temporaryCarFilePath, - }); - const parallelUploads3 = new Upload(uploadOptions); - parallelUploads3.on("httpUploadProgress", (progress) => { - uploadLogger.debug("CAR_UPLOAD_PROGRESS", progress); - }); - await parallelUploads3.done(); - uploadLogger.verbose("CAR_UPLOADED", { - entry: rootEntry, - source: temporaryCarFilePath, - }); - await temporaryBlockstore.close(); - } catch (err) { - console.error(err.message); - throw err; - } finally { - if (typeof temporaryBlockstoreDir !== "undefined" && isNode()) { - const { rm } = await import("node:fs/promises"); - // Delete Temporary Blockstore - await rm(temporaryBlockstoreDir, { recursive: true, force: true }); - } - } - } else { - // Upload file via S3 - const parallelUploads3 = new Upload(uploadOptions); - await parallelUploads3.done(); - } - - // Get CID from Platform - const command = new HeadObjectCommand({ - Bucket: bucket, - Key: key, - Body: source, - }), - headResult = await this.#client.send(command), - responseCid = headResult.Metadata.cid; - - if (Object.keys(parsedEntries).length === 0) { - return { - cid: responseCid, - download: () => { - return this.#routeDownload(responseCid, key, options); - }, - }; - } - return { - cid: responseCid, - download: () => { - return this.#routeDownload(responseCid, key, options); - }, - entries: parsedEntries, - }; - } - - async #routeDownload(cid, key, options) { - return typeof this.#gatewayConfiguration.endpoint !== "undefined" - ? downloadFromGateway(cid, this.#gatewayConfiguration) - : this.download(key, options); - } - - /** - * @summary Gets an objects info and metadata using the S3 API. - * @param {string} key - The key of the object to be inspected. - * @param {objectOptions} [options] - The options for inspecting the object. - * @returns {Promise} - */ - async get(key, options) { - const bucket = options?.bucket || this.#defaultBucket; - try { - const command = new HeadObjectCommand({ - Bucket: bucket, - Key: key, - }), - response = await this.#client.send(command); - - response.download = () => { - return this.#routeDownload(response.Metadata.cid, key, options); - }; - - return response; - } catch (err) { - if (err.name === "NotFound") { - return false; - } - throw err; - } - } - - /** - * @summary Downloads an object from the specified bucket using the provided key. - * @param {string} key - The key of the object to be downloaded. - * @param {objectOptions} [options] - The options for downloading the object. - * @returns {Promise} - A promise that resolves with the contents of the downloaded object as a Stream. - * @example - * // Download object with name of `download-object-example` - * await objectManager.download(`download-object-example`); - */ - async download(key, options) { - // Download via IPFS Gateway if Setup or S3 by Default - if (typeof this.#gatewayConfiguration.endpoint === "string") { - const objectToFetch = await this.get(key, options); - return objectToFetch.download(); - } else { - const command = new GetObjectCommand({ - Bucket: options?.bucket || this.#defaultBucket, - Key: key, - }), - response = await this.#client.send(command); - - return response.Body; - } - } - - /** - * @typedef {Object} listObjectsResult - * @property {boolean} IsTruncated Indicates if more results exist on the server - * @property {string} NextContinuationToken ContinuationToken used to paginate list requests - * @property {Array} Contents List of Keys stored in the S3 Bucket - * @property {string} Contents.Key Key of the Object - * @property {string} Contents.LastModified Date Last Modified of the Object - * @property {string} Contents.CID CID of the Object - * @property {string} Contents.ETag ETag of the Object - * @property {number} Contents.Size Size in Bytes of the Object - * @property {string} Contents.StorageClass Class of Storage of the Object - * @property {function} Contents.download Convenience function to download the item using the S3 gateway - */ - - /** - * @typedef {Object} listObjectOptions - * @property {string} [Bucket] The name of the bucket. If not provided, the default bucket will be used. - * @property {string} [ContinuationToken=null] Continues listing from this objects name. - * @property {string} [Delimiter=null] Character used to group keys - * @property {number} [MaxKeys=1000] The maximum number of objects to retrieve. Defaults to 1000. - */ - - /** - * Retrieves a list of objects from a specified bucket. - * - * @param {listObjectOptions} options - The options for listing objects. - * @returns {Promise} - A promise that resolves to an array of objects. - * @example - * // List objects in bucket with a limit of 1000 - * await objectManager.list({ - * MaxKeys: 1000 - * }); - */ - async list( - options = { - Bucket: this.#defaultBucket, - ContinuationToken: null, - Delimiter: null, - MaxKeys: 1000, - }, - ) { - if (options?.MaxKeys && options.MaxKeys > 100000) { - throw new Error(`MaxKeys Maximum value is 100000`); - } - const bucket = options?.Bucket || this.#defaultBucket, - limit = options?.MaxKeys || 1000, - commandOptions = { - Bucket: bucket, - MaxKeys: limit, - }, - command = new ListObjectsV2Command({ - ...options, - ...commandOptions, - }); - - const { Contents, IsTruncated, NextContinuationToken } = - await this.#client.send(command); - return { Contents, IsTruncated, NextContinuationToken }; - } - - /** - * @summary Deletes an object from the specified bucket using the provided key. - * @param {string} key - The key of the object to be deleted. - * @param {objectOptions} [options] - The options for deleting the file. - * @returns {Promise} - A Promise that resolves with the result of the delete operation. - * @example - * // Delete object with name of `delete-object-example` - * await objectManager.delete(`delete-object-example`); - */ - async delete(key, options) { - const command = new DeleteObjectCommand({ - Bucket: options?.bucket || this.#defaultBucket, - Key: key, - }); - - await this.#client.send(command); - return true; - } - - /** - * @typedef {Object} copyObjectOptions - * @property {string} [sourceBucket] The source bucket from where the object is to be copied. - * @property {string} [destinationKey] The key of the object in the destination bucket. By default, it is the same as the sourceKey. - */ - - /** - * If the destinationKey is not provided, the object will be copied with the same key as the sourceKey. - * - * @summary Copy the object from sourceKey in the sourceBucket to destinationKey in the destinationBucket. - * @param {string} sourceKey - The key of the object to be copied from the sourceBucket. - * @param {string} destinationBucket - The bucket where the object will be copied to. - * @param {copyObjectOptions} [options] - Additional options for the copy operation. - * - * @returns {Promise} - A Promise that resolves with the result of the copy operation. - * @example - * // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` - * // TIP: Set bucket on constructor, it will be used as the default source for copying objects. - * await objectManager.copy(`copy-object-test`, `copy-object-dest`, { - * sourceBucket: `copy-object-src` - * }); - */ - async copy( - sourceKey, - destinationBucket, - options = { - sourceBucket: this.#defaultBucket, - destinationKey: undefined, - }, - ) { - const copySource = `${ - options?.sourceBucket || this.#defaultBucket - }/${sourceKey}`, - command = new CopyObjectCommand({ - CopySource: copySource, - Bucket: destinationBucket, - Key: options?.destinationKey || sourceKey, - }); - - await this.#client.send(command); - return true; - } -} - -// Function to count slashes in a path -function countSlashes(path) { - return (path.match(/\//g) || []).length; -} - -// Function to check if the code is running in Node.js or the browser -function isNode() { - return typeof process !== "undefined" && process.release.name === "node"; -} - -export default ObjectManager; diff --git a/src/pinManager.js b/src/pinManager.js deleted file mode 100644 index 6255020..0000000 --- a/src/pinManager.js +++ /dev/null @@ -1,298 +0,0 @@ -import axios from "axios"; -import { apiErrorHandler, downloadFromGateway } from "./helpers.js"; - -/** Provides methods for managing pins in an REST endpoint. */ -class PinManager { - #DEFAULT_ENDPOINT = "https://api.filebase.io"; - #DEFAULT_TIMEOUT = 60000; - - #client; - #credentials; - #gatewayConfiguration; - #defaultBucket; - - /** - * @typedef {Object} pinManagerOptions Optional settings for the constructor. - * @property {string} [bucket] Default bucket to use. - * @property {pinDownloadOptions} [gateway] Default gateway to use. - */ - - /** - * @typedef {Object} pinDownloadOptions Optional settings for downloading pins - * @property {string} endpoint Default gateway to use. - * @property {string} [token] Token for the default gateway. - * @property {number} [timeout=60000] Timeout for the default gateway - */ - - /** - * @summary Creates a new instance of the constructor. - * @param {string} clientKey - The access key ID for authentication. - * @param {string} clientSecret - The secret access key for authentication. - * @param {pinManagerOptions} [options] - Optional settings for the constructor. - * @tutorial quickstart-pin - * @example - * import { PinManager } from "@filebase/sdk"; - * const pinManager = new PinManager("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD", { - * bucket: "my-default-bucket", - * gateway: { - * endpoint: "https://my-default-gateway.mydomain.com - * token: SUPER_SECRET_GATEWAY_TOKEN - * } - * }); - */ - constructor(clientKey, clientSecret, options) { - this.#defaultBucket = options?.bucket; - const PSAClientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_NAME_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT, - baseURL = `${PSAClientEndpoint}/v1/ipfs/pins`; - this.#credentials = { - key: clientKey, - secret: clientSecret, - }; - this.#client = axios.create({ - baseURL: baseURL, - timeout: this.#DEFAULT_TIMEOUT, - }); - - this.#gatewayConfiguration = { - endpoint: options?.gateway?.endpoint, - token: options?.gateway?.token, - timeout: options?.gateway?.timeout || this.#DEFAULT_TIMEOUT, - }; - } - - /** - * @typedef {Object} pinStatus - * @property {string} requestid Globally unique identifier of the pin request; can be used to check the status of ongoing pinning, or pin removal - * @property {string} status Status a pin object can have at a pinning service. ("queued","pinning","pinned","failed") - * @property {string} created Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination - * @property {Object} pin Pin object - * @property {string} pin.cid Content Identifier (CID) pinned recursively - * @property {string} pin.name Name for pinned data; can be used for lookups later - * @property {Array} pin.origins Optional list of multiaddrs known to provide the data - * @property {Object} pin.meta Optional metadata for pin object - * @property {Array} delegates List of multiaddrs designated by pinning service that will receive the pin data - * @property {object} [info] Optional info for PinStatus response - * @property {function} download Convenience function to download pin - */ - - /** - * @typedef {Object} pinOptions - * @property {string} [bucket] - The bucket to pin the IPFS CID into. - */ - - /** - * @typedef {Object} listPinOptions - * @property {Array} [cid] Return pin objects responsible for pinning the specified CID(s); be aware that using longer hash functions introduces further constraints on the number of CIDs that will fit under the limit of 2000 characters per URL in browser contexts - * @property {string} [name] Return pin objects with specified name (by default a case-sensitive, exact match) - * @property {string} [match] Customize the text matching strategy applied when the name filter is present; exact (the default) is a case-sensitive exact match, partial matches anywhere in the name, iexact and ipartial are case-insensitive versions of the exact and partial strategies - * @property {Array} [status] Return pin objects for pins with the specified status (when missing, service defaults to pinned only) - * @property {string} [before] Return results created (queued) before provided timestamp - * @property {string} [after] Return results created (queued) after provided timestamp - * @property {number} [limit] Max records to return - * @property {Object} [meta] Return pin objects that match specified metadata keys passed as a string representation of a JSON object; when implementing a client library, make sure the parameter is URL-encoded to ensure safe transport - */ - - /** - * @typedef {Object} listPinResults - * @property {number} count Total number of pin objects that exist for passed query filters - * @property {Array} Array of PinStatus results - */ - - /** - * @summary List the pins in a given bucket - * @param {listPinOptions} [listOptions] - * @param {pinOptions} [options] - * @returns {Promise} - * @example - * // List pins in bucket with a limit of 1000 - * await pinManager.list({ - * limit: 1000 - * }); - */ - async list(listOptions, options) { - try { - const encodedToken = this.#getEncodedToken(options?.bucket), - getResponse = await this.#client.request({ - method: "GET", - params: listOptions, - headers: { Authorization: `Bearer ${encodedToken}` }, - }); - for (let pinStatus of getResponse.data.results) { - pinStatus.download = () => { - return this.download(pinStatus.pin.cid); - }; - } - return getResponse.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Create a pin in the selected bucket - * @param {string} key Key or path of the file in the bucket - * @param {string} cid Content Identifier (CID) to be pinned recursively - * @param {Object} [metadata] Optional metadata for pin object - * @param {pinOptions} [options] Options for pinning the object - * @returns {Promise} - * @example - * // Create Pin with Metadata - * await pinManager.create("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF", { - * "application": "my-custom-app-on-filebase" - * }); - */ - async create(key, cid, metadata, options) { - try { - const encodedToken = this.#getEncodedToken(options?.bucket), - pinStatus = await this.#client.request({ - method: "POST", - data: { - cid, - name: key, - meta: metadata, - }, - headers: { Authorization: `Bearer ${encodedToken}` }, - }); - pinStatus.data.download = () => { - return this.download(pinStatus.data.pin.cid); - }; - return pinStatus.data; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @typedef {Object} replacePinOptions - * @augments pinOptions - * @property {Object} [metadata] Optional metadata to set on pin during replacement - * @property {string} [name] Optional name for pin to set during replacement - */ - - /** - * @summary Replace a pinned object in the selected bucket - * @param {string} requestid Unique ID for the pinned object - * @param {string} cid Content Identifier (CID) to be pinned recursively - * @param {replacePinOptions} [options] Options for pinning the object - * @returns {Promise} - * @example - * // Replace Pin with Metadata - * await pinManager.create("qr4231213", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF", { - * "revision": Date.now() - * } - */ - async replace(requestid, cid, options) { - try { - let replaceData = { - cid, - meta: options?.metadata || {}, - }; - if (options?.name) { - replaceData.name = options.name; - } - - const encodedToken = this.#getEncodedToken(options?.bucket), - pinStatusResult = await this.#client.request({ - method: "POST", - url: `/${requestid}`, - data: replaceData, - validateStatus: (status) => { - return status === 200; - }, - headers: { Authorization: `Bearer ${encodedToken}` }, - }); - const pinStatus = pinStatusResult.data; - pinStatus.download = () => { - return this.download(pinStatus.pin.cid); - }; - return pinStatus; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Download a pin from the selected IPFS gateway - * @param {string} cid - * @param {pinDownloadOptions} [options] - * @returns {Promise} - * @example - * // Download Pin by CID - * await pinManager.download("QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF"); - */ - async download(cid, options) { - const downloadOptions = Object.assign(this.#gatewayConfiguration, options); - return downloadFromGateway(cid, downloadOptions); - } - - /** - * @summary Get details about a pinned object - * @param {string} requestid Globally unique identifier of the pin request - * @param {pinOptions} [options] Options for getting the pin - * @returns {Promise} - * @example - * // Get Pin Info by RequestId - * await pinManager.get("qr4231214"); - */ - async get(requestid, options) { - try { - const encodedToken = this.#getEncodedToken(options?.bucket), - getResponseResult = await this.#client.request({ - method: "GET", - url: `/${requestid}`, - headers: { Authorization: `Bearer ${encodedToken}` }, - validateStatus: (status) => { - return status === 200 || status === 404; - }, - }); - if (getResponseResult.status === 404) { - return false; - } - const pinStatus = getResponseResult.data; - pinStatus.download = () => { - return this.download(pinStatus.pin.cid); - }; - return pinStatus; - } catch (err) { - apiErrorHandler(err); - } - } - - /** - * @summary Delete a pinned object from the selected bucket - * @param requestid Globally unique identifier of the pin request - * @param {pinOptions} [options] Options for deleting the pin - * @returns {Promise} - * @example - * // Delete Pin by RequestId - * await pinManager.delete("qr4231213"); - */ - async delete(requestid, options) { - try { - const encodedToken = this.#getEncodedToken(options?.bucket); - await this.#client.request({ - method: "DELETE", - url: `/${requestid}`, - headers: { Authorization: `Bearer ${encodedToken}` }, - validateStatus: (status) => { - return status === 202; - }, - }); - return true; - } catch (err) { - apiErrorHandler(err); - } - } - - #getEncodedToken(bucket) { - bucket = bucket || this.#defaultBucket; - return Buffer.from( - `${this.#credentials.key}:${this.#credentials.secret}:${bucket}`, - ).toString("base64"); - } -} - -export default PinManager; diff --git a/test/bucketManager.spec.cjs b/test/bucketManager.spec.cjs deleted file mode 100644 index 8d97455..0000000 --- a/test/bucketManager.spec.cjs +++ /dev/null @@ -1,147 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const { BucketManager } = require("../dist/index.js"); - -const TEST_PREFIX = Date.now(); - -test("create bucket", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - try { - // List buckets - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - // Assert new bucket exists - assert.equal(createdBucket.Name, bucketNameToCreate); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - } -}); - -test("generate bucket cid", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; - await bucketManager.create(bucketNameToGenerate); - - try { - // Generate bucket CID - const generatedCid = await bucketManager.generateCid(bucketNameToGenerate); - - // Assert new bucket exists - assert.equal(generatedCid, "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354"); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToGenerate); - } -}); - -test("list buckets", async () => { - const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, - bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ), - initialBucketsList = await bucketManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await bucketManager.create(`${testBucketName}-${i}`); - } - const bucketsList = await bucketManager.list(); - for (let i = 0; i < countToCreate; i++) { - await bucketManager.delete(`${testBucketName}-${i}`); - } - assert.strictEqual( - bucketsList.length, - initialBucketsList.length + countToCreate, - ); -}); - -test("delete bucket", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `delete-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - if (typeof createdBucket === "undefined") { - throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); - } - - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - - // List buckets and assert new bucket does not exist - const updatedBuckets = await bucketManager.list(), - deletedBucket = updatedBuckets.find((updatedBucket) => { - return updatedBucket.Name === bucketNameToCreate; - }); - assert.equal(typeof deletedBucket, "undefined"); -}); - -test("set bucket privacy to public", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `toggle-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-toggle-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - try { - // List buckets - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - // Check Privacy - const initialPrivacy = await bucketManager.getPrivacy(bucketNameToCreate); - if (initialPrivacy === false) { - throw new Error(`Unexpected Privacy State on Bucket`); - } - - // Toggle Privacy - await bucketManager.setPrivacy(bucketNameToCreate, false); - - // Check Privacy - const updatedPrivacy = await bucketManager.getPrivacy(bucketNameToCreate); - if (updatedPrivacy === true) { - throw new Error(`Unexpected Privacy State on Bucket`); - } - - // Assert new bucket exists - assert.equal(createdBucket.Name, bucketNameToCreate); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - } -}); diff --git a/test/bucketManager.spec.mjs b/test/bucketManager.spec.mjs deleted file mode 100644 index 5ed3f83..0000000 --- a/test/bucketManager.spec.mjs +++ /dev/null @@ -1,147 +0,0 @@ -import test from "node:test"; -import assert from "node:assert/strict"; -import { BucketManager } from "../src/index.js"; - -const TEST_PREFIX = Date.now(); - -test("create bucket", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - try { - // List buckets - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - // Assert new bucket exists - assert.equal(createdBucket.Name, bucketNameToCreate); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - } -}); - -test("generate bucket cid", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; - await bucketManager.create(bucketNameToGenerate); - - try { - // Generate bucket CID - const generatedCid = await bucketManager.generateCid(bucketNameToGenerate); - - // Assert new bucket exists - assert.equal(generatedCid, "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354"); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToGenerate); - } -}); - -test("list buckets", async () => { - const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, - bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ), - initialBucketsList = await bucketManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await bucketManager.create(`${testBucketName}-${i}`); - } - const bucketsList = await bucketManager.list(); - for (let i = 0; i < countToCreate; i++) { - await bucketManager.delete(`${testBucketName}-${i}`); - } - assert.strictEqual( - bucketsList.length, - initialBucketsList.length + countToCreate, - ); -}); - -test("delete bucket", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `delete-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - if (typeof createdBucket === "undefined") { - throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); - } - - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - - // List buckets and assert new bucket does not exist - const updatedBuckets = await bucketManager.list(), - deletedBucket = updatedBuckets.find((updatedBucket) => { - return updatedBucket.Name === bucketNameToCreate; - }); - assert.equal(typeof deletedBucket, "undefined"); -}); - -test("set bucket privacy to public", async () => { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `toggle-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-toggle-bucket-test-pass`; - await bucketManager.create(bucketNameToCreate); - - try { - // List buckets - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - // Check Privacy - const initialPrivacy = await bucketManager.getPrivacy(bucketNameToCreate); - if (initialPrivacy === false) { - throw new Error(`Unexpected Privacy State on Bucket`); - } - - // Toggle Privacy - await bucketManager.setPrivacy(bucketNameToCreate, false); - - // Check Privacy - const updatedPrivacy = await bucketManager.getPrivacy(bucketNameToCreate); - if (updatedPrivacy === true) { - throw new Error(`Unexpected Privacy State on Bucket`); - } - - // Assert new bucket exists - assert.equal(createdBucket.Name, bucketNameToCreate); - } finally { - // Delete new bucket - await bucketManager.delete(bucketNameToCreate); - } -}); diff --git a/test/gatewayManager.spec.cjs b/test/gatewayManager.spec.cjs deleted file mode 100644 index 98237e3..0000000 --- a/test/gatewayManager.spec.cjs +++ /dev/null @@ -1,125 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const { GatewayManager } = require("../dist/index.js"); - -const TEST_PREFIX = Date.now(); - -test("delete gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName); - await gatewayManager.delete(testGatewayName); - const deletedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(deletedName, false); -}); -test("create gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName); - await gatewayManager.delete(testGatewayName); - assert.strictEqual(createdName.name, testGatewayName); -}); - -test("update gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName); - try { - const updatedName = await gatewayManager.update(createdName.name, { - private: true, - enabled: false, - }); - assert.strictEqual(updatedName, true); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("get gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName, {}); - try { - const testName = await gatewayManager.get(createdName.name); - assert.strictEqual(testName.name, testGatewayName); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("list gateways", async () => { - const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - initialGatewaysList = await gatewayManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await gatewayManager.create(`${testGatewayName}-${i}`); - } - const gatewaysList = await gatewayManager.list(); - for (let i = 0; i < countToCreate; i++) { - await gatewayManager.delete(`${testGatewayName}-${i}`); - } - assert.strictEqual( - gatewaysList.length, - initialGatewaysList.length + countToCreate, - ); -}); - -test("toggle gateway off", async () => { - const testGatewayName = `${TEST_PREFIX}-toggle-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName); - try { - const resolvedName = await gatewayManager.get(testGatewayName); - if (resolvedName?.enabled === false) { - throw new Error(`Incorrect State on Resolved Name`); - } - await gatewayManager.toggle(testGatewayName, false); - const updatedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(updatedName.name, testGatewayName); - assert.strictEqual(updatedName.enabled, false); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("toggle gateway on", async () => { - const testGatewayName = `${TEST_PREFIX}-toggle-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName, { - enabled: false, - }); - try { - const resolvedName = await gatewayManager.get(testGatewayName); - if (resolvedName?.enabled === true) { - throw new Error(`Incorrect State on Resolved Name`); - } - await gatewayManager.toggle(testGatewayName, true); - const updatedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(updatedName.name, testGatewayName); - assert.strictEqual(updatedName.enabled, true); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); diff --git a/test/gatewayManager.spec.mjs b/test/gatewayManager.spec.mjs deleted file mode 100644 index 364bb9c..0000000 --- a/test/gatewayManager.spec.mjs +++ /dev/null @@ -1,125 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { GatewayManager } from "../src/index.js"; - -const TEST_PREFIX = Date.now(); - -test("delete gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName); - await gatewayManager.delete(testGatewayName); - const deletedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(deletedName, false); -}); -test("create gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName); - await gatewayManager.delete(testGatewayName); - assert.strictEqual(createdName.name, testGatewayName); -}); - -test("update gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName); - try { - const updatedName = await gatewayManager.update(createdName.name, { - private: true, - enabled: false, - }); - assert.strictEqual(updatedName, true); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("get gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await gatewayManager.create(testGatewayName, {}); - try { - const testName = await gatewayManager.get(createdName.name); - assert.strictEqual(testName.name, testGatewayName); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("list gateways", async () => { - const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - initialGatewaysList = await gatewayManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await gatewayManager.create(`${testGatewayName}-${i}`); - } - const gatewaysList = await gatewayManager.list(); - for (let i = 0; i < countToCreate; i++) { - await gatewayManager.delete(`${testGatewayName}-${i}`); - } - assert.strictEqual( - gatewaysList.length, - initialGatewaysList.length + countToCreate, - ); -}); - -test("toggle gateway off", async () => { - const testGatewayName = `${TEST_PREFIX}-toggle-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName); - try { - const resolvedName = await gatewayManager.get(testGatewayName); - if (resolvedName?.enabled === false) { - throw new Error(`Incorrect State on Resolved Name`); - } - await gatewayManager.toggle(testGatewayName, false); - const updatedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(updatedName.name, testGatewayName); - assert.strictEqual(updatedName.enabled, false); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); - -test("toggle gateway on", async () => { - const testGatewayName = `${TEST_PREFIX}-toggle-gateway-test-pass`, - gatewayManager = new GatewayManager( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await gatewayManager.create(testGatewayName, { - enabled: false, - }); - try { - const resolvedName = await gatewayManager.get(testGatewayName); - if (resolvedName?.enabled === true) { - throw new Error(`Incorrect State on Resolved Name`); - } - await gatewayManager.toggle(testGatewayName, true); - const updatedName = await gatewayManager.get(testGatewayName); - assert.strictEqual(updatedName.name, testGatewayName); - assert.strictEqual(updatedName.enabled, true); - } finally { - await gatewayManager.delete(testGatewayName); - } -}); diff --git a/test/index.spec.cjs b/test/index.spec.cjs new file mode 100644 index 0000000..d557eba --- /dev/null +++ b/test/index.spec.cjs @@ -0,0 +1,809 @@ +const test = require("node:test"); +const assert = require("node:assert/strict"); +const path = require("node:path"); +const { writeFile } = require("node:fs/promises"); +const { v4: uuidv4 } = require("uuid"); +const os = require("node:os"); +const FilebaseClient = require("../dist/index.js"); + +// Application Constants +const TEST_PREFIX = Date.now(); + +//region Bucket Tests +test("create bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + try { + // List buckets + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + // Assert new bucket exists + assert.equal(createdBucket.Name, bucketNameToCreate); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + } +}); + +test("get bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGet); + + try { + // Generate bucket CID + await filebaseClient.generateBucketCid(bucketNameToGet); + + // Get bucket information + const bucketCid = await filebaseClient.getBucketCid(bucketNameToGet); + + // Assert new bucket exists + assert.equal( + bucketCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGet); + } +}); + +test("generate bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGenerate); + + try { + // Generate bucket CID + const generatedCid = + await filebaseClient.generateBucketCid(bucketNameToGenerate); + + // Assert new bucket exists + assert.equal( + generatedCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGenerate); + } +}); + +test("list buckets", async () => { + const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ), + initialBucketsList = await filebaseClient.listBuckets(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createBucket(`${testBucketName}-${i}`); + } + const bucketsList = await filebaseClient.listBuckets(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteBucket(`${testBucketName}-${i}`); + } + assert.strictEqual( + bucketsList.length, + initialBucketsList.length + countToCreate, + ); +}); + +test("delete bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `delete-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + if (typeof createdBucket === "undefined") { + throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); + } + + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + + // List buckets and assert new bucket does not exist + const updatedBuckets = await filebaseClient.listBuckets(), + deletedBucket = updatedBuckets.find((updatedBucket) => { + return updatedBucket.Name === bucketNameToCreate; + }); + assert.equal(typeof deletedBucket, "undefined"); +}); +//endregion + +//region File Tests +async function createBucket(name) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket with name + const bucketNameToCreate = name; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + return typeof createdBucket !== "undefined"; +} + +async function uploadObject(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Upload Object + await filebaseClient.uploadFile(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false + ? uploadedObject + : false; +} + +async function uploadObjects(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Upload Object + await filebaseClient.uploadFiles(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false; +} + +async function deleteObject(bucket, key) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Delete Object + await filebaseClient.deleteFile(key); + return true; +} + +async function deleteBucket(bucket) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Delete Bucket + await filebaseClient.deleteFile(bucket); + return true; +} + +test("delete object", async () => { + // Create bucket `delete-object-test-pass` + const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; + await createBucket(deleteTestBucket); + + try { + // Upload object `delete-object-test` + const objectNameToCreate = `delete-object-test`; + const uploaded = await uploadObject( + deleteTestBucket, + objectNameToCreate, + Buffer.from("delete object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [delete-object-test]`); + } + + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: deleteTestBucket }, + ); + + // Delete object `delete-object-test` + await filebaseClient.deleteFile(objectNameToCreate); + + // List bucket and assert new object doesn't exist + const uploadedObject = + await filebaseClient.getFileMetadata(objectNameToCreate); + assert.equal(uploadedObject, false); + } finally { + await deleteBucket(deleteTestBucket); + } +}); + +test("upload object", async () => { + // Create Bucket `create-object-test-pass + const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; + await createBucket(uploadTestBucket); + + try { + // Upload object `create-object-test` + const uploaded = await uploadObject( + uploadTestBucket, + `create-object-test`, + Buffer.from("upload object", "utf-8"), + ); + + assert.strictEqual(uploaded, true); + await deleteObject(uploadTestBucket, `create-object-test`); + } finally { + await deleteBucket(uploadTestBucket); + } +}); + +test("upload directory", async () => { + // Create Bucket `create-object-test-pass + const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; + await createBucket(uploadDirectoryTestBucket); + + try { + // Upload object `create-object-test` + const uploaded = await uploadObjects( + uploadDirectoryTestBucket, + `create-directory-test`, + [ + { + path: "/testObjects/1.txt", + content: Buffer.from("upload test object", "utf-8"), + }, + { + path: "/testObjects/deep/1.txt", + content: Buffer.from("upload deep test object", "utf-8"), + }, + { + path: "/topLevel.txt", + content: Buffer.from("upload top level test object", "utf-8"), + }, + ], + ); + assert.strictEqual(uploaded, true); + await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); + } finally { + await deleteBucket(uploadDirectoryTestBucket); + } +}); + +test("generate presigned url for object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-presigned-url-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `presigned-url-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [${objectNameToCreate}]`); + } + + try { + // Generate presigned URL for objects + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: downloadTestBucket }, + ); + const presignedUrl = + await filebaseClient.generatePresignedUrl(objectNameToCreate); + assert.strictEqual(typeof presignedUrl, "string"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: downloadTestBucket }, + ); + const downloadStream = + await filebaseClient.downloadFile(objectNameToCreate), + downloadFilename = uuidv4(), + downloadPath = path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object using gateway (ipfs)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }, + ); + const downloadStream = await filebaseClient.fetchContentByCid( + uploaded["cid"], + ), + downloadFilename = uuidv4(), + downloadPath = path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("list objects", async () => { + // Create bucket `list-objects-test-pass` + const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; + await createBucket(listTestBucket); + + try { + let createdObjectCount = 0; + while (createdObjectCount < 26) { + // Upload objects `list-object-test-[x]` + const objectNameToCreate = `list-object-test-${createdObjectCount}`; + await uploadObject( + listTestBucket, + objectNameToCreate, + Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), + ); + createdObjectCount++; + } + + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: listTestBucket }, + ); + + const objectList = await filebaseClient.listFiles(`list-object-test-`, { + MaxKeys: 50, + }); + assert.equal(objectList.Contents.length, 26); + + let deletedObjectCount = 0; + while (deletedObjectCount < 26) { + // Delete objects `list-object-test-[x]` + const objectNameToDelete = `list-object-test-${deletedObjectCount}`; + await deleteObject(listTestBucket, objectNameToDelete); + deletedObjectCount++; + } + } finally { + await deleteBucket(listTestBucket); + } +}); + +test("copy object", async () => { + // Create bucket `copy-object-test-pass-src` + const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; + await createBucket(bucketSrc); + + try { + // Upload object `copy-object-test` + const objectNameToCreateSrc = `copy-object-test`; + const uploaded = await uploadObject( + bucketSrc, + objectNameToCreateSrc, + Buffer.from("copy object", "utf-8"), + ); + try { + assert.equal(uploaded, true); + + // Create bucket `copy-object-test-pass-dest` + const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; + await createBucket(bucketDest); + + try { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: bucketSrc }, + ); + + // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` + await filebaseClient.copyFile(objectNameToCreateSrc, bucketDest); + try { + // List bucket and assert new object exists + const copiedObject = await filebaseClient.getFileMetadata( + objectNameToCreateSrc, + ); + assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); + } finally { + await deleteObject(bucketDest, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketDest); + } + } finally { + await deleteObject(bucketSrc, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketSrc); + } +}); +//endregion + +//region Gateway Tests +test("delete gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ); + await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + const deletedName = await filebaseClient.getGateway(testGatewayName); + assert.strictEqual(deletedName, false); +}); + +test("create gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + assert.strictEqual(createdName.name, testGatewayName); +}); + +test("update gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName); + try { + const updatedName = await filebaseClient.updateGateway(createdName.name, { + private: true, + enabled: false, + }); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("get gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName, {}); + try { + const testName = await filebaseClient.getGateway(createdName.name); + assert.strictEqual(testName.name, testGatewayName); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("list gateways", async () => { + const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + initialGatewaysList = await filebaseClient.listGateways(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createGateway(`${testGatewayName}-${i}`); + } + const gatewaysList = await filebaseClient.listGateways(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteGateway(`${testGatewayName}-${i}`); + } + assert.strictEqual( + gatewaysList.length, + initialGatewaysList.length + countToCreate, + ); +}); +//endregion + +//region Names Tests +const TEST_CID = process.env.TEST_NAME_CID, + TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY; + +test("delete name", async () => { + const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ); + await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + const deletedName = await filebaseClient.getIpnsName(testNameLabel); + assert.strictEqual(deletedName, false); +}); + +test("create name", async () => { + const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(createdName.label, testNameLabel); + assert.strictEqual(createdName.cid, TEST_CID); +}); + +test("import name", async () => { + const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + importedName = await filebaseClient.importIpnsName( + testNameLabel, + TEST_CID, + TEST_PRIVATE_KEY, + ); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(importedName.label, testNameLabel); + assert.strictEqual(importedName.cid, TEST_CID); +}); + +test("update name", async () => { + const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const updatedName = await filebaseClient.updateIpnsName( + createdName.label, + TEST_CID, + ); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("get name", async () => { + const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testName = await filebaseClient.getIpnsName(createdName.label); + assert.strictEqual(testName.label, testNameLabel); + assert.strictEqual(testName.cid, TEST_CID); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("resolve name", async () => { + const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testNameValue = await filebaseClient.resolveIpnsName( + createdName.network_key, + ); + assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("list names", async () => { + const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + initialNamesList = await filebaseClient.listIpnsNames(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createIpnsName(`${testNameLabel}-${i}`, TEST_CID); + } + const namesList = await filebaseClient.listIpnsNames(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteIpnsName(`${testNameLabel}-${i}`); + } + assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); +}); + +test("download object using gateway (ipns)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-ipns-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }, + ); + + // Create IPNS Name + const createdName = await filebaseClient.createIpnsName( + `${objectNameToCreate}-ipns`, + uploaded.cid, + ); + + const downloadStream = await filebaseClient.fetchContentByIpnsName( + createdName["network_key"], + ), + downloadFilename = uuidv4(), + downloadPath = path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); +//endregion + +//region Pinning API Tests +const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT"; + +test("create pin", async () => { + const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, + testPinName = `${TEST_PREFIX}-create-pin-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + { + bucket: testBucketName, + }, + ); + await createBucket(testBucketName); + try { + const createdPin = await filebaseClient.pinFile(testPinName, TEST_CID_1); + assert.strictEqual(createdPin.pin.cid, TEST_CID_1); + await filebaseClient.deleteFile(createdPin.name); + } finally { + await deleteBucket(testBucketName); + } +}); + +test("create pins", async () => { + const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, + testPinName = `${TEST_PREFIX}-create-pin-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + { + bucket: testBucketName, + }, + ); + await createBucket(testBucketName); + try { + const createdPin = await filebaseClient.pinFiles(testPinName, TEST_CID_1); + assert.strictEqual(createdPin.pin.cid, TEST_CID_1); + await filebaseClient.deleteFile(createdPin.name); + } finally { + await deleteBucket(testBucketName); + } +}); +//endregion diff --git a/test/index.spec.mjs b/test/index.spec.mjs new file mode 100644 index 0000000..10eeecf --- /dev/null +++ b/test/index.spec.mjs @@ -0,0 +1,809 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import * as Path from "node:path"; +import { writeFile } from "node:fs/promises"; +import { v4 as uuidv4 } from "uuid"; +import os from "node:os"; +import FilebaseClient from "../src/index.js"; + +// Application Constants +const TEST_PREFIX = Date.now(); + +//region Bucket Tests +test("create bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + try { + // List buckets + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + // Assert new bucket exists + assert.equal(createdBucket.Name, bucketNameToCreate); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + } +}); + +test("get bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGet); + + try { + // Generate bucket CID + await filebaseClient.generateBucketCid(bucketNameToGet); + + // Get bucket information + const bucketCid = await filebaseClient.getBucketCid(bucketNameToGet); + + // Assert new bucket exists + assert.equal( + bucketCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGet); + } +}); + +test("generate bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGenerate); + + try { + // Generate bucket CID + const generatedCid = + await filebaseClient.generateBucketCid(bucketNameToGenerate); + + // Assert new bucket exists + assert.equal( + generatedCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGenerate); + } +}); + +test("list buckets", async () => { + const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ), + initialBucketsList = await filebaseClient.listBuckets(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createBucket(`${testBucketName}-${i}`); + } + const bucketsList = await filebaseClient.listBuckets(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteBucket(`${testBucketName}-${i}`); + } + assert.strictEqual( + bucketsList.length, + initialBucketsList.length + countToCreate, + ); +}); + +test("delete bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket `delete-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + if (typeof createdBucket === "undefined") { + throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); + } + + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + + // List buckets and assert new bucket does not exist + const updatedBuckets = await filebaseClient.listBuckets(), + deletedBucket = updatedBuckets.find((updatedBucket) => { + return updatedBucket.Name === bucketNameToCreate; + }); + assert.equal(typeof deletedBucket, "undefined"); +}); +//endregion + +//region File Tests +async function createBucket(name) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Create bucket with name + const bucketNameToCreate = name; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + return typeof createdBucket !== "undefined"; +} + +async function uploadObject(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Upload Object + await filebaseClient.uploadFile(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false + ? uploadedObject + : false; +} + +async function uploadObjects(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Upload Object + await filebaseClient.uploadFiles(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false; +} + +async function deleteObject(bucket, key) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket }, + ); + + // Delete Object + await filebaseClient.deleteFile(key); + return true; +} + +async function deleteBucket(bucket) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + ); + + // Delete Bucket + await filebaseClient.deleteFile(bucket); + return true; +} + +test("delete object", async () => { + // Create bucket `delete-object-test-pass` + const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; + await createBucket(deleteTestBucket); + + try { + // Upload object `delete-object-test` + const objectNameToCreate = `delete-object-test`; + const uploaded = await uploadObject( + deleteTestBucket, + objectNameToCreate, + Buffer.from("delete object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [delete-object-test]`); + } + + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: deleteTestBucket }, + ); + + // Delete object `delete-object-test` + await filebaseClient.deleteFile(objectNameToCreate); + + // List bucket and assert new object doesn't exist + const uploadedObject = + await filebaseClient.getFileMetadata(objectNameToCreate); + assert.equal(uploadedObject, false); + } finally { + await deleteBucket(deleteTestBucket); + } +}); + +test("upload object", async () => { + // Create Bucket `create-object-test-pass + const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; + await createBucket(uploadTestBucket); + + try { + // Upload object `create-object-test` + const uploaded = await uploadObject( + uploadTestBucket, + `create-object-test`, + Buffer.from("upload object", "utf-8"), + ); + + assert.strictEqual(uploaded, true); + await deleteObject(uploadTestBucket, `create-object-test`); + } finally { + await deleteBucket(uploadTestBucket); + } +}); + +test("upload directory", async () => { + // Create Bucket `create-object-test-pass + const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; + await createBucket(uploadDirectoryTestBucket); + + try { + // Upload object `create-object-test` + const uploaded = await uploadObjects( + uploadDirectoryTestBucket, + `create-directory-test`, + [ + { + path: "/testObjects/1.txt", + content: Buffer.from("upload test object", "utf-8"), + }, + { + path: "/testObjects/deep/1.txt", + content: Buffer.from("upload deep test object", "utf-8"), + }, + { + path: "/topLevel.txt", + content: Buffer.from("upload top level test object", "utf-8"), + }, + ], + ); + assert.strictEqual(uploaded, true); + await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); + } finally { + await deleteBucket(uploadDirectoryTestBucket); + } +}); + +test("generate presigned url for object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-presigned-url-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `presigned-url-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [${objectNameToCreate}]`); + } + + try { + // Generate presigned URL for objects + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: downloadTestBucket }, + ); + const presignedUrl = + await filebaseClient.generatePresignedUrl(objectNameToCreate); + assert.strictEqual(typeof presignedUrl, "string"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: downloadTestBucket }, + ); + const downloadStream = + await filebaseClient.downloadFile(objectNameToCreate), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object using gateway (ipfs)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }, + ); + const downloadStream = await filebaseClient.fetchContentByCid( + uploaded["cid"], + ), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("list objects", async () => { + // Create bucket `list-objects-test-pass` + const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; + await createBucket(listTestBucket); + + try { + let createdObjectCount = 0; + while (createdObjectCount < 26) { + // Upload objects `list-object-test-[x]` + const objectNameToCreate = `list-object-test-${createdObjectCount}`; + await uploadObject( + listTestBucket, + objectNameToCreate, + Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), + ); + createdObjectCount++; + } + + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: listTestBucket }, + ); + + const objectList = await filebaseClient.listFiles(`list-object-test-`, { + MaxKeys: 50, + }); + assert.equal(objectList.Contents.length, 26); + + let deletedObjectCount = 0; + while (deletedObjectCount < 26) { + // Delete objects `list-object-test-[x]` + const objectNameToDelete = `list-object-test-${deletedObjectCount}`; + await deleteObject(listTestBucket, objectNameToDelete); + deletedObjectCount++; + } + } finally { + await deleteBucket(listTestBucket); + } +}); + +test("copy object", async () => { + // Create bucket `copy-object-test-pass-src` + const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; + await createBucket(bucketSrc); + + try { + // Upload object `copy-object-test` + const objectNameToCreateSrc = `copy-object-test`; + const uploaded = await uploadObject( + bucketSrc, + objectNameToCreateSrc, + Buffer.from("copy object", "utf-8"), + ); + try { + assert.equal(uploaded, true); + + // Create bucket `copy-object-test-pass-dest` + const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; + await createBucket(bucketDest); + + try { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { bucket: bucketSrc }, + ); + + // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` + await filebaseClient.copyFile(objectNameToCreateSrc, bucketDest); + try { + // List bucket and assert new object exists + const copiedObject = await filebaseClient.getFileMetadata( + objectNameToCreateSrc, + ); + assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); + } finally { + await deleteObject(bucketDest, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketDest); + } + } finally { + await deleteObject(bucketSrc, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketSrc); + } +}); +//endregion + +//region Gateway Tests +test("delete gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ); + await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + const deletedName = await filebaseClient.getGateway(testGatewayName); + assert.strictEqual(deletedName, false); +}); + +test("create gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + assert.strictEqual(createdName.name, testGatewayName); +}); + +test("update gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName); + try { + const updatedName = await filebaseClient.updateGateway(createdName.name, { + private: true, + enabled: false, + }); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("get gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createGateway(testGatewayName, {}); + try { + const testName = await filebaseClient.getGateway(createdName.name); + assert.strictEqual(testName.name, testGatewayName); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("list gateways", async () => { + const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_GW_KEY || process.env.TEST_KEY, + process.env.TEST_GW_SECRET || process.env.TEST_SECRET, + ), + initialGatewaysList = await filebaseClient.listGateways(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createGateway(`${testGatewayName}-${i}`); + } + const gatewaysList = await filebaseClient.listGateways(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteGateway(`${testGatewayName}-${i}`); + } + assert.strictEqual( + gatewaysList.length, + initialGatewaysList.length + countToCreate, + ); +}); +//endregion + +//region Names Tests +const TEST_CID = process.env.TEST_NAME_CID, + TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY; + +test("delete name", async () => { + const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ); + await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + const deletedName = await filebaseClient.getIpnsName(testNameLabel); + assert.strictEqual(deletedName, false); +}); + +test("create name", async () => { + const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(createdName.label, testNameLabel); + assert.strictEqual(createdName.cid, TEST_CID); +}); + +test("import name", async () => { + const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + importedName = await filebaseClient.importIpnsName( + testNameLabel, + TEST_CID, + TEST_PRIVATE_KEY, + ); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(importedName.label, testNameLabel); + assert.strictEqual(importedName.cid, TEST_CID); +}); + +test("update name", async () => { + const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const updatedName = await filebaseClient.updateIpnsName( + createdName.label, + TEST_CID, + ); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("get name", async () => { + const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testName = await filebaseClient.getIpnsName(createdName.label); + assert.strictEqual(testName.label, testNameLabel); + assert.strictEqual(testName.cid, TEST_CID); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("resolve name", async () => { + const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testNameValue = await filebaseClient.resolveIpnsName( + createdName.network_key, + ); + assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("list names", async () => { + const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + ), + initialNamesList = await filebaseClient.listIpnsNames(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createIpnsName(`${testNameLabel}-${i}`, TEST_CID); + } + const namesList = await filebaseClient.listIpnsNames(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteIpnsName(`${testNameLabel}-${i}`); + } + assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); +}); + +test("download object using gateway (ipns)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-ipns-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + Buffer.from("download object", "utf-8"), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient( + process.env.TEST_S3_KEY || process.env.TEST_KEY, + process.env.TEST_S3_SECRET || process.env.TEST_SECRET, + { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }, + ); + + // Create IPNS Name + const createdName = await filebaseClient.createIpnsName( + `${objectNameToCreate}-ipns`, + uploaded.cid, + ); + + const downloadStream = await filebaseClient.fetchContentByIpnsName( + createdName["network_key"], + ), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); +//endregion + +//region Pinning API Tests +const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT"; + +test("create pin", async () => { + const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, + testPinName = `${TEST_PREFIX}-create-pin-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + { + bucket: testBucketName, + }, + ); + await createBucket(testBucketName); + try { + const createdPin = await filebaseClient.pinFile(testPinName, TEST_CID_1); + assert.strictEqual(createdPin.pin.cid, TEST_CID_1); + await filebaseClient.deleteFile(createdPin.name); + } finally { + await deleteBucket(testBucketName); + } +}); + +test("create pins", async () => { + const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, + testPinName = `${TEST_PREFIX}-create-pin-test-pass`, + filebaseClient = new FilebaseClient( + process.env.TEST_NAME_KEY || process.env.TEST_KEY, + process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, + { + bucket: testBucketName, + }, + ); + await createBucket(testBucketName); + try { + const createdPin = await filebaseClient.pinFiles(testPinName, TEST_CID_1); + assert.strictEqual(createdPin.pin.cid, TEST_CID_1); + await filebaseClient.deleteFile(createdPin.name); + } finally { + await deleteBucket(testBucketName); + } +}); +//endregion diff --git a/test/nameManager.spec.cjs b/test/nameManager.spec.cjs deleted file mode 100644 index 283f7fd..0000000 --- a/test/nameManager.spec.cjs +++ /dev/null @@ -1,141 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const { NameManager } = require("../dist/index.js"); - -const TEST_CID = process.env.TEST_NAME_CID, - TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY, - TEST_PREFIX = Date.now(); - -test("delete name", async () => { - const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID); - await nameManager.delete(testNameLabel); - const deletedName = await nameManager.get(testNameLabel); - assert.strictEqual(deletedName, false); -}); -test("create name", async () => { - const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - await nameManager.delete(testNameLabel); - assert.strictEqual(createdName.label, testNameLabel); - assert.strictEqual(createdName.cid, TEST_CID); -}); - -test("import name", async () => { - const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - importedName = await nameManager.import( - testNameLabel, - TEST_CID, - TEST_PRIVATE_KEY, - ); - await nameManager.delete(testNameLabel); - assert.strictEqual(importedName.label, testNameLabel); - assert.strictEqual(importedName.cid, TEST_CID); -}); - -test("update name", async () => { - const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - try { - const updatedName = await nameManager.update(createdName.label, TEST_CID); - assert.strictEqual(updatedName, true); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("get name", async () => { - const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - try { - const testName = await nameManager.get(createdName.label); - assert.strictEqual(testName.label, testNameLabel); - assert.strictEqual(testName.cid, TEST_CID); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("list names", async () => { - const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - initialNamesList = await nameManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await nameManager.create(`${testNameLabel}-${i}`, TEST_CID); - } - const namesList = await nameManager.list(); - for (let i = 0; i < countToCreate; i++) { - await nameManager.delete(`${testNameLabel}-${i}`); - } - assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); -}); - -test("toggle name on", async () => { - const testNameLabel = `${TEST_PREFIX}-toggle-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID, { - enabled: false, - }); - try { - const resolvedName = await nameManager.get(testNameLabel); - if (resolvedName?.enabled === true) { - throw new Error(`Incorrect State on Resolved Name`); - } - await nameManager.toggle(testNameLabel, true); - const updatedName = await nameManager.get(testNameLabel); - assert.strictEqual(updatedName.label, testNameLabel); - assert.strictEqual(updatedName.cid, TEST_CID); - assert.strictEqual(updatedName.enabled, true); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("toggle name off", async () => { - const testNameLabel = `${TEST_PREFIX}-toggle-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID); - try { - const resolvedName = await nameManager.get(testNameLabel); - if (resolvedName?.enabled === false) { - throw new Error(`Incorrect State on Resolved Name`); - } - await nameManager.toggle(testNameLabel, false); - const updatedName = await nameManager.get(testNameLabel); - assert.strictEqual(updatedName.label, testNameLabel); - assert.strictEqual(updatedName.cid, TEST_CID); - assert.strictEqual(updatedName.enabled, false); - } finally { - await nameManager.delete(testNameLabel); - } -}); diff --git a/test/nameManager.spec.mjs b/test/nameManager.spec.mjs deleted file mode 100644 index c48fe2c..0000000 --- a/test/nameManager.spec.mjs +++ /dev/null @@ -1,141 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { NameManager } from "../src/index.js"; - -const TEST_CID = process.env.TEST_NAME_CID, - TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY, - TEST_PREFIX = Date.now(); - -test("delete name", async () => { - const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID); - await nameManager.delete(testNameLabel); - const deletedName = await nameManager.get(testNameLabel); - assert.strictEqual(deletedName, false); -}); -test("create name", async () => { - const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - await nameManager.delete(testNameLabel); - assert.strictEqual(createdName.label, testNameLabel); - assert.strictEqual(createdName.cid, TEST_CID); -}); - -test("import name", async () => { - const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - importedName = await nameManager.import( - testNameLabel, - TEST_CID, - TEST_PRIVATE_KEY, - ); - await nameManager.delete(testNameLabel); - assert.strictEqual(importedName.label, testNameLabel); - assert.strictEqual(importedName.cid, TEST_CID); -}); - -test("update name", async () => { - const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - try { - const updatedName = await nameManager.update(createdName.label, TEST_CID); - assert.strictEqual(updatedName, true); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("get name", async () => { - const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await nameManager.create(testNameLabel, TEST_CID); - try { - const testName = await nameManager.get(createdName.label); - assert.strictEqual(testName.label, testNameLabel); - assert.strictEqual(testName.cid, TEST_CID); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("list names", async () => { - const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - initialNamesList = await nameManager.list(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await nameManager.create(`${testNameLabel}-${i}`, TEST_CID); - } - const namesList = await nameManager.list(); - for (let i = 0; i < countToCreate; i++) { - await nameManager.delete(`${testNameLabel}-${i}`); - } - assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); -}); - -test("toggle name on", async () => { - const testNameLabel = `${TEST_PREFIX}-toggle-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID, { - enabled: false, - }); - try { - const resolvedName = await nameManager.get(testNameLabel); - if (resolvedName?.enabled === true) { - throw new Error(`Incorrect State on Resolved Name`); - } - await nameManager.toggle(testNameLabel, true); - const updatedName = await nameManager.get(testNameLabel); - assert.strictEqual(updatedName.label, testNameLabel); - assert.strictEqual(updatedName.cid, TEST_CID); - assert.strictEqual(updatedName.enabled, true); - } finally { - await nameManager.delete(testNameLabel); - } -}); - -test("toggle name off", async () => { - const testNameLabel = `${TEST_PREFIX}-toggle-name-test-pass`, - nameManager = new NameManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await nameManager.create(testNameLabel, TEST_CID); - try { - const resolvedName = await nameManager.get(testNameLabel); - if (resolvedName?.enabled === false) { - throw new Error(`Incorrect State on Resolved Name`); - } - await nameManager.toggle(testNameLabel, false); - const updatedName = await nameManager.get(testNameLabel); - assert.strictEqual(updatedName.label, testNameLabel); - assert.strictEqual(updatedName.cid, TEST_CID); - assert.strictEqual(updatedName.enabled, false); - } finally { - await nameManager.delete(testNameLabel); - } -}); diff --git a/test/objectManager.spec.cjs b/test/objectManager.spec.cjs deleted file mode 100644 index 7ea28d8..0000000 --- a/test/objectManager.spec.cjs +++ /dev/null @@ -1,357 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const { ObjectManager, BucketManager } = require("../dist/index.js"); -const Path = require("node:path"); -const { writeFile } = require("node:fs/promises"); -const { v4: uuidv4 } = require("uuid"); -const os = require("node:os"); - -const TEST_PREFIX = Date.now(); - -async function createBucket(name) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket with name - const bucketNameToCreate = name; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - return typeof createdBucket !== "undefined"; -} - -async function uploadObject(bucket, key, body) { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Upload Object - await objectManager.upload(key, body); - - // Confirm Object Uploaded - const uploadedObject = await objectManager.get(key); - - return typeof uploadedObject !== "undefined"; -} - -async function deleteObject(bucket, key) { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Delete Object - await objectManager.delete(key); - return true; -} - -async function deleteBucket(bucket) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Delete Bucket - await bucketManager.delete(bucket); - return true; -} - -test("delete object", async () => { - // Create bucket `delete-object-test-pass` - const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; - await createBucket(deleteTestBucket); - - try { - // Upload object `delete-object-test` - const objectNameToCreate = `delete-object-test`; - const uploaded = await uploadObject( - deleteTestBucket, - objectNameToCreate, - Buffer.from("delete object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [delete-object-test]`); - } - - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: deleteTestBucket }, - ); - - // Delete object `delete-object-test` - await objectManager.delete(objectNameToCreate); - - // List bucket and assert new object doesn't exist - const uploadedObject = await objectManager.get(objectNameToCreate); - assert.equal(uploadedObject, false); - } finally { - await deleteBucket(deleteTestBucket); - } -}); - -test("upload object", async () => { - // Create Bucket `create-object-test-pass - const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; - await createBucket(uploadTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadTestBucket, - `create-object-test`, - Buffer.from("upload object", "utf-8"), - ); - - assert.strictEqual(uploaded, true); - await deleteObject(uploadTestBucket, `create-object-test`); - } finally { - await deleteBucket(uploadTestBucket); - } -}); - -test("upload directory", async () => { - // Create Bucket `create-object-test-pass - const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; - await createBucket(uploadDirectoryTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadDirectoryTestBucket, - `create-directory-test`, - [ - { - path: "/testObjects/1.txt", - content: Buffer.from("upload test object", "utf-8"), - }, - { - path: "/testObjects/deep/1.txt", - content: Buffer.from("upload deep test object", "utf-8"), - }, - { - path: "/topLevel.txt", - content: Buffer.from("upload top level test object", "utf-8"), - }, - ], - ); - assert.strictEqual(uploaded, true); - await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); - } finally { - await deleteBucket(uploadDirectoryTestBucket); - } -}); - -test("upload directory relative paths", async () => { - // Create Bucket `create-object-test-pass - const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-relative-test-pass`; - await createBucket(uploadDirectoryTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadDirectoryTestBucket, - `create-directory-relative-test`, - [ - { - path: "testObjects/1.txt", - content: Buffer.from("upload test object", "utf-8"), - }, - { - path: "testObjects/deep/1.txt", - content: Buffer.from("upload deep test object", "utf-8"), - }, - { - path: "topLevel.txt", - content: Buffer.from("upload top level test object", "utf-8"), - }, - ], - ); - assert.strictEqual(uploaded, true); - await deleteObject(uploadDirectoryTestBucket, `create-directory-relative-test`); - } finally { - await deleteBucket(uploadDirectoryTestBucket); - } -}); - -test("download object", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); - const downloadStream = await objectManager.download(objectNameToCreate), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("download object using gateway", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); - const downloadStream = await objectManager.download(objectNameToCreate), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("list objects", async () => { - // Create bucket `list-objects-test-pass` - const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; - await createBucket(listTestBucket); - - try { - let createdObjectCount = 0; - while (createdObjectCount < 26) { - // Upload objects `list-object-test-[x]` - const objectNameToCreate = `list-object-test-${createdObjectCount}`; - await uploadObject( - listTestBucket, - objectNameToCreate, - Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), - ); - createdObjectCount++; - } - - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: listTestBucket }, - ); - - const objectList = await objectManager.list({ - MaxKeys: 50, - Prefix: `list-object-test-`, - }); - assert.equal(objectList.Contents.length, 26); - - let deletedObjectCount = 0; - while (deletedObjectCount < 26) { - // Delete objects `list-object-test-[x]` - const objectNameToDelete = `list-object-test-${deletedObjectCount}`; - await deleteObject(listTestBucket, objectNameToDelete); - deletedObjectCount++; - } - } finally { - await deleteBucket(listTestBucket); - } -}); - -test("copy object", async () => { - // Create bucket `copy-object-test-pass-src` - const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; - await createBucket(bucketSrc); - - try { - // Upload object `copy-object-test` - const objectNameToCreateSrc = `copy-object-test`; - const uploaded = await uploadObject( - bucketSrc, - objectNameToCreateSrc, - Buffer.from("copy object", "utf-8"), - ); - try { - assert.equal(uploaded, true); - - // Create bucket `copy-object-test-pass-dest` - const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; - await createBucket(bucketDest); - - try { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: bucketSrc }, - ); - - // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` - await objectManager.copy(objectNameToCreateSrc, bucketDest); - try { - // List bucket and assert new object exists - const copiedObject = await objectManager.get(objectNameToCreateSrc); - assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); - } finally { - await deleteObject(bucketDest, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketDest); - } - } finally { - await deleteObject(bucketSrc, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketSrc); - } -}); diff --git a/test/objectManager.spec.mjs b/test/objectManager.spec.mjs deleted file mode 100644 index 6c2bb22..0000000 --- a/test/objectManager.spec.mjs +++ /dev/null @@ -1,325 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { ObjectManager, BucketManager } from "../src/index.js"; -import * as Path from "node:path"; -import { writeFile } from "node:fs/promises"; -import { v4 as uuidv4 } from "uuid"; -import os from "node:os"; - -const TEST_PREFIX = Date.now(); - -async function createBucket(name) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket with name - const bucketNameToCreate = name; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - return typeof createdBucket !== "undefined"; -} - -async function uploadObject(bucket, key, body) { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Upload Object - await objectManager.upload(key, body); - - // Confirm Object Uploaded - const uploadedObject = await objectManager.get(key); - - return typeof uploadedObject !== "undefined"; -} - -async function deleteObject(bucket, key) { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Delete Object - await objectManager.delete(key); - return true; -} - -async function deleteBucket(bucket) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Delete Bucket - await bucketManager.delete(bucket); - return true; -} - -test("delete object", async () => { - // Create bucket `delete-object-test-pass` - const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; - await createBucket(deleteTestBucket); - - try { - // Upload object `delete-object-test` - const objectNameToCreate = `delete-object-test`; - const uploaded = await uploadObject( - deleteTestBucket, - objectNameToCreate, - Buffer.from("delete object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [delete-object-test]`); - } - - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: deleteTestBucket }, - ); - - // Delete object `delete-object-test` - await objectManager.delete(objectNameToCreate); - - // List bucket and assert new object doesn't exist - const uploadedObject = await objectManager.get(objectNameToCreate); - assert.equal(uploadedObject, false); - } finally { - await deleteBucket(deleteTestBucket); - } -}); - -test("upload object", async () => { - // Create Bucket `create-object-test-pass - const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; - await createBucket(uploadTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadTestBucket, - `create-object-test`, - Buffer.from("upload object", "utf-8"), - ); - - assert.strictEqual(uploaded, true); - await deleteObject(uploadTestBucket, `create-object-test`); - } finally { - await deleteBucket(uploadTestBucket); - } -}); - -test("upload directory", async () => { - // Create Bucket `create-object-test-pass - const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; - await createBucket(uploadDirectoryTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadDirectoryTestBucket, - `create-directory-test`, - [ - { - path: "/testObjects/1.txt", - content: Buffer.from("upload test object", "utf-8"), - }, - { - path: "/testObjects/deep/1.txt", - content: Buffer.from("upload deep test object", "utf-8"), - }, - { - path: "/topLevel.txt", - content: Buffer.from("upload top level test object", "utf-8"), - }, - ], - ); - assert.strictEqual(uploaded, true); - await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); - } finally { - await deleteBucket(uploadDirectoryTestBucket); - } -}); - -test("download object", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); - const downloadStream = await objectManager.download(objectNameToCreate), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("download object using gateway", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); - const downloadStream = await objectManager.download(objectNameToCreate), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("list objects", async () => { - // Create bucket `list-objects-test-pass` - const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; - await createBucket(listTestBucket); - - try { - let createdObjectCount = 0; - while (createdObjectCount < 26) { - // Upload objects `list-object-test-[x]` - const objectNameToCreate = `list-object-test-${createdObjectCount}`; - await uploadObject( - listTestBucket, - objectNameToCreate, - Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), - ); - createdObjectCount++; - } - - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: listTestBucket }, - ); - - const objectList = await objectManager.list({ - MaxKeys: 50, - Prefix: `list-object-test-`, - }); - assert.equal(objectList.Contents.length, 26); - - let deletedObjectCount = 0; - while (deletedObjectCount < 26) { - // Delete objects `list-object-test-[x]` - const objectNameToDelete = `list-object-test-${deletedObjectCount}`; - await deleteObject(listTestBucket, objectNameToDelete); - deletedObjectCount++; - } - } finally { - await deleteBucket(listTestBucket); - } -}); - -test("copy object", async () => { - // Create bucket `copy-object-test-pass-src` - const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; - await createBucket(bucketSrc); - - try { - // Upload object `copy-object-test` - const objectNameToCreateSrc = `copy-object-test`; - const uploaded = await uploadObject( - bucketSrc, - objectNameToCreateSrc, - Buffer.from("copy object", "utf-8"), - ); - try { - assert.equal(uploaded, true); - - // Create bucket `copy-object-test-pass-dest` - const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; - await createBucket(bucketDest); - - try { - // Initialize ObjectManager - const objectManager = new ObjectManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: bucketSrc }, - ); - - // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` - await objectManager.copy(objectNameToCreateSrc, bucketDest); - try { - // List bucket and assert new object exists - const copiedObject = await objectManager.get(objectNameToCreateSrc); - assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); - } finally { - await deleteObject(bucketDest, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketDest); - } - } finally { - await deleteObject(bucketSrc, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketSrc); - } -}); diff --git a/test/pinManager.spec.cjs b/test/pinManager.spec.cjs deleted file mode 100644 index e11ce61..0000000 --- a/test/pinManager.spec.cjs +++ /dev/null @@ -1,262 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const { BucketManager, PinManager } = require("../dist/index.js"); -const Path = require("node:path"); -const { writeFile } = require("node:fs/promises"); -const { v4: uuidv4 } = require("uuid"); -const os = require("node:os"); - -const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT", - TEST_CID_2 = "QmNXcMdXadLRTxLpHJMsGnaeKz26d2F6NgUDVWScp54EfC", - TEST_PREFIX = Date.now(); - -async function createBucket(name) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket with name - const bucketNameToCreate = name; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - return typeof createdBucket !== "undefined"; -} - -async function deleteBucket(bucket) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Delete Bucket - await bucketManager.delete(bucket); - return true; -} - -test("create pin", async () => { - const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, - testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await pinManager.delete(createdPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("replace pin with name", async () => { - const testBucketName = `${TEST_PREFIX}-replname-pin-test-pass`, - testPinName = `${TEST_PREFIX}-replace-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const replacedPin = await pinManager.replace( - createdPin.requestid, - TEST_CID_2, - { - name: `${testPinName}-replaced`, - }, - ); - assert.strictEqual(replacedPin.pin.cid, TEST_CID_2); - assert.strictEqual(replacedPin.pin.name, `${testPinName}-replaced`); - await pinManager.delete(replacedPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("replace pin without name", async () => { - const testBucketName = `${TEST_PREFIX}-replace-pin-test-pass`, - testPinName = `${TEST_PREFIX}-replace-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const replacedPin = await pinManager.replace( - createdPin.requestid, - TEST_CID_2, - ); - assert.strictEqual(replacedPin.pin.name, testPinName); - assert.strictEqual(replacedPin.pin.cid, TEST_CID_2); - await pinManager.delete(replacedPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("get pin", async () => { - const testBucketName = `${TEST_PREFIX}-get-pin-test-pass`, - testPinName = `${TEST_PREFIX}-get-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - try { - const queriedPin = await pinManager.get(createdPin.requestid); - assert.strictEqual(queriedPin.requestid, createdPin.requestid); - assert.strictEqual(queriedPin.pin.cid, TEST_CID_1); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("download pin", async () => { - const testBucketName = `${TEST_PREFIX}-download-pin-test-pass`, - testPinName = `${TEST_PREFIX}-download-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - gateway: { - endpoint: process.env.TEST_IPFS_GATEWAY, - }, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - try { - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const downloadStream = await pinManager.download(createdPin.pin.cid), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("download pin by reference", async () => { - const testBucketName = `${TEST_PREFIX}-download-ref-test-pass`, - testPinName = `${TEST_PREFIX}-download-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - gateway: { - endpoint: process.env.TEST_IPFS_GATEWAY, - }, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - try { - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const pinToDownload = await pinManager.get(createdPin.requestid), - downloadStream = await pinToDownload.download(), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("list pins", async () => { - const testBucketName = `${TEST_PREFIX}-list-pin-test-pass`, - testPinName = `${TEST_PREFIX}-list-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const existingPinList = await pinManager.list(), - countToCreate = 25; - let createdPins = []; - for (let i = 0; i < countToCreate; i++) { - createdPins.push( - await pinManager.create(`${testPinName}_${i}`, TEST_CID_1), - ); - } - try { - const pinList = await pinManager.list(); - assert.strictEqual(pinList.count, existingPinList.count + countToCreate); - } finally { - for (const createdPin of createdPins) { - await pinManager.delete(createdPin.requestid); - } - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("delete pin", async () => { - const testBucketName = `${TEST_PREFIX}-delete-pin-test-pass`, - testPinName = `${TEST_PREFIX}-delete-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await pinManager.delete(createdPin.requestid); - const deletedPin = await pinManager.get(createdPin.requestid); - assert.strictEqual(deletedPin, false); - } finally { - await deleteBucket(testBucketName); - } -}); diff --git a/test/pinManager.spec.mjs b/test/pinManager.spec.mjs deleted file mode 100644 index f42c2bb..0000000 --- a/test/pinManager.spec.mjs +++ /dev/null @@ -1,263 +0,0 @@ -import { test } from "node:test"; -import assert from "node:assert/strict"; -import { PinManager } from "../src/index.js"; -import { v4 as uuidv4 } from "uuid"; -import Path from "node:path"; -import os from "node:os"; -import { writeFile } from "node:fs/promises"; -import { BucketManager } from "../src/index.js"; - -const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT", - TEST_CID_2 = "QmNXcMdXadLRTxLpHJMsGnaeKz26d2F6NgUDVWScp54EfC", - TEST_PREFIX = Date.now(); - -async function createBucket(name) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket with name - const bucketNameToCreate = name; - await bucketManager.create(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await bucketManager.list(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - return typeof createdBucket !== "undefined"; -} - -async function deleteBucket(bucket) { - // Initialize BucketManager - const bucketManager = new BucketManager( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Delete Bucket - await bucketManager.delete(bucket); - return true; -} - -test("create pin", async () => { - const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, - testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await pinManager.delete(createdPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("replace pin with name", async () => { - const testBucketName = `${TEST_PREFIX}-replname-pin-test-pass`, - testPinName = `${TEST_PREFIX}-replace-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const replacedPin = await pinManager.replace( - createdPin.requestid, - TEST_CID_2, - { - name: `${testPinName}-replaced`, - }, - ); - assert.strictEqual(replacedPin.pin.cid, TEST_CID_2); - assert.strictEqual(replacedPin.pin.name, `${testPinName}-replaced`); - await pinManager.delete(replacedPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("replace pin without name", async () => { - const testBucketName = `${TEST_PREFIX}-replace-pin-test-pass`, - testPinName = `${TEST_PREFIX}-replace-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const replacedPin = await pinManager.replace( - createdPin.requestid, - TEST_CID_2, - ); - assert.strictEqual(replacedPin.pin.name, testPinName); - assert.strictEqual(replacedPin.pin.cid, TEST_CID_2); - await pinManager.delete(replacedPin.requestid); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("get pin", async () => { - const testBucketName = `${TEST_PREFIX}-get-pin-test-pass`, - testPinName = `${TEST_PREFIX}-get-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - try { - const queriedPin = await pinManager.get(createdPin.requestid); - assert.strictEqual(queriedPin.requestid, createdPin.requestid); - assert.strictEqual(queriedPin.pin.cid, TEST_CID_1); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("download pin", async () => { - const testBucketName = `${TEST_PREFIX}-download-pin-test-pass`, - testPinName = `${TEST_PREFIX}-download-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - gateway: { - endpoint: process.env.TEST_IPFS_GATEWAY, - }, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - try { - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const downloadStream = await pinManager.download(createdPin.pin.cid), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("download pin by reference", async () => { - const testBucketName = `${TEST_PREFIX}-download-ref-test-pass`, - testPinName = `${TEST_PREFIX}-download-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - gateway: { - endpoint: process.env.TEST_IPFS_GATEWAY, - }, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - try { - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - const pinToDownload = await pinManager.get(createdPin.requestid), - downloadStream = await pinToDownload.download(), - downloadFilename = uuidv4(), - downloadPath = Path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await pinManager.delete(createdPin.requestid); - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("list pins", async () => { - const testBucketName = `${TEST_PREFIX}-list-pin-test-pass`, - testPinName = `${TEST_PREFIX}-list-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const existingPinList = await pinManager.list(), - countToCreate = 25; - let createdPins = []; - for (let i = 0; i < countToCreate; i++) { - createdPins.push( - await pinManager.create(`${testPinName}_${i}`, TEST_CID_1), - ); - } - try { - const pinList = await pinManager.list(); - assert.strictEqual(pinList.count, existingPinList.count + countToCreate); - } finally { - for (const createdPin of createdPins) { - await pinManager.delete(createdPin.requestid); - } - } - } finally { - await deleteBucket(testBucketName); - } -}); - -test("delete pin", async () => { - const testBucketName = `${TEST_PREFIX}-delete-pin-test-pass`, - testPinName = `${TEST_PREFIX}-delete-pin-test-pass`, - pinManager = new PinManager( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await pinManager.create(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await pinManager.delete(createdPin.requestid); - const deletedPin = await pinManager.get(createdPin.requestid); - assert.strictEqual(deletedPin, false); - } finally { - await deleteBucket(testBucketName); - } -}); diff --git a/yarn.lock b/yarn.lock index 905c39f..fcffa50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,597 +2,645 @@ # yarn lockfile v1 -"@assemblyscript/loader@^0.9.4": - version "0.9.4" - resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" - integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== - -"@aws-crypto/crc32@3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz" - integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/crc32c@3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz" - integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/ie11-detection@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz" - integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== - dependencies: - tslib "^1.11.1" - -"@aws-crypto/sha1-browser@3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz" - integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-browser@3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz" - integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/sha256-js" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz" - integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/supports-web-crypto@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz" - integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/util@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz" - integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== +"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" - -"@aws-sdk/client-s3@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.478.0.tgz" - integrity sha512-OUpbCCnK71lQQ07BohJOx9ZER0rPqRAGOVIIVhNEkeN0uYFLzB7/o5a7+FEPUQXEd5rZRZgbxN5xEmnNW/0Waw== - dependencies: - "@aws-crypto/sha1-browser" "3.0.0" - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.478.0" - "@aws-sdk/core" "3.477.0" - "@aws-sdk/credential-provider-node" "3.478.0" - "@aws-sdk/middleware-bucket-endpoint" "3.470.0" - "@aws-sdk/middleware-expect-continue" "3.468.0" - "@aws-sdk/middleware-flexible-checksums" "3.468.0" - "@aws-sdk/middleware-host-header" "3.468.0" - "@aws-sdk/middleware-location-constraint" "3.468.0" - "@aws-sdk/middleware-logger" "3.468.0" - "@aws-sdk/middleware-recursion-detection" "3.468.0" - "@aws-sdk/middleware-sdk-s3" "3.474.0" - "@aws-sdk/middleware-signing" "3.468.0" - "@aws-sdk/middleware-ssec" "3.468.0" - "@aws-sdk/middleware-user-agent" "3.478.0" - "@aws-sdk/region-config-resolver" "3.470.0" - "@aws-sdk/signature-v4-multi-region" "3.474.0" - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-endpoints" "3.478.0" - "@aws-sdk/util-user-agent-browser" "3.468.0" - "@aws-sdk/util-user-agent-node" "3.470.0" - "@aws-sdk/xml-builder" "3.472.0" - "@smithy/config-resolver" "^2.0.21" - "@smithy/core" "^1.2.0" - "@smithy/eventstream-serde-browser" "^2.0.15" - "@smithy/eventstream-serde-config-resolver" "^2.0.15" - "@smithy/eventstream-serde-node" "^2.0.15" - "@smithy/fetch-http-handler" "^2.3.1" - "@smithy/hash-blob-browser" "^2.0.16" - "@smithy/hash-node" "^2.0.17" - "@smithy/hash-stream-node" "^2.0.17" - "@smithy/invalid-dependency" "^2.0.15" - "@smithy/md5-js" "^2.0.17" - "@smithy/middleware-content-length" "^2.0.17" - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-retry" "^2.0.24" - "@smithy/middleware-serde" "^2.0.15" - "@smithy/middleware-stack" "^2.0.9" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/node-http-handler" "^2.2.1" - "@smithy/protocol-http" "^3.0.11" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - "@smithy/util-base64" "^2.0.1" - "@smithy/util-body-length-browser" "^2.0.1" - "@smithy/util-body-length-node" "^2.1.0" - "@smithy/util-defaults-mode-browser" "^2.0.22" - "@smithy/util-defaults-mode-node" "^2.0.29" - "@smithy/util-endpoints" "^1.0.7" - "@smithy/util-retry" "^2.0.8" - "@smithy/util-stream" "^2.0.23" - "@smithy/util-utf8" "^2.0.2" - "@smithy/util-waiter" "^2.0.15" - fast-xml-parser "4.2.5" - tslib "^2.5.0" - -"@aws-sdk/client-sso@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.478.0.tgz" - integrity sha512-Jxy9cE1JMkPR0PklCpq3cORHnZq/Z4klhSTNGgZNeBWovMa+plor52kyh8iUNHKl3XEJvTbHM7V+dvrr/x0P1g== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.477.0" - "@aws-sdk/middleware-host-header" "3.468.0" - "@aws-sdk/middleware-logger" "3.468.0" - "@aws-sdk/middleware-recursion-detection" "3.468.0" - "@aws-sdk/middleware-user-agent" "3.478.0" - "@aws-sdk/region-config-resolver" "3.470.0" - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-endpoints" "3.478.0" - "@aws-sdk/util-user-agent-browser" "3.468.0" - "@aws-sdk/util-user-agent-node" "3.470.0" - "@smithy/config-resolver" "^2.0.21" - "@smithy/core" "^1.2.0" - "@smithy/fetch-http-handler" "^2.3.1" - "@smithy/hash-node" "^2.0.17" - "@smithy/invalid-dependency" "^2.0.15" - "@smithy/middleware-content-length" "^2.0.17" - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-retry" "^2.0.24" - "@smithy/middleware-serde" "^2.0.15" - "@smithy/middleware-stack" "^2.0.9" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/node-http-handler" "^2.2.1" - "@smithy/protocol-http" "^3.0.11" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - "@smithy/util-base64" "^2.0.1" - "@smithy/util-body-length-browser" "^2.0.1" - "@smithy/util-body-length-node" "^2.1.0" - "@smithy/util-defaults-mode-browser" "^2.0.22" - "@smithy/util-defaults-mode-node" "^2.0.29" - "@smithy/util-endpoints" "^1.0.7" - "@smithy/util-retry" "^2.0.8" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" - -"@aws-sdk/client-sts@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.478.0.tgz" - integrity sha512-D+QID0dYzmn9dcxgKP3/nMndUqiQbDLsqI0Zf2pG4MW5gPhVNKlDGIV3Ztz8SkMjzGJExNOLW2L569o8jshJVw== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.477.0" - "@aws-sdk/credential-provider-node" "3.478.0" - "@aws-sdk/middleware-host-header" "3.468.0" - "@aws-sdk/middleware-logger" "3.468.0" - "@aws-sdk/middleware-recursion-detection" "3.468.0" - "@aws-sdk/middleware-user-agent" "3.478.0" - "@aws-sdk/region-config-resolver" "3.470.0" - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-endpoints" "3.478.0" - "@aws-sdk/util-user-agent-browser" "3.468.0" - "@aws-sdk/util-user-agent-node" "3.470.0" - "@smithy/config-resolver" "^2.0.21" - "@smithy/core" "^1.2.0" - "@smithy/fetch-http-handler" "^2.3.1" - "@smithy/hash-node" "^2.0.17" - "@smithy/invalid-dependency" "^2.0.15" - "@smithy/middleware-content-length" "^2.0.17" - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-retry" "^2.0.24" - "@smithy/middleware-serde" "^2.0.15" - "@smithy/middleware-stack" "^2.0.9" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/node-http-handler" "^2.2.1" - "@smithy/protocol-http" "^3.0.11" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - "@smithy/util-base64" "^2.0.1" - "@smithy/util-body-length-browser" "^2.0.1" - "@smithy/util-body-length-node" "^2.1.0" - "@smithy/util-defaults-mode-browser" "^2.0.22" - "@smithy/util-defaults-mode-node" "^2.0.29" - "@smithy/util-endpoints" "^1.0.7" - "@smithy/util-middleware" "^2.0.8" - "@smithy/util-retry" "^2.0.8" - "@smithy/util-utf8" "^2.0.2" - fast-xml-parser "4.2.5" - tslib "^2.5.0" - -"@aws-sdk/core@3.477.0": - version "3.477.0" - resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.477.0.tgz" - integrity sha512-o0434EH+d1BxHZvgG7z8vph2SYefciQ5RnJw2MgvETGnthgqsnI4nnNJLSw0FVeqCeS18n6vRtzqlGYR2YPCNg== - dependencies: - "@smithy/core" "^1.2.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/signature-v4" "^2.0.0" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-env@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz" - integrity sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-ini@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.478.0.tgz" - integrity sha512-SsrYEYUvTG9ZoPC+zB19AnVoOKID+QIEHJDIi1GCZXW5kTVyr1saTVm4orG2TjYvbHQMddsWtHOvGYXZWAYMbw== - dependencies: - "@aws-sdk/credential-provider-env" "3.468.0" - "@aws-sdk/credential-provider-process" "3.468.0" - "@aws-sdk/credential-provider-sso" "3.478.0" - "@aws-sdk/credential-provider-web-identity" "3.468.0" - "@aws-sdk/types" "3.468.0" - "@smithy/credential-provider-imds" "^2.0.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/shared-ini-file-loader" "^2.0.6" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-node@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.478.0.tgz" - integrity sha512-nwDutJYeHiIZCQDgKIUrsgwAWTil0mNe+cbd+j8fi+wwxkWUzip+F0+z02molJ8WrUUKNRhqB1V5aVx7IranuA== - dependencies: - "@aws-sdk/credential-provider-env" "3.468.0" - "@aws-sdk/credential-provider-ini" "3.478.0" - "@aws-sdk/credential-provider-process" "3.468.0" - "@aws-sdk/credential-provider-sso" "3.478.0" - "@aws-sdk/credential-provider-web-identity" "3.468.0" - "@aws-sdk/types" "3.468.0" - "@smithy/credential-provider-imds" "^2.0.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/shared-ini-file-loader" "^2.0.6" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-process@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz" - integrity sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/shared-ini-file-loader" "^2.0.6" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-sso@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.478.0.tgz" - integrity sha512-LsDShG51X/q+s5ZFN7kHVqrd8ZHdyEyHqdhoocmRvvw2Dif50M0AqQfvCrW1ndj5CNzXO4x/eH8EK5ZOVlS6Sg== - dependencies: - "@aws-sdk/client-sso" "3.478.0" - "@aws-sdk/token-providers" "3.478.0" - "@aws-sdk/types" "3.468.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/shared-ini-file-loader" "^2.0.6" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-web-identity@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz" - integrity sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/lib-storage@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.478.0.tgz" - integrity sha512-R1D+hX8Lea9mBZqj2A4hWkSNGCTv5pCsX/+fmfnFtmKL4gPn2MZ1GtnI6Rnk0zyTrQL94SpVc6CcEvhWsm5oiQ== - dependencies: - "@smithy/abort-controller" "^2.0.1" - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/smithy-client" "^2.1.18" - buffer "5.6.0" - events "3.3.0" - stream-browserify "3.0.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-bucket-endpoint@3.470.0": - version "3.470.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.470.0.tgz" - integrity sha512-vLXXNWtsRmEIwzJ9HUQfIuTNAsEzvCv0Icsnkvt2BiBZXnmHdp2vIC3e3+kfy1D7dVQloXqMmnfcLu/BUMu2Jw== - dependencies: - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-arn-parser" "3.465.0" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - "@smithy/util-config-provider" "^2.0.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-expect-continue@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.468.0.tgz" - integrity sha512-/wmLjmfgeulxhhmnxX3X3N933TvGsYckVIFjAtDSpLjqkbwzEcNiLq7AdmNJ4BfxG0MCMgcht561DCCD19x8Bg== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-flexible-checksums@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.468.0.tgz" - integrity sha512-LQwL/N5MCj3Y5keLLewHTqeAXUIMsHFZyxDXRm/uxrOon9ufLKDvGvzAmfwn1/CuSUo66ZfT8VPSA4BsC90RtA== - dependencies: - "@aws-crypto/crc32" "3.0.0" - "@aws-crypto/crc32c" "3.0.0" - "@aws-sdk/types" "3.468.0" - "@smithy/is-array-buffer" "^2.0.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" - -"@aws-sdk/middleware-host-header@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz" - integrity sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-location-constraint@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.468.0.tgz" - integrity sha512-0gBX/lDynQr4YIhM9h1dVnkVWqrg+34iOCVIUq8jHxzUzgZWglGkG9lHGGg0r1xkLTmegeoo1OKH8wrQ6n33Cg== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-logger@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz" - integrity sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-recursion-detection@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz" - integrity sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-sdk-s3@3.474.0": - version "3.474.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.474.0.tgz" - integrity sha512-62aAo/8u5daIabeJ+gseYeHeShe9eYH6mH+kfWmLsHybXCCv1EaD/ZkdXWNhL0HZ3bUI1z1SF1p8jjTAWALnwA== - dependencies: - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-arn-parser" "3.465.0" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/protocol-http" "^3.0.11" - "@smithy/signature-v4" "^2.0.0" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - "@smithy/util-config-provider" "^2.0.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-signing@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz" - integrity sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/property-provider" "^2.0.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/signature-v4" "^2.0.0" - "@smithy/types" "^2.7.0" - "@smithy/util-middleware" "^2.0.8" - tslib "^2.5.0" - -"@aws-sdk/middleware-ssec@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.468.0.tgz" - integrity sha512-y1qLW24wRkOGBTK5d6eJXf6d8HYo4rzT4a1mNDN1rd18NSffwQ6Yke5qeUiIaxa0y/l+FvvNYErbhYtij2rJoQ== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-user-agent@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz" - integrity sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw== - dependencies: - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-endpoints" "3.478.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/region-config-resolver@3.470.0": - version "3.470.0" - resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz" - integrity sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ== - dependencies: - "@smithy/node-config-provider" "^2.1.8" - "@smithy/types" "^2.7.0" - "@smithy/util-config-provider" "^2.0.0" - "@smithy/util-middleware" "^2.0.8" - tslib "^2.5.0" - -"@aws-sdk/signature-v4-multi-region@3.474.0": - version "3.474.0" - resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.474.0.tgz" - integrity sha512-93OWRQgTJZASXLrlUNX7mmXknNkYxFYldRLARmYQccONmnIqgYQW0lQj8BFwqkHJTzSMik3/UsU0SHKwZ9ynYA== - dependencies: - "@aws-sdk/middleware-sdk-s3" "3.474.0" - "@aws-sdk/types" "3.468.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/signature-v4" "^2.0.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/token-providers@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.478.0.tgz" - integrity sha512-7b5tj1y/wGHZIZ+ckjOUKgKrMuCJMF/G1UKZKIqqdekeEsjcThbvoxAMeY0FEowu2ODVk/ggOmpBFxcu0iYd6A== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/middleware-host-header" "3.468.0" - "@aws-sdk/middleware-logger" "3.468.0" - "@aws-sdk/middleware-recursion-detection" "3.468.0" - "@aws-sdk/middleware-user-agent" "3.478.0" - "@aws-sdk/region-config-resolver" "3.470.0" - "@aws-sdk/types" "3.468.0" - "@aws-sdk/util-endpoints" "3.478.0" - "@aws-sdk/util-user-agent-browser" "3.468.0" - "@aws-sdk/util-user-agent-node" "3.470.0" - "@smithy/config-resolver" "^2.0.21" - "@smithy/fetch-http-handler" "^2.3.1" - "@smithy/hash-node" "^2.0.17" - "@smithy/invalid-dependency" "^2.0.15" - "@smithy/middleware-content-length" "^2.0.17" - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-retry" "^2.0.24" - "@smithy/middleware-serde" "^2.0.15" - "@smithy/middleware-stack" "^2.0.9" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/node-http-handler" "^2.2.1" - "@smithy/property-provider" "^2.0.0" - "@smithy/protocol-http" "^3.0.11" - "@smithy/shared-ini-file-loader" "^2.0.6" - "@smithy/smithy-client" "^2.1.18" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - "@smithy/util-base64" "^2.0.1" - "@smithy/util-body-length-browser" "^2.0.1" - "@smithy/util-body-length-node" "^2.1.0" - "@smithy/util-defaults-mode-browser" "^2.0.22" - "@smithy/util-defaults-mode-node" "^2.0.29" - "@smithy/util-endpoints" "^1.0.7" - "@smithy/util-retry" "^2.0.8" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" - -"@aws-sdk/types@3.468.0", "@aws-sdk/types@^3.222.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz" - integrity sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@aws-sdk/util-arn-parser@3.465.0": - version "3.465.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.465.0.tgz" - integrity sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw== - dependencies: - tslib "^2.5.0" - -"@aws-sdk/util-endpoints@3.478.0": - version "3.478.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz" - integrity sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g== - dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/util-endpoints" "^1.0.7" - tslib "^2.5.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-s3@3.842.0": + version "3.842.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.842.0.tgz" + integrity sha512-T5Rh72Rcq1xIaM8KkTr1Wpr7/WPCYO++KrM+/Em0rq2jxpjMMhj77ITpgH7eEmNxWmwIndTwqpgfmbpNfk7Gbw== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.840.0" + "@aws-sdk/credential-provider-node" "3.840.0" + "@aws-sdk/middleware-bucket-endpoint" "3.840.0" + "@aws-sdk/middleware-expect-continue" "3.840.0" + "@aws-sdk/middleware-flexible-checksums" "3.840.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-location-constraint" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-sdk-s3" "3.840.0" + "@aws-sdk/middleware-ssec" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.840.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/signature-v4-multi-region" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.840.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.840.0" + "@aws-sdk/xml-builder" "3.821.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.6.0" + "@smithy/eventstream-serde-browser" "^4.0.4" + "@smithy/eventstream-serde-config-resolver" "^4.1.2" + "@smithy/eventstream-serde-node" "^4.0.4" + "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/hash-blob-browser" "^4.0.4" + "@smithy/hash-node" "^4.0.4" + "@smithy/hash-stream-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/md5-js" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.13" + "@smithy/middleware-retry" "^4.1.14" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.0.6" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.21" + "@smithy/util-defaults-mode-node" "^4.0.21" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-stream" "^4.2.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.6" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + +"@aws-sdk/client-sso@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz" + integrity sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.840.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.840.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.840.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.840.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.6.0" + "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/hash-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.13" + "@smithy/middleware-retry" "^4.1.14" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.0.6" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.21" + "@smithy/util-defaults-mode-node" "^4.0.21" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz" + integrity sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@aws-sdk/xml-builder" "3.821.0" + "@smithy/core" "^3.6.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-utf8" "^4.0.0" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/core@3.844.0": + version "3.844.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz" + integrity sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw== + dependencies: + "@aws-sdk/types" "3.840.0" + "@aws-sdk/xml-builder" "3.821.0" + "@smithy/core" "^3.7.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-utf8" "^4.0.0" + fast-xml-parser "5.2.5" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz" + integrity sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz" + integrity sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/node-http-handler" "^4.0.6" + "@smithy/property-provider" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/util-stream" "^4.2.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz" + integrity sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/credential-provider-env" "3.840.0" + "@aws-sdk/credential-provider-http" "3.840.0" + "@aws-sdk/credential-provider-process" "3.840.0" + "@aws-sdk/credential-provider-sso" "3.840.0" + "@aws-sdk/credential-provider-web-identity" "3.840.0" + "@aws-sdk/nested-clients" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz" + integrity sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg== + dependencies: + "@aws-sdk/credential-provider-env" "3.840.0" + "@aws-sdk/credential-provider-http" "3.840.0" + "@aws-sdk/credential-provider-ini" "3.840.0" + "@aws-sdk/credential-provider-process" "3.840.0" + "@aws-sdk/credential-provider-sso" "3.840.0" + "@aws-sdk/credential-provider-web-identity" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz" + integrity sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz" + integrity sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA== + dependencies: + "@aws-sdk/client-sso" "3.840.0" + "@aws-sdk/core" "3.840.0" + "@aws-sdk/token-providers" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz" + integrity sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/nested-clients" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-bucket-endpoint@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz" + integrity sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ== + dependencies: + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-arn-parser" "3.804.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-expect-continue@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz" + integrity sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-flexible-checksums@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.840.0.tgz" + integrity sha512-Kg/o2G6o72sdoRH0J+avdcf668gM1bp6O4VeEXpXwUj/urQnV5qiB2q1EYT110INHUKWOLXPND3sQAqh6sTqHw== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-crypto/util" "5.2.0" + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-stream" "^4.2.2" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz" + integrity sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-location-constraint@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz" + integrity sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz" + integrity sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz" + integrity sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-sdk-s3@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.840.0.tgz" + integrity sha512-rOUji7CayWN3O09zvvgLzDVQe0HiJdZkxoTS6vzOS3WbbdT7joGdVtAJHtn+x776QT3hHzbKU5gnfhel0o6gQA== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-arn-parser" "3.804.0" + "@smithy/core" "^3.6.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-stream" "^4.2.2" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-sdk-s3@3.844.0": + version "3.844.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.844.0.tgz" + integrity sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung== + dependencies: + "@aws-sdk/core" "3.844.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-arn-parser" "3.804.0" + "@smithy/core" "^3.7.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-stream" "^4.2.3" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-ssec@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz" + integrity sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz" + integrity sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.840.0" + "@smithy/core" "^3.6.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz" + integrity sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.840.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.840.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.840.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.840.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.6.0" + "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/hash-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.13" + "@smithy/middleware-retry" "^4.1.14" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.0.6" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.21" + "@smithy/util-defaults-mode-node" "^4.0.21" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz" + integrity sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + tslib "^2.6.2" + +"@aws-sdk/s3-request-presigner@3.844.0": + version "3.844.0" + resolved "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.844.0.tgz" + integrity sha512-i953TKW1rXbd9G2xEgWoJZDoF0Z1ONRlrXkOKDGOrY/uQhAIPNDz5k6tFcXG5oIaLWW197ShENv3CeEJnhfh3g== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.844.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-format-url" "3.840.0" + "@smithy/middleware-endpoint" "^4.1.14" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/signature-v4-multi-region@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.840.0.tgz" + integrity sha512-8AoVgHrkSfhvGPtwx23hIUO4MmMnux2pjnso1lrLZGqxfElM6jm2w4jTNLlNXk8uKHGyX89HaAIuT0lL6dJj9g== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/signature-v4-multi-region@3.844.0": + version "3.844.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.844.0.tgz" + integrity sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.844.0" + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz" + integrity sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg== + dependencies: + "@aws-sdk/core" "3.840.0" + "@aws-sdk/nested-clients" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/types@3.840.0", "@aws-sdk/types@^3.222.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz" + integrity sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA== + dependencies: + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@aws-sdk/util-arn-parser@3.804.0": + version "3.804.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz" + integrity sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz" + integrity sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + "@smithy/util-endpoints" "^3.0.6" + tslib "^2.6.2" + +"@aws-sdk/util-format-url@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz" + integrity sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/querystring-builder" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.465.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz" - integrity sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw== + version "3.804.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz" + integrity sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.468.0": - version "3.468.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz" - integrity sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig== +"@aws-sdk/util-user-agent-browser@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz" + integrity sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ== dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/types" "^2.7.0" + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" bowser "^2.11.0" - tslib "^2.5.0" + tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.470.0": - version "3.470.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz" - integrity sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ== +"@aws-sdk/util-user-agent-node@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz" + integrity sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ== dependencies: - "@aws-sdk/types" "3.468.0" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@aws-sdk/middleware-user-agent" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== +"@aws-sdk/xml-builder@3.821.0": + version "3.821.0" + resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz" + integrity sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA== dependencies: - tslib "^2.3.1" - -"@aws-sdk/xml-builder@3.472.0": - version "3.472.0" - resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.472.0.tgz" - integrity sha512-PwjVxz1hr9up8QkddabuScPZ/d5aDHgvHYgK4acHYzltXL4wngfvimi5ZqXTzVWF2QANxHmWnHUr45QJX71oJQ== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" "@babel/parser@^7.20.15": version "7.23.6" @@ -613,12 +661,12 @@ "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== "@dabh/diagnostics@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== dependencies: colorspace "1.1.x" @@ -647,7 +695,7 @@ "@esbuild/darwin-arm64@0.19.12": version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== "@esbuild/darwin-x64@0.19.12": @@ -707,7 +755,7 @@ "@esbuild/linux-x64@0.19.12": version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== "@esbuild/netbsd-x64@0.19.12": @@ -740,132 +788,7 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@helia/car@1.0.4": - version "1.0.4" - resolved "https://registry.npmjs.org/@helia/car/-/car-1.0.4.tgz" - integrity sha512-HcHMC/eTRCFt3jrLkMvqKD7Og92PpNoBZTMQ9R+dOvtyIlZ2iG4zYRm2DipPdDi+OvXCqaPNg0oJxDx5fBnjRw== - dependencies: - "@helia/interface" "^2.0.0" - "@ipld/car" "^5.1.1" - "@ipld/dag-pb" "^4.0.0" - "@libp2p/interfaces" "^3.3.1" - cborg "^4.0.3" - interface-blockstore "^5.0.0" - it-map "^3.0.3" - multiformats "^12.0.1" - p-defer "^4.0.0" - p-queue "^7.3.4" - progress-events "^1.0.0" - -"@helia/interface@^2.0.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@helia/interface/-/interface-2.1.0.tgz" - integrity sha512-Z7PwuDIR0BODfSMzYcdzgdTYLsshCawAoPvGuuazvBddWSD9y82/QBmsWp6CTkyM/ziEaWbz5wERmRS+wejDLg== - dependencies: - "@libp2p/interface" "^0.1.1" - interface-blockstore "^5.0.0" - interface-datastore "^8.0.0" - interface-store "^5.0.1" - ipfs-bitswap "^19.0.0" - multiformats "^12.0.1" - progress-events "^1.0.0" - -"@helia/interface@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@helia/interface/-/interface-4.0.1.tgz#45ecc2aab4a03503bcc0cb269094741240a17b65" - integrity sha512-tp9dLlog9x5C/+gE4FF452slemnTQtpS3RneGOatx51nDaE76/HHOmW1hIAASuFtjPHeg/R9BAM8UIX4DEffsg== - dependencies: - "@libp2p/interface" "^1.1.4" - interface-blockstore "^5.2.10" - interface-datastore "^8.2.11" - interface-store "^5.1.8" - multiformats "^13.1.0" - progress-events "^1.0.0" - -"@helia/mfs@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@helia/mfs/-/mfs-3.0.1.tgz#a24b26671d4543997594f93678905a7244c79bf7" - integrity sha512-2/ZlP1jQ787Tb1P86LBBL2UBSxX7sdvD/kAzbWRxFELJquURVgiJd3stFlFsv6PSN/7x0991H8WZAlKZ0oZt3Q== - dependencies: - "@helia/unixfs" "^3.0.1" - "@libp2p/interfaces" "^3.3.2" - "@libp2p/logger" "^4.0.7" - interface-blockstore "^5.2.10" - interface-datastore "^8.2.11" - ipfs-unixfs "^11.1.3" - ipfs-unixfs-exporter "^13.5.0" - ipfs-unixfs-importer "^15.2.4" - multiformats "^13.1.0" - -"@helia/unixfs@1.4.3": - version "1.4.3" - resolved "https://registry.npmjs.org/@helia/unixfs/-/unixfs-1.4.3.tgz" - integrity sha512-jS0En8fGhb01XH+nnxo3kQsmc1lwBEdlttAZFvTo7HCjBGPNFuaYdwTqF9S1wMVWV2fWqj7eS2zBZZa0MDsi1Q== - dependencies: - "@helia/interface" "^2.0.0" - "@ipld/dag-pb" "^4.0.0" - "@libp2p/interface" "^0.1.2" - "@libp2p/logger" "^3.0.2" - "@multiformats/murmur3" "^2.1.2" - hamt-sharding "^3.0.2" - interface-blockstore "^5.0.0" - ipfs-unixfs "^11.0.0" - ipfs-unixfs-exporter "^13.1.0" - ipfs-unixfs-importer "^15.1.0" - it-glob "^2.0.4" - it-last "^3.0.1" - it-pipe "^3.0.1" - merge-options "^3.0.4" - multiformats "^12.1.1" - progress-events "^1.0.0" - sparse-array "^1.3.2" - -"@helia/unixfs@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@helia/unixfs/-/unixfs-3.0.1.tgz#9643ff1d531990664c7a9e5c18fad99143ef4b99" - integrity sha512-NgT0gk3oswUK+8IEnJDl6IGv5catSQq6IQ1VrO68ZBpJPpo49CyFCqN5CO8IC3QL3wi4JyJ0sTLXemMVkUsTVA== - dependencies: - "@helia/interface" "^4.0.1" - "@ipld/dag-pb" "^4.1.0" - "@libp2p/interface" "^1.1.4" - "@libp2p/logger" "^4.0.7" - "@multiformats/murmur3" "^2.1.8" - hamt-sharding "^3.0.6" - interface-blockstore "^5.2.10" - ipfs-unixfs "^11.1.3" - ipfs-unixfs-exporter "^13.5.0" - ipfs-unixfs-importer "^15.2.4" - it-all "^3.0.4" - it-glob "^2.0.6" - it-last "^3.0.4" - it-pipe "^3.0.1" - merge-options "^3.0.4" - multiformats "^13.1.0" - progress-events "^1.0.0" - sparse-array "^1.3.2" - uint8arrays "^5.0.2" - -"@ipld/car@5.2.4": - version "5.2.4" - resolved "https://registry.npmjs.org/@ipld/car/-/car-5.2.4.tgz" - integrity sha512-YoVXE/o5HLXKi/Oqh9Nhcn423sdn9brRFKnbUid68/1D332/XINcoyCTvBluFcCw/9IeiTx+sEAV+onXZ/A4eA== - dependencies: - "@ipld/dag-cbor" "^9.0.0" - cborg "^4.0.0" - multiformats "^12.1.0" - varint "^6.0.0" - -"@ipld/car@^5.1.1": - version "5.2.6" - resolved "https://registry.npmjs.org/@ipld/car/-/car-5.2.6.tgz" - integrity sha512-ZiIYan7UFLLQsR90GpKOrZ0t6/6owrevJI7dCG8McNj0zUO4vGzsPumpKRBP4pdBgek4oXt4TbFOwxqTPEh5mA== - dependencies: - "@ipld/dag-cbor" "^9.0.7" - cborg "^4.0.5" - multiformats "^13.0.0" - varint "^6.0.0" - -"@ipld/dag-cbor@^9.0.0", "@ipld/dag-cbor@^9.0.7": +"@ipld/dag-cbor@^9.0.0": version "9.1.0" resolved "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.1.0.tgz" integrity sha512-7pMKjBaapEh+1Nk/1umPPhQGT6znb5E71lke2ekxlcuVZLLrPPdDSy0UAMwWgj3a28cjir/ZJ6CQH2DEs3DUOQ== @@ -873,9 +796,9 @@ cborg "^4.0.0" multiformats "^13.0.0" -"@ipld/dag-json@^10.1.7": +"@ipld/dag-json@^10.0.0": version "10.2.0" - resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-10.2.0.tgz#32468182ce510284aae75a07e33b3a0da284994e" + resolved "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.0.tgz" integrity sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA== dependencies: cborg "^4.0.0" @@ -888,13 +811,6 @@ dependencies: multiformats "^12.0.1" -"@ipld/dag-pb@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.0.tgz#4ebec92eeb9e8f317b8ef971221c6dac7b12b302" - integrity sha512-LJU451Drqs5zjFm7jI4Hs3kHlilOqkjcSfPiQgVsZnWaYb2C7YdfhnclrVn/X+ucKejlU9BL3+gXFCZUXkMuCg== - dependencies: - multiformats "^13.1.0" - "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" @@ -954,122 +870,103 @@ dependencies: lodash "^4.17.21" -"@libp2p/interface@^0.1.1", "@libp2p/interface@^0.1.2", "@libp2p/interface@^0.1.6": - version "0.1.6" - resolved "https://registry.npmjs.org/@libp2p/interface/-/interface-0.1.6.tgz" - integrity sha512-Lzc5cS/hXuoXhuAbVIxJIHLCYmfPcbU0vVgrpMoiP1Qb2Q3ETU4A46GB8s8mWXgSU6tr9RcqerUqzFYD6+OAag== - dependencies: - "@multiformats/multiaddr" "^12.1.5" - abortable-iterator "^5.0.1" - it-pushable "^3.2.0" - it-stream-types "^2.0.1" - multiformats "^12.0.1" - p-defer "^4.0.0" - race-signal "^1.0.0" - uint8arraylist "^2.4.3" - -"@libp2p/interface@^1.0.0", "@libp2p/interface@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@libp2p/interface/-/interface-1.0.2.tgz" - integrity sha512-z/3Yyg+7cVyzRXwzdrDkJd7YmNaLE9iZjQaixo5luI/n9uk5OFFjb9ulAsNqpq8V1xylCo2DXIC7f94KClwzVw== - dependencies: - "@multiformats/multiaddr" "^12.1.10" - it-pushable "^3.2.1" - it-stream-types "^2.0.1" - multiformats "^12.1.3" - uint8arraylist "^2.4.3" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@libp2p/crypto@^5.0.0", "@libp2p/crypto@^5.1.7": + version "5.1.7" + resolved "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.7.tgz" + integrity sha512-7DO0piidLEKfCuNfS420BlHG0e2tH7W/zugdsPSiC/1Apa/s1B1dBkaIEgfDkGjrRP4S/8Or86Rtq7zXeEu67g== + dependencies: + "@libp2p/interface" "^2.10.5" + "@noble/curves" "^1.9.1" + "@noble/hashes" "^1.8.0" + multiformats "^13.3.6" + protons-runtime "^5.5.0" + uint8arraylist "^2.4.8" + uint8arrays "^5.1.0" -"@libp2p/interface@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-1.1.4.tgz#21c7bbbe7628419d1e4902f0c953db1423b0f40f" - integrity sha512-gJXQycTF50tI02X/IlReAav4XoGPs3Yr917vNXsTUsZQRzQaPjbvKfXqA5hkLFpZ1lnxQ8wto/EVw4ca4XaL1A== +"@libp2p/interface@^2.0.0", "@libp2p/interface@^2.10.5": + version "2.10.5" + resolved "https://registry.npmjs.org/@libp2p/interface/-/interface-2.10.5.tgz" + integrity sha512-Z52n04Mph/myGdwyExbFi5S/HqrmZ9JOmfLc2v4r2Cik3GRdw98vrGH19PFvvwjLwAjaqsweCtlGaBzAz09YDw== dependencies: - "@multiformats/multiaddr" "^12.1.14" + "@multiformats/dns" "^1.0.6" + "@multiformats/multiaddr" "^12.4.4" it-pushable "^3.2.3" - it-stream-types "^2.0.1" - multiformats "^13.1.0" - progress-events "^1.0.0" + it-stream-types "^2.0.2" + main-event "^1.0.1" + multiformats "^13.3.6" + progress-events "^1.0.1" uint8arraylist "^2.4.8" -"@libp2p/interfaces@^3.3.1", "@libp2p/interfaces@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-3.3.2.tgz" - integrity sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g== +"@libp2p/logger@^5.0.0": + version "5.1.21" + resolved "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.21.tgz" + integrity sha512-V1TWlZM5BuKkiGQ7En4qOnseVP82JwDIpIfNjceUZz1ArL32A5HXJjLQnJchkZ3VW8PVciJzUos/vP6slhPY6Q== + dependencies: + "@libp2p/interface" "^2.10.5" + "@multiformats/multiaddr" "^12.4.4" + interface-datastore "^8.3.1" + multiformats "^13.3.6" + weald "^1.0.4" -"@libp2p/logger@^3.0.1", "@libp2p/logger@^3.0.2": - version "3.1.0" - resolved "https://registry.npmjs.org/@libp2p/logger/-/logger-3.1.0.tgz" - integrity sha512-qJbJBAhxHVsRBtQSOIkSLi0lskUSFjzE+zm0QvoyxzZKSz+mX41mZLbnofPIVOVauoDQ40dXpe7WDUOq8AbiQQ== +"@libp2p/peer-id@^5.0.0": + version "5.1.8" + resolved "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.8.tgz" + integrity sha512-pGaM4BwjnXdGtAtd84L4/wuABpsnFYE+AQ+h3GxNFme0IsTaTVKWd1jBBE5YFeKHBHGUOhF3TlHsdjFfjQA7TA== dependencies: - "@libp2p/interface" "^0.1.6" - "@multiformats/multiaddr" "^12.1.5" - debug "^4.3.4" - interface-datastore "^8.2.0" - multiformats "^12.0.1" + "@libp2p/crypto" "^5.1.7" + "@libp2p/interface" "^2.10.5" + multiformats "^13.3.6" + uint8arrays "^5.1.0" -"@libp2p/logger@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@libp2p/logger/-/logger-4.0.2.tgz" - integrity sha512-J9UMtMU9BKXNp+3c5kcI7HyWOPYg2B2E6sn1gEQckiSexTaz0wKJSlgTZ89f9F8bkC3AaC8ybXYuHbFQhwpTIg== - dependencies: - "@libp2p/interface" "^1.0.2" - "@multiformats/multiaddr" "^12.1.10" - debug "^4.3.4" - interface-datastore "^8.2.0" - multiformats "^12.1.3" - -"@libp2p/logger@^4.0.6", "@libp2p/logger@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-4.0.7.tgz#b5e82135f5c8a6f275c1b2e183333db956f3ed90" - integrity sha512-oyICns7G18S4eDhbFHUwZ7gLQnZTBVQtUMmMgEmrs8LnQu2GvXADxmQAPPkKtLNSCvRudg4hN3hP04Y+vNvlBQ== - dependencies: - "@libp2p/interface" "^1.1.4" - "@multiformats/multiaddr" "^12.1.14" - debug "^4.3.4" - interface-datastore "^8.2.11" - multiformats "^13.1.0" +"@multiformats/dns@^1.0.3", "@multiformats/dns@^1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz" + integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw== + dependencies: + "@types/dns-packet" "^5.6.5" + buffer "^6.0.3" + dns-packet "^5.6.1" + hashlru "^2.3.0" + p-queue "^8.0.1" + progress-events "^1.0.0" + uint8arrays "^5.0.2" -"@multiformats/multiaddr@^12.1.0", "@multiformats/multiaddr@^12.1.10", "@multiformats/multiaddr@^12.1.5": - version "12.1.11" - resolved "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.11.tgz" - integrity sha512-CWG9kETEGTTMdr1T+/JEuMwFld3r3fHNP8LkLoUcLvHRy6yr8sWdotVGEDNEdDO/vrKhuD7bQBws3xMSMMyylg== +"@multiformats/multiaddr-to-uri@^11.0.0": + version "11.0.2" + resolved "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.2.tgz" + integrity sha512-SiLFD54zeOJ0qMgo9xv1Tl9O5YktDKAVDP4q4hL16mSq4O4sfFNagNADz8eAofxd6TfQUzGQ3TkRRG9IY2uHRg== dependencies: - "@chainsafe/is-ip" "^2.0.1" - "@chainsafe/netmask" "^2.0.0" - "@libp2p/interface" "^1.0.0" - dns-over-http-resolver "3.0.0" - multiformats "^12.0.1" - uint8-varint "^2.0.1" - uint8arrays "^4.0.2" + "@multiformats/multiaddr" "^12.3.0" -"@multiformats/multiaddr@^12.1.14": - version "12.1.14" - resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.1.14.tgz#d021072667f4dfc566cdddcb45feee60fecc8cfd" - integrity sha512-1C0Mo73chzu7pTzTquuKs5vUtw70jhqg1i6pUNznGb0WV6RFa6vyB+D697Os5+cLx+DiItrAY6VzMtlGQsMzYg== +"@multiformats/multiaddr@^12.2.1", "@multiformats/multiaddr@^12.3.0", "@multiformats/multiaddr@^12.4.4": + version "12.5.1" + resolved "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz" + integrity sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ== dependencies: "@chainsafe/is-ip" "^2.0.1" "@chainsafe/netmask" "^2.0.0" - "@libp2p/interface" "^1.0.0" - dns-over-http-resolver "^3.0.2" + "@multiformats/dns" "^1.0.3" + abort-error "^1.0.1" multiformats "^13.0.0" uint8-varint "^2.0.1" uint8arrays "^5.0.0" -"@multiformats/murmur3@^2.0.0", "@multiformats/murmur3@^2.1.2": - version "2.1.7" - resolved "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.7.tgz" - integrity sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ== +"@noble/curves@^1.9.1": + version "1.9.2" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz" + integrity sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g== dependencies: - multiformats "^12.0.1" - murmurhash3js-revisited "^3.0.0" + "@noble/hashes" "1.8.0" -"@multiformats/murmur3@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9" - integrity sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA== - dependencies: - multiformats "^13.0.0" - murmurhash3js-revisited "^3.0.0" +"@noble/hashes@1.8.0", "@noble/hashes@^1.8.0": + version "1.8.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1097,222 +994,258 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@rollup/rollup-android-arm-eabi@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" - integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== - -"@rollup/rollup-android-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" - integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== - -"@rollup/rollup-darwin-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz" - integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== - -"@rollup/rollup-darwin-x64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" - integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" - integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" - integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== - -"@rollup/rollup-linux-arm64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" - integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== - -"@rollup/rollup-linux-riscv64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" - integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== - -"@rollup/rollup-linux-x64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" - integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== - -"@rollup/rollup-linux-x64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" - integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== - -"@rollup/rollup-win32-arm64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" - integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== - -"@rollup/rollup-win32-ia32-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" - integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== - -"@rollup/rollup-win32-x64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" - integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== - -"@smithy/abort-controller@^2.0.1", "@smithy/abort-controller@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz" - integrity sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/chunked-blob-reader-native@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz" - integrity sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw== - dependencies: - "@smithy/util-base64" "^2.0.1" - tslib "^2.5.0" - -"@smithy/chunked-blob-reader@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz" - integrity sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg== - dependencies: - tslib "^2.5.0" - -"@smithy/config-resolver@^2.0.21": - version "2.0.21" - resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz" - integrity sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA== - dependencies: - "@smithy/node-config-provider" "^2.1.8" - "@smithy/types" "^2.7.0" - "@smithy/util-config-provider" "^2.0.0" - "@smithy/util-middleware" "^2.0.8" - tslib "^2.5.0" - -"@smithy/core@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz" - integrity sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw== - dependencies: - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-retry" "^2.0.25" - "@smithy/middleware-serde" "^2.0.15" - "@smithy/protocol-http" "^3.0.11" - "@smithy/smithy-client" "^2.2.0" - "@smithy/types" "^2.7.0" - "@smithy/util-middleware" "^2.0.8" - tslib "^2.5.0" - -"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz" - integrity sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A== - dependencies: - "@smithy/node-config-provider" "^2.1.8" - "@smithy/property-provider" "^2.0.16" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - tslib "^2.5.0" - -"@smithy/eventstream-codec@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz" - integrity sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg== - dependencies: - "@aws-crypto/crc32" "3.0.0" - "@smithy/types" "^2.7.0" - "@smithy/util-hex-encoding" "^2.0.0" - tslib "^2.5.0" - -"@smithy/eventstream-serde-browser@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.15.tgz" - integrity sha512-WiFG5N9j3jmS5P0z5Xev6dO0c3lf7EJYC2Ncb0xDnWFvShwXNn741AF71ABr5EcZw8F4rQma0362MMjAwJeZog== - dependencies: - "@smithy/eventstream-serde-universal" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/eventstream-serde-config-resolver@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.15.tgz" - integrity sha512-o65d2LRjgCbWYH+VVNlWXtmsI231SO99ZTOL4UuIPa6WTjbSHWtlXvUcJG9libhEKWmEV9DIUiH2IqyPWi7ubA== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/eventstream-serde-node@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.15.tgz" - integrity sha512-9OOXiIhHq1VeOG6xdHkn2ZayfMYM3vzdUTV3zhcCnt+tMqA3BJK3XXTJFRR2BV28rtRM778DzqbBTf+hqwQPTg== - dependencies: - "@smithy/eventstream-serde-universal" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/eventstream-serde-universal@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.15.tgz" - integrity sha512-dP8AQp/pXlWBjvL0TaPBJC3rM0GoYv7O0Uim8d/7UKZ2Wo13bFI3/BhQfY/1DeiP1m23iCHFNFtOQxfQNBB8rQ== - dependencies: - "@smithy/eventstream-codec" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/fetch-http-handler@^2.3.1": - version "2.3.1" - resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz" - integrity sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ== +"@rollup/rollup-android-arm-eabi@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz#0592252f7550bc0ea0474bb5a22430850f92bdbd" + integrity sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg== + +"@rollup/rollup-android-arm64@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz#00a51d1d4380cc677da80ac9da1a19e7806bf57e" + integrity sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ== + +"@rollup/rollup-darwin-arm64@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz#6638299dd282ebde1ebdf7dc5b0f150aa6e256e5" + integrity sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg== + +"@rollup/rollup-darwin-x64@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz#33e61daa0a66890059648feda78e1075d4ea1bcb" + integrity sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA== + +"@rollup/rollup-freebsd-arm64@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz#2cc4bd3ba7026cd5374e902285ce76e8fae0f6eb" + integrity sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA== + +"@rollup/rollup-freebsd-x64@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz#64664ba3015deac473a5d6d6c60c068f274bf2d5" + integrity sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw== + +"@rollup/rollup-linux-arm-gnueabihf@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz#7ab16acae3bcae863e9a9bc32038cd05e794a0ff" + integrity sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA== + +"@rollup/rollup-linux-arm-musleabihf@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz#bef91b1e924ab57e82e767dc2655264bbde7acc6" + integrity sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw== + +"@rollup/rollup-linux-arm64-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz#0a811b16da334125f6e44570d0badf543876f49e" + integrity sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g== + +"@rollup/rollup-linux-arm64-musl@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz#e8c166efe3cb963faaa924c7721eafbade63036f" + integrity sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg== + +"@rollup/rollup-linux-loongarch64-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz#239feea00fa2a1e734bdff09b8d1c90def2abbf5" + integrity sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz#1de2f926bddbf7d689a089277c1284ea6df4b6d1" + integrity sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw== + +"@rollup/rollup-linux-riscv64-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz#28dbac643244e477a7b931feb9b475aa826f84c1" + integrity sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w== + +"@rollup/rollup-linux-riscv64-musl@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz#5d05eeaedadec3625cd50e3ca5d35ef6f96a4bf0" + integrity sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA== + +"@rollup/rollup-linux-s390x-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz#55b0790f499fb7adc14eb074c4e46aef92915813" + integrity sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g== + +"@rollup/rollup-linux-x64-gnu@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz#e822632fe5b324b16bdc37149149c8c760b031fd" + integrity sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw== + +"@rollup/rollup-linux-x64-musl@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz#19a3602cb8fabd7eb3087f0a1e1e01adac31bbff" + integrity sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ== + +"@rollup/rollup-win32-arm64-msvc@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz#42e08bf3ea4fc463fc9f199c4f0310a736f03eb1" + integrity sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ== + +"@rollup/rollup-win32-ia32-msvc@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz#043d25557f59d7e28dfe38ee1f60ddcb95a08124" + integrity sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug== + +"@rollup/rollup-win32-x64-msvc@4.45.0": + version "4.45.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz#0a7eecae41f463d6591c8fecd7a5c5087345ee36" + integrity sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA== + +"@smithy/abort-controller@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz" + integrity sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA== + dependencies: + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/chunked-blob-reader-native@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz" + integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - "@smithy/protocol-http" "^3.0.11" - "@smithy/querystring-builder" "^2.0.15" - "@smithy/types" "^2.7.0" - "@smithy/util-base64" "^2.0.1" - tslib "^2.5.0" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" -"@smithy/hash-blob-browser@^2.0.16": - version "2.0.16" - resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.16.tgz" - integrity sha512-cSYRi05LA7DZDwjB1HL0BP8B56eUNNeLglVH147QTXFyuXJq/7erAIiLRfsyXB8+GfFHkSS5BHbc76a7k/AYPA== +"@smithy/chunked-blob-reader@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz" + integrity sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw== + dependencies: + tslib "^2.6.2" + +"@smithy/config-resolver@^4.1.4": + version "4.1.4" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz" + integrity sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w== + dependencies: + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + tslib "^2.6.2" + +"@smithy/core@^3.6.0", "@smithy/core@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz" + integrity sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ== + dependencies: + "@smithy/middleware-serde" "^4.0.8" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-stream" "^4.2.3" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^4.0.6": + version "4.0.6" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz" + integrity sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw== + dependencies: + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz" + integrity sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.3.1" + "@smithy/util-hex-encoding" "^4.0.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-browser@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz" + integrity sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA== + dependencies: + "@smithy/eventstream-serde-universal" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/eventstream-serde-config-resolver@^4.1.2": + version "4.1.2" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz" + integrity sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ== dependencies: - "@smithy/chunked-blob-reader" "^2.0.0" - "@smithy/chunked-blob-reader-native" "^2.0.1" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/hash-node@^2.0.17": - version "2.0.17" - resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz" - integrity sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw== +"@smithy/eventstream-serde-node@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz" + integrity sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w== dependencies: - "@smithy/types" "^2.7.0" - "@smithy/util-buffer-from" "^2.0.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" + "@smithy/eventstream-serde-universal" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/hash-stream-node@^2.0.17": - version "2.0.17" - resolved "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.17.tgz" - integrity sha512-ey8DtnATzp1mOXgS7rqMwSmAki6iJA+jgNucKcxRkhMB1rrICfHg+rhmIF50iLPDHUhTcS5pBMOrLzzpZftvNQ== +"@smithy/eventstream-serde-universal@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz" + integrity sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA== dependencies: - "@smithy/types" "^2.7.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" + "@smithy/eventstream-codec" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/invalid-dependency@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz" - integrity sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" +"@smithy/fetch-http-handler@^5.0.4", "@smithy/fetch-http-handler@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz" + integrity sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ== + dependencies: + "@smithy/protocol-http" "^5.1.2" + "@smithy/querystring-builder" "^4.0.4" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-blob-browser@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz" + integrity sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ== + dependencies: + "@smithy/chunked-blob-reader" "^5.0.0" + "@smithy/chunked-blob-reader-native" "^4.0.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/hash-node@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz" + integrity sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ== + dependencies: + "@smithy/types" "^4.3.1" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-stream-node@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz" + integrity sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg== + dependencies: + "@smithy/types" "^4.3.1" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz" + integrity sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw== + dependencies: + "@smithy/types" "^4.3.1" + tslib "^2.6.2" "@smithy/is-array-buffer@^2.0.0": version "2.0.0" @@ -1321,200 +1254,211 @@ dependencies: tslib "^2.5.0" -"@smithy/md5-js@^2.0.17": - version "2.0.17" - resolved "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.17.tgz" - integrity sha512-jmISTCnEkOnm2oCNx/rMkvBT/eQh3aA6nktevkzbmn/VYqYEuc5Z2n5sTTqsciMSO01Lvf56wG1A4twDqovYeQ== - dependencies: - "@smithy/types" "^2.7.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" - -"@smithy/middleware-content-length@^2.0.17": - version "2.0.17" - resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz" - integrity sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w== - dependencies: - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/middleware-endpoint@^2.2.3": - version "2.2.3" - resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz" - integrity sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ== - dependencies: - "@smithy/middleware-serde" "^2.0.15" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/shared-ini-file-loader" "^2.2.7" - "@smithy/types" "^2.7.0" - "@smithy/url-parser" "^2.0.15" - "@smithy/util-middleware" "^2.0.8" - tslib "^2.5.0" - -"@smithy/middleware-retry@^2.0.24", "@smithy/middleware-retry@^2.0.25": - version "2.0.25" - resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz" - integrity sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ== - dependencies: - "@smithy/node-config-provider" "^2.1.8" - "@smithy/protocol-http" "^3.0.11" - "@smithy/service-error-classification" "^2.0.8" - "@smithy/smithy-client" "^2.2.0" - "@smithy/types" "^2.7.0" - "@smithy/util-middleware" "^2.0.8" - "@smithy/util-retry" "^2.0.8" - tslib "^2.5.0" - uuid "^8.3.2" - -"@smithy/middleware-serde@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz" - integrity sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/middleware-stack@^2.0.9": - version "2.0.9" - resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz" - integrity sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/node-config-provider@^2.1.8": - version "2.1.8" - resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz" - integrity sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ== - dependencies: - "@smithy/property-provider" "^2.0.16" - "@smithy/shared-ini-file-loader" "^2.2.7" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/node-http-handler@^2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz" - integrity sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw== - dependencies: - "@smithy/abort-controller" "^2.0.15" - "@smithy/protocol-http" "^3.0.11" - "@smithy/querystring-builder" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.0.16": - version "2.0.16" - resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz" - integrity sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/protocol-http@^3.0.11": - version "3.0.11" - resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz" - integrity sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A== - dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/querystring-builder@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz" - integrity sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A== - dependencies: - "@smithy/types" "^2.7.0" - "@smithy/util-uri-escape" "^2.0.0" - tslib "^2.5.0" - -"@smithy/querystring-parser@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz" - integrity sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ== +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== + dependencies: + tslib "^2.6.2" + +"@smithy/md5-js@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz" + integrity sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg== + dependencies: + "@smithy/types" "^4.3.1" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/middleware-content-length@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz" + integrity sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w== + dependencies: + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^4.1.13", "@smithy/middleware-endpoint@^4.1.14": + version "4.1.14" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz" + integrity sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ== + dependencies: + "@smithy/core" "^3.7.0" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-middleware" "^4.0.4" + tslib "^2.6.2" + +"@smithy/middleware-retry@^4.1.14": + version "4.1.15" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz" + integrity sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ== + dependencies: + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/service-error-classification" "^4.0.6" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^4.0.8": + version "4.0.8" + resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz" + integrity sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw== + dependencies: + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/middleware-stack@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz" + integrity sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA== + dependencies: + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/node-config-provider@^4.1.3": + version "4.1.3" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz" + integrity sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw== + dependencies: + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.0.6", "@smithy/node-http-handler@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz" + integrity sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg== dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/abort-controller" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/querystring-builder" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/service-error-classification@^2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz" - integrity sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg== +"@smithy/property-provider@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz" + integrity sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw== dependencies: - "@smithy/types" "^2.7.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/shared-ini-file-loader@^2.0.6", "@smithy/shared-ini-file-loader@^2.2.7": - version "2.2.7" - resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz" - integrity sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ== +"@smithy/protocol-http@^5.1.2": + version "5.1.2" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz" + integrity sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ== dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/signature-v4@^2.0.0": - version "2.0.18" - resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz" - integrity sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw== +"@smithy/querystring-builder@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz" + integrity sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w== dependencies: - "@smithy/eventstream-codec" "^2.0.15" - "@smithy/is-array-buffer" "^2.0.0" - "@smithy/types" "^2.7.0" - "@smithy/util-hex-encoding" "^2.0.0" - "@smithy/util-middleware" "^2.0.8" - "@smithy/util-uri-escape" "^2.0.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + "@smithy/util-uri-escape" "^4.0.0" + tslib "^2.6.2" -"@smithy/smithy-client@^2.1.18", "@smithy/smithy-client@^2.2.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz" - integrity sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q== +"@smithy/querystring-parser@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz" + integrity sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w== dependencies: - "@smithy/middleware-endpoint" "^2.2.3" - "@smithy/middleware-stack" "^2.0.9" - "@smithy/protocol-http" "^3.0.11" - "@smithy/types" "^2.7.0" - "@smithy/util-stream" "^2.0.23" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/types@^2.7.0": - version "2.7.0" - resolved "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz" - integrity sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw== +"@smithy/service-error-classification@^4.0.6": + version "4.0.6" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz" + integrity sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg== dependencies: - tslib "^2.5.0" + "@smithy/types" "^4.3.1" -"@smithy/url-parser@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz" - integrity sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA== +"@smithy/shared-ini-file-loader@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz" + integrity sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw== dependencies: - "@smithy/querystring-parser" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/util-base64@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz" - integrity sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ== +"@smithy/signature-v4@^5.1.2": + version "5.1.2" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz" + integrity sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^4.4.5", "@smithy/smithy-client@^4.4.6": + version "4.4.6" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz" + integrity sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ== + dependencies: + "@smithy/core" "^3.7.0" + "@smithy/middleware-endpoint" "^4.1.14" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-stream" "^4.2.3" + tslib "^2.6.2" + +"@smithy/types@^4.3.1": + version "4.3.1" + resolved "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz" + integrity sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz" + integrity sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ== + dependencies: + "@smithy/querystring-parser" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^2.0.0" - tslib "^2.5.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" -"@smithy/util-body-length-browser@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz" - integrity sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ== +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" -"@smithy/util-body-length-node@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz" - integrity sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw== +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" "@smithy/util-buffer-from@^2.0.0": version "2.0.0" @@ -1524,92 +1468,100 @@ "@smithy/is-array-buffer" "^2.0.0" tslib "^2.5.0" -"@smithy/util-config-provider@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz" - integrity sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg== +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - tslib "^2.5.0" + "@smithy/is-array-buffer" "^4.0.0" + tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^2.0.22": - version "2.0.23" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz" - integrity sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w== +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: - "@smithy/property-provider" "^2.0.16" - "@smithy/smithy-client" "^2.2.0" - "@smithy/types" "^2.7.0" - bowser "^2.11.0" - tslib "^2.5.0" + tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^2.0.29": - version "2.0.30" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz" - integrity sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA== - dependencies: - "@smithy/config-resolver" "^2.0.21" - "@smithy/credential-provider-imds" "^2.1.4" - "@smithy/node-config-provider" "^2.1.8" - "@smithy/property-provider" "^2.0.16" - "@smithy/smithy-client" "^2.2.0" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/util-endpoints@^1.0.7": - version "1.0.7" - resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz" - integrity sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA== +"@smithy/util-defaults-mode-browser@^4.0.21": + version "4.0.22" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz" + integrity sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA== dependencies: - "@smithy/node-config-provider" "^2.1.8" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" - -"@smithy/util-hex-encoding@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz" - integrity sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA== + "@smithy/property-provider" "^4.0.4" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^4.0.21": + version "4.0.22" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz" + integrity sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ== + dependencies: + "@smithy/config-resolver" "^4.1.4" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/smithy-client" "^4.4.6" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@smithy/util-endpoints@^3.0.6": + version "3.0.6" + resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz" + integrity sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA== dependencies: - tslib "^2.5.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/util-middleware@^2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz" - integrity sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw== +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== dependencies: - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + tslib "^2.6.2" -"@smithy/util-retry@^2.0.8": - version "2.0.8" - resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz" - integrity sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg== +"@smithy/util-middleware@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz" + integrity sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ== dependencies: - "@smithy/service-error-classification" "^2.0.8" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/util-stream@^2.0.23": - version "2.0.23" - resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz" - integrity sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ== +"@smithy/util-retry@^4.0.6": + version "4.0.6" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz" + integrity sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg== dependencies: - "@smithy/fetch-http-handler" "^2.3.1" - "@smithy/node-http-handler" "^2.2.1" - "@smithy/types" "^2.7.0" - "@smithy/util-base64" "^2.0.1" - "@smithy/util-buffer-from" "^2.0.0" - "@smithy/util-hex-encoding" "^2.0.0" - "@smithy/util-utf8" "^2.0.2" - tslib "^2.5.0" + "@smithy/service-error-classification" "^4.0.6" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" -"@smithy/util-uri-escape@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz" - integrity sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw== +"@smithy/util-stream@^4.2.2", "@smithy/util-stream@^4.2.3": + version "4.2.3" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz" + integrity sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg== + dependencies: + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== dependencies: - tslib "^2.5.0" + tslib "^2.6.2" -"@smithy/util-utf8@^2.0.2": +"@smithy/util-utf8@^2.0.0": version "2.0.2" resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz" integrity sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA== @@ -1617,19 +1569,34 @@ "@smithy/util-buffer-from" "^2.0.0" tslib "^2.5.0" -"@smithy/util-waiter@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.15.tgz" - integrity sha512-9Y+btzzB7MhLADW7xgD6SjvmoYaRkrb/9SCbNGmNdfO47v38rxb90IGXyDtAK0Shl9bMthTmLgjlfYc+vtz2Qw== +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/abort-controller" "^2.0.15" - "@smithy/types" "^2.7.0" - tslib "^2.5.0" + "@smithy/util-buffer-from" "^4.0.0" + tslib "^2.6.2" -"@types/estree@1.0.5": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@smithy/util-waiter@^4.0.6": + version "4.0.6" + resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz" + integrity sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg== + dependencies: + "@smithy/abort-controller" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + +"@types/dns-packet@^5.6.5": + version "5.6.5" + resolved "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz" + integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q== + dependencies: + "@types/node" "*" + +"@types/estree@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/linkify-it@*": version "3.0.5" @@ -1649,23 +1616,27 @@ resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz" integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== +"@types/node@*": + version "24.0.13" + resolved "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz" + integrity sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ== + dependencies: + undici-types "~7.8.0" + "@types/triple-beam@^1.3.2": version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== -"@vascosantos/moving-average@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@vascosantos/moving-average/-/moving-average-1.1.0.tgz" - integrity sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w== +"@types/uuid@^9.0.1": + version "9.0.8" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== -abortable-iterator@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-5.0.1.tgz" - integrity sha512-hlZ5Z8UwqrKsJcelVPEqDduZowJPBQJ9ZhBC2FXpja3lXy8X6MoI5uMzIgmrA8+3jcVnp8TF/tx+IBBqYJNUrg== - dependencies: - get-iterator "^2.0.0" - it-stream-types "^2.0.1" +abort-error@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz" + integrity sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg== acorn@^8.8.2: version "8.11.2" @@ -1724,7 +1695,7 @@ array-union@^2.1.0: async@^3.2.3: version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: @@ -1732,12 +1703,12 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@1.6.2: - version "1.6.2" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== +axios@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz" + integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -1746,69 +1717,22 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blockstore-core@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/blockstore-core/-/blockstore-core-4.4.1.tgz#0804c8a00f096c43e1b679b1711a66157a421c5e" - integrity sha512-peXfL9ZLx1cb84QALocMjhT8CsQ4JsreI/AitlN1inipSdC/G+jcYVJCqeCD5ecSTv/0LMpg8NlAPH/eBYZLjA== - dependencies: - "@libp2p/logger" "^4.0.6" - err-code "^3.0.1" - interface-blockstore "^5.0.0" - interface-store "^5.0.0" - it-drain "^3.0.5" - it-filter "^3.0.4" - it-merge "^3.0.3" - it-pushable "^3.2.3" - multiformats "^13.0.1" - -blockstore-core@^4.0.0: - version "4.3.8" - resolved "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.3.8.tgz" - integrity sha512-Agunhjw9w0I1OoJn012OpzJwBRm3Nf+v64N2FaZSsF3UGhoQAu4RePLuIBsZrPh4XRqT5Yg1rHoBYJGDhDmkWQ== - dependencies: - "@libp2p/logger" "^4.0.1" - err-code "^3.0.1" - interface-blockstore "^5.0.0" - interface-store "^5.0.0" - it-drain "^3.0.1" - it-filter "^3.0.0" - it-merge "^3.0.1" - it-pushable "^3.0.0" - multiformats "^12.0.1" - uint8arrays "^5.0.0" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -blockstore-fs@1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/blockstore-fs/-/blockstore-fs-1.1.10.tgz#0dc8119b0bc293e6df4e056356e33e85528c7a05" - integrity sha512-Dg0mbdma0OY4NEk78efcAAiG5ZrMcIVrM7s+0e2p4uavnvrcBT6vDj5ITfnRfid3idKHOoCYShGEi9ENNgJg1A== +blob-to-it@^2.0.5: + version "2.0.10" + resolved "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.10.tgz" + integrity sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg== dependencies: - blockstore-core "^4.0.0" - fast-write-atomic "^0.2.1" - interface-blockstore "^5.0.0" - interface-store "^5.0.0" - it-glob "^2.0.6" - it-map "^3.0.5" - it-parallel-batch "^3.0.4" - multiformats "^13.0.1" + browser-readablestream-to-it "^2.0.0" bluebird@^3.7.2: version "3.7.2" @@ -1827,26 +1751,23 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" + +browser-readablestream-to-it@^2.0.0, browser-readablestream-to-it@^2.0.5: + version "2.0.10" + resolved "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz" + integrity sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ== buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@5.6.0: - version "5.6.0" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - buffer@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" @@ -1856,9 +1777,9 @@ buffer@^6.0.3: ieee754 "^1.2.1" bundle-require@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz" - integrity sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag== + version "4.2.1" + resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz" + integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== dependencies: load-tsconfig "^0.2.3" @@ -1882,15 +1803,15 @@ catharsis@^0.9.0: dependencies: lodash "^4.17.15" -cborg@^4.0.0, cborg@^4.0.3, cborg@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/cborg/-/cborg-4.0.5.tgz" - integrity sha512-q8TAjprr8pn9Fp53rOIGp/UFDdFY6os2Nq62YogPSIzczJD9M6g2b6igxMkpCiZZKJ0kn/KzDLDvG+EqBIEeCg== +cborg@^4.0.0, cborg@^4.2.3: + version "4.2.12" + resolved "https://registry.npmjs.org/cborg/-/cborg-4.2.12.tgz" + integrity sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog== chokidar@^3.5.1: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1923,7 +1844,7 @@ clean-jsdoc-theme@4.2.17: color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" @@ -1937,7 +1858,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: @@ -1947,7 +1868,7 @@ color-name@^1.0.0, color-name@~1.1.4: color-string@^1.6.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -1955,7 +1876,7 @@ color-string@^1.6.0: color@^3.1.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -1963,7 +1884,7 @@ color@^3.1.3: colorspace@1.1.x: version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== dependencies: color "^3.1.3" @@ -2005,30 +1926,20 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -datastore-core@9.2.9: - version "9.2.9" - resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-9.2.9.tgz#74b4dd53d4597b59038488ba5f92a7f81769f8df" - integrity sha512-wraWTPsbtdE7FFaVo3pwPuTB/zXsgwGGAm8BgBYwYAuzZCTS0MfXmd/HH1vR9s0/NFFjOVmBkGiWCvKxZ+QjVw== +dag-jose@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/dag-jose/-/dag-jose-5.1.1.tgz" + integrity sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w== dependencies: - "@libp2p/logger" "^4.0.6" - err-code "^3.0.1" - interface-datastore "^8.0.0" - interface-store "^5.0.0" - it-drain "^3.0.5" - it-filter "^3.0.4" - it-map "^3.0.5" - it-merge "^3.0.3" - it-pipe "^3.0.1" - it-pushable "^3.2.3" - it-sort "^3.0.4" - it-take "^3.0.4" + "@ipld/dag-cbor" "^9.0.0" + multiformats "~13.1.3" -debug@^4.3.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.3.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: - ms "2.1.2" + ms "^2.1.3" delayed-stream@~1.0.0: version "1.0.0" @@ -2042,21 +1953,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-over-http-resolver@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-3.0.0.tgz" - integrity sha512-5+BI+B7n8LKhNaEZBYErr+CBd9t5nYtjunByLhrLGtZ+i3TRgiU8yE87pCjEBu2KOwNsD9ljpSXEbZ4S8xih5g== - dependencies: - debug "^4.3.4" - receptacle "^1.3.2" - -dns-over-http-resolver@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-3.0.2.tgz#71644cbab3c5a94f53e357da68771e0781ea3407" - integrity sha512-5batkHOjCkuAfrFa+IPmt3jyeZqLtSMfAo1HQp3hfwtzgUwHooecTFplnYC093u5oRNL4CQHCXh3OfER7+vWrA== +dns-packet@^5.6.1: + version "5.6.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: - debug "^4.3.4" - receptacle "^1.3.2" + "@leichtgewicht/ip-codec" "^2.0.1" dot-case@^3.0.4: version "3.0.4" @@ -2071,6 +1973,13 @@ eastasianwidth@^0.2.0: resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +electron-fetch@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -2083,9 +1992,16 @@ emoji-regex@^9.2.2: enabled@2.0.x: version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -2140,11 +2056,6 @@ eventemitter3@^5.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -events@3.3.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - execa@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -2160,57 +2071,64 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== +fast-fifo@^1.0.0: + version "1.3.2" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.2.9, fast-glob@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" -fast-write-atomic@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz#7ee8ef0ce3c1f531043c09ae8e5143361ab17ede" - integrity sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw== - -fast-xml-parser@4.2.5: - version "4.2.5" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz" - integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" +fast-xml-parser@5.2.5: + version "5.2.5" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz" + integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== + dependencies: + strnum "^2.1.0" + fastq@^1.6.0: - version "1.17.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz" - integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" fecha@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" fn.name@1.x.x: version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== foreground-child@^3.1.0: version "3.1.1" @@ -2240,13 +2158,13 @@ fs-extra@^10.1.0: fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -get-iterator@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.1.tgz" - integrity sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg== +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== get-stream@^6.0.0: version "6.0.1" @@ -2288,21 +2206,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -hamt-sharding@^3.0.0, hamt-sharding@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz" - integrity sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw== - dependencies: - sparse-array "^1.3.1" - uint8arrays "^4.0.2" - -hamt-sharding@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/hamt-sharding/-/hamt-sharding-3.0.6.tgz#3643107a3021af66ac95684aec87b196add5ba57" - integrity sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg== - dependencies: - sparse-array "^1.3.1" - uint8arrays "^5.0.1" +hashlru@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz" + integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== html-minifier-terser@^7.2.0: version "7.2.0" @@ -2322,203 +2229,68 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -ieee754@^1.1.4, ieee754@^1.2.1: +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: +inherits@^2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interface-blockstore@^5.0.0: - version "5.2.7" - resolved "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.7.tgz" - integrity sha512-B9UplmgUdQg15f/6xDJEbQYcjMm568cnqJsxSZYbDD0s6eQX5gKh58sd9H3aJEMosIy8T4vz9MwWWZuAOc3hQQ== - dependencies: - interface-store "^5.0.0" - multiformats "^12.0.1" - -interface-blockstore@^5.2.10: - version "5.2.10" - resolved "https://registry.yarnpkg.com/interface-blockstore/-/interface-blockstore-5.2.10.tgz#b01101dd70eda2ab713cc00a492921949934c861" - integrity sha512-9K48hTvBCGsKVD3pF4ILgDcf+W2P/gq0oxLcsHGB6E6W6nDutYkzR+7k7bCs9REHrBEfKzcVDEKieiuNM9WRZg== - dependencies: - interface-store "^5.0.0" - multiformats "^13.0.1" - -interface-datastore@^8.0.0, interface-datastore@^8.2.0: - version "8.2.9" - resolved "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.9.tgz" - integrity sha512-J/8PN8TnB5xxCRtgu9Vx3zExdOzcTU5/DBF2dlU41deX1GW6/SPpbJo5DRNSnvzfjmwJ7YhUOIFXyccUp8nuAA== - dependencies: - interface-store "^5.0.0" - uint8arrays "^5.0.0" - -interface-datastore@^8.2.11: - version "8.2.11" - resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.2.11.tgz#1d555ce6218ab6cba6291fc361debe9713590207" - integrity sha512-9E0iXehfp/j0UbZ2mvlYB4K9pP7uQBCppfuy8WHs1EHF6wLQrM9+zwyX+8Qt6HnH4GKZRyXX/CNXm6oD4+QYgA== - dependencies: - interface-store "^5.0.0" - uint8arrays "^5.0.2" - -interface-store@^5.0.0, interface-store@^5.0.1, interface-store@^5.1.0: - version "5.1.5" - resolved "https://registry.npmjs.org/interface-store/-/interface-store-5.1.5.tgz" - integrity sha512-X0KnJBk3o+YL13MxZBMwa88/b3Mdrpm0yPzkSTKDDVn9BSPH7UK6W+ZtIPO2bxKOQVmq7zqOwAnYnpfqWjb6/g== - -interface-store@^5.1.8: - version "5.1.8" - resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-5.1.8.tgz#94bf867d165b5c904cccf09adeba215a5b0f459e" - integrity sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w== - -ipfs-bitswap@^19.0.0: - version "19.0.2" - resolved "https://registry.npmjs.org/ipfs-bitswap/-/ipfs-bitswap-19.0.2.tgz" - integrity sha512-pm0EcnTAwMMkCmdXHw/a7uPXzQ4I/pxVFiQZ6Ebg/R64XxAky/bCOJRzmqsgqH0+prH2bXAOgzS0mOZdL+zFSw== - dependencies: - "@libp2p/interface" "^0.1.1" - "@libp2p/logger" "^3.0.1" - "@multiformats/multiaddr" "^12.1.0" - "@vascosantos/moving-average" "^1.1.0" - any-signal "^4.1.1" - blockstore-core "^4.0.0" - events "^3.3.0" - interface-blockstore "^5.0.0" - interface-store "^5.1.0" - it-foreach "^2.0.2" - it-length-prefixed "^9.0.0" - it-map "^3.0.2" - it-pipe "^3.0.1" - it-take "^3.0.1" - just-debounce-it "^3.0.1" - multiformats "^12.0.1" - progress-events "^1.0.0" - protons-runtime "^5.0.0" - timeout-abort-controller "^3.0.0" - uint8arraylist "^2.4.3" - uint8arrays "^4.0.2" - varint "^6.0.0" - varint-decoder "^1.0.0" - -ipfs-unixfs-exporter@^13.1.0: - version "13.2.2" - resolved "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.2.2.tgz" - integrity sha512-poCxSte+SdQzuPc/Sm+gx/86VJu+IEsW6/Cfkq29yEUZDG8QuCvTkvuqAysKAYuN40aR9SjYqwYFRW/hsvspSw== - dependencies: - "@ipld/dag-cbor" "^9.0.0" - "@ipld/dag-pb" "^4.0.0" - "@multiformats/murmur3" "^2.0.0" - err-code "^3.0.1" - hamt-sharding "^3.0.0" - interface-blockstore "^5.0.0" - ipfs-unixfs "^11.0.0" - it-filter "^3.0.2" - it-last "^3.0.2" - it-map "^3.0.3" - it-parallel "^3.0.0" - it-pipe "^3.0.1" - it-pushable "^3.1.0" - multiformats "^12.0.1" - p-queue "^7.3.0" - progress-events "^1.0.0" - uint8arrays "^4.0.2" - -ipfs-unixfs-exporter@^13.5.0: - version "13.5.0" - resolved "https://registry.yarnpkg.com/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.5.0.tgz#48fafb272489cc2bf05757c16f3f44fa241ee038" - integrity sha512-s1eWXzoyhQFNEAB1p+QE3adjhW+lBdgpORmmjiCLiruHs5z7T5zsAgRVcWpM8LWYhq2flRtJHObb7Hg73J+oLQ== - dependencies: - "@ipld/dag-cbor" "^9.0.0" - "@ipld/dag-json" "^10.1.7" - "@ipld/dag-pb" "^4.0.0" - "@multiformats/murmur3" "^2.0.0" - err-code "^3.0.1" - hamt-sharding "^3.0.0" - interface-blockstore "^5.0.0" - ipfs-unixfs "^11.0.0" - it-filter "^3.0.2" - it-last "^3.0.2" - it-map "^3.0.3" - it-parallel "^3.0.0" - it-pipe "^3.0.1" - it-pushable "^3.1.0" - multiformats "^13.0.0" - p-queue "^8.0.1" - progress-events "^1.0.0" - -ipfs-unixfs-importer@^15.1.0: - version "15.2.1" - resolved "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.2.1.tgz" - integrity sha512-9ArBh7Xfz8gUSe8pq9c9ilBOXd1bbT3L+4xnI6w/usWLwnNT14p8WbFZjDD0MO1/PrD0PTUZuHNDS2l4EO+wPg== +interface-datastore@^8.3.0, interface-datastore@^8.3.1: + version "8.3.2" + resolved "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.2.tgz" + integrity sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA== dependencies: - "@ipld/dag-pb" "^4.0.0" - "@multiformats/murmur3" "^2.0.0" - err-code "^3.0.1" - hamt-sharding "^3.0.0" - interface-blockstore "^5.0.0" - interface-store "^5.0.1" - ipfs-unixfs "^11.0.0" - it-all "^3.0.2" - it-batch "^3.0.2" - it-first "^3.0.2" - it-parallel-batch "^3.0.1" - multiformats "^12.0.1" - progress-events "^1.0.0" - rabin-wasm "^0.1.4" - uint8arraylist "^2.4.3" - uint8arrays "^4.0.2" + interface-store "^6.0.0" + uint8arrays "^5.1.0" -ipfs-unixfs-importer@^15.2.4: - version "15.2.4" - resolved "https://registry.yarnpkg.com/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.2.4.tgz#3577b21132c95693cfa9122c9dc432a565e02218" - integrity sha512-3b7d/pLPwGvAEXvpJ0WyYlbn2pb2j7qY6FayuMSzbZNdFxdJ82l6VkJ9vK1d/G/AHx+0ZfB06eSdGKjX0GVCAg== - dependencies: - "@ipld/dag-pb" "^4.0.0" - "@multiformats/murmur3" "^2.0.0" - err-code "^3.0.1" - hamt-sharding "^3.0.0" - interface-blockstore "^5.0.0" - interface-store "^5.0.1" - ipfs-unixfs "^11.0.0" - it-all "^3.0.2" - it-batch "^3.0.2" - it-first "^3.0.2" - it-parallel-batch "^3.0.1" - multiformats "^13.0.0" - progress-events "^1.0.0" - rabin-wasm "^0.1.4" - uint8arraylist "^2.4.3" - uint8arrays "^5.0.0" +interface-store@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/interface-store/-/interface-store-6.0.3.tgz" + integrity sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA== -ipfs-unixfs@^11.0.0: - version "11.1.0" - resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.0.tgz" - integrity sha512-Lq37nKLJOpRFjx3rcg3y+ZwUxBX7jluKfIt5UPp6wb1L3dP0sj1yaLR0Yg2CdGYvHWyUpZD1iTnT8upL0ToDOw== +ipfs-unixfs@^11.1.4: + version "11.2.5" + resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz" + integrity sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g== dependencies: - err-code "^3.0.1" - protons-runtime "^5.0.0" - uint8arraylist "^2.4.3" + protons-runtime "^5.5.0" + uint8arraylist "^2.4.8" -ipfs-unixfs@^11.1.3: - version "11.1.3" - resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-11.1.3.tgz#b53f36d8d34022516d6cfead4305839712c1dab2" - integrity sha512-sy6Koojwm/EcM8yvDlycRYA89C8wIcLcGTMMpqnCPUtqTCdl+JxsuPNCBgAu7tmO8Nipm7Tv7f0g/erxTGKKRA== - dependencies: - err-code "^3.0.1" - protons-runtime "^5.0.0" - uint8arraylist "^2.4.3" +ipns@10.1.2: + version "10.1.2" + resolved "https://registry.npmjs.org/ipns/-/ipns-10.1.2.tgz" + integrity sha512-RKAX20vZSHWEobmUw4zpU8t/kw+0CkrJYMA5ou39kNW5B4sAPGOiR/wGK9c51tQKA3rb8SeKs5g7ndNvNiS/vg== + dependencies: + "@libp2p/crypto" "^5.0.0" + "@libp2p/interface" "^2.0.0" + "@libp2p/logger" "^5.0.0" + cborg "^4.2.3" + interface-datastore "^8.3.0" + multiformats "^13.2.2" + protons-runtime "^5.5.0" + timestamp-nano "^1.0.1" + uint8arraylist "^2.4.8" + uint8arrays "^5.1.0" is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@~2.1.0: @@ -2528,6 +2300,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-electron@^2.2.0: + version "2.2.2" + resolved "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -2565,137 +2342,68 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -it-all@^3.0.0, it-all@^3.0.2, it-all@^3.0.4: +iso-url@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + +it-all@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz" integrity sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ== -it-batch@^3.0.0, it-batch@^3.0.2: - version "3.0.4" - resolved "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz" - integrity sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA== - -it-drain@^3.0.1, it-drain@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/it-drain/-/it-drain-3.0.5.tgz" - integrity sha512-qYFe4SWdvs9oJGUY5bSjvmiLUMLzFEODNOQUdYdCIkuIgQF+AUB2INhM4yQ09buJ2rhHKDFxvTD/+yUq6qg0XA== - -it-filter@^3.0.0, it-filter@^3.0.2, it-filter@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz" - integrity sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g== - dependencies: - it-peekable "^3.0.0" - -it-first@^3.0.2: +it-first@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz" integrity sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg== -it-foreach@^2.0.2: - version "2.0.6" - resolved "https://registry.npmjs.org/it-foreach/-/it-foreach-2.0.6.tgz" - integrity sha512-OVosBHJsdXpAyeFlCbe3IGZia+65UykyAznakNsKXK+b99dbhuu/mOnXxTadDEo1GWhKx+WA8RNanKkMf07zQw== - dependencies: - it-peekable "^3.0.0" - -it-glob@^2.0.4, it-glob@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/it-glob/-/it-glob-2.0.6.tgz" - integrity sha512-4C6ccz4nhqrq7yZMzBr3MsKhyL+rlnLXIPceyGG6ogl3Lx3eeWMv1RtlySJwFi6q+jVcPyTpeYt/xftwI2JEQQ== +it-glob@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/it-glob/-/it-glob-3.0.4.tgz" + integrity sha512-73PbGBTK/dHp5PX4l8pkQH1ozCONP0U+PB3qMqltxPonRJQNomINE3Hn9p02m2GOu95VoeVvSZdHI2N+qub0pw== dependencies: - minimatch "^9.0.0" + fast-glob "^3.3.3" -it-last@^3.0.1, it-last@^3.0.2, it-last@^3.0.4: +it-last@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz" integrity sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q== -it-length-prefixed@^9.0.0: - version "9.0.3" - resolved "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.3.tgz" - integrity sha512-YAu424ceYpXctxtjcLOqn7vJq082CaoP8J646ZusYISfQc3bpzQErgTUqMFj81V262KG2W9/YMBHsy6A/4yvmg== - dependencies: - err-code "^3.0.1" - it-reader "^6.0.1" - it-stream-types "^2.0.1" - uint8-varint "^2.0.1" - uint8arraylist "^2.0.0" - uint8arrays "^4.0.2" - -it-map@^3.0.2, it-map@^3.0.3, it-map@^3.0.5: +it-map@^3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz" integrity sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w== dependencies: it-peekable "^3.0.0" -it-merge@^3.0.0, it-merge@^3.0.1, it-merge@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz" - integrity sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA== - dependencies: - it-pushable "^3.2.0" - -it-parallel-batch@^3.0.1, it-parallel-batch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz" - integrity sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA== - dependencies: - it-batch "^3.0.0" - -it-parallel@^3.0.0: - version "3.0.6" - resolved "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz" - integrity sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A== - dependencies: - p-defer "^4.0.0" - -it-peekable@^3.0.0: +it-peekable@^3.0.0, it-peekable@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz" integrity sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w== -it-pipe@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz" - integrity sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA== - dependencies: - it-merge "^3.0.0" - it-pushable "^3.1.2" - it-stream-types "^2.0.1" - -it-pushable@^3.0.0, it-pushable@^3.1.0, it-pushable@^3.1.2, it-pushable@^3.2.0, it-pushable@^3.2.1, it-pushable@^3.2.3: +it-pushable@^3.2.3: version "3.2.3" resolved "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz" integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg== dependencies: p-defer "^4.0.0" -it-reader@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz" - integrity sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg== - dependencies: - it-stream-types "^2.0.1" - uint8arraylist "^2.0.0" +it-stream-types@^2.0.1, it-stream-types@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz" + integrity sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww== -it-sort@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/it-sort/-/it-sort-3.0.4.tgz#250152bf4abf3fa9572954305424bafb3199fa63" - integrity sha512-tvnC93JZZWjX4UxALy0asow0dzXabkoaRbrPJKClTKhNCqw4gzHr+H5axf1gohcthedRRkqd/ae+wl7WqoxFhw== +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== dependencies: - it-all "^3.0.0" - -it-stream-types@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz" - integrity sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg== - -it-take@^3.0.1, it-take@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-take/-/it-take-3.0.4.tgz" - integrity sha512-RG8HDjAZlvkzz5Nav4xq6gK5zNT+Ff1UTIf+CrSJW8nIl6N1FpBH5e7clUshiCn+MmmMoSdIEpw4UaTolszxhA== + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" jackspeak@^2.3.5: version "2.3.6" @@ -2748,11 +2456,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -just-debounce-it@^3.0.1: - version "3.2.0" - resolved "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.2.0.tgz" - integrity sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ== - klaw-sync@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" @@ -2767,15 +2470,54 @@ klaw@^3.0.0: dependencies: graceful-fs "^4.1.9" +kubo-rpc-client@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/kubo-rpc-client/-/kubo-rpc-client-5.2.0.tgz" + integrity sha512-J3ppL1xf7f27NDI9jUPGkr1QiExXLyxUTUwHUMMB1a4AZR4s6113SVXPHRYwe1pFIO3hRb5G+0SuHaxYSfhzBA== + dependencies: + "@ipld/dag-cbor" "^9.0.0" + "@ipld/dag-json" "^10.0.0" + "@ipld/dag-pb" "^4.0.0" + "@libp2p/crypto" "^5.0.0" + "@libp2p/interface" "^2.0.0" + "@libp2p/logger" "^5.0.0" + "@libp2p/peer-id" "^5.0.0" + "@multiformats/multiaddr" "^12.2.1" + "@multiformats/multiaddr-to-uri" "^11.0.0" + any-signal "^4.1.1" + blob-to-it "^2.0.5" + browser-readablestream-to-it "^2.0.5" + dag-jose "^5.0.0" + electron-fetch "^1.9.1" + err-code "^3.0.1" + ipfs-unixfs "^11.1.4" + iso-url "^1.2.1" + it-all "^3.0.4" + it-first "^3.0.4" + it-glob "^3.0.1" + it-last "^3.0.4" + it-map "^3.0.5" + it-peekable "^3.0.3" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiformats "^13.1.0" + nanoid "^5.0.7" + native-fetch "^4.0.2" + parse-duration "^2.1.2" + react-native-fetch-api "^3.0.0" + stream-to-it "^1.0.1" + uint8arrays "^5.0.3" + wherearewe "^2.0.1" + kuler@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== lilconfig@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz" - integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" @@ -2806,7 +2548,7 @@ lodash@^4.17.15, lodash@^4.17.21: logform@^2.3.2, logform@^2.4.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz" integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== dependencies: "@colors/colors" "1.6.0" @@ -2828,6 +2570,11 @@ lower-case@^2.0.2: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +main-event@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz" + integrity sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw== + markdown-it-anchor@^8.4.1: version "8.6.7" resolved "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz" @@ -2871,12 +2618,12 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -2896,18 +2643,13 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^9.0.0, minimatch@^9.0.1: +minimatch@^9.0.1: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.0.4" resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" @@ -2918,12 +2660,22 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -multiformats@^12.0.1, multiformats@^12.1.0, multiformats@^12.1.1, multiformats@^12.1.3: +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +ms@^3.0.0-canary.1: + version "3.0.0-canary.1" + resolved "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz" + integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== + +multiformats@^12.0.1: version "12.1.3" resolved "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz" integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw== @@ -2933,15 +2685,20 @@ multiformats@^13.0.0: resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz" integrity sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA== -multiformats@^13.0.1, multiformats@^13.1.0: +multiformats@^13.1.0: version "13.1.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.1.0.tgz#5aa9d2175108a448fc3bdb54ba8a3d0b6cab3ac3" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz" integrity sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ== -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== +multiformats@^13.2.2, multiformats@^13.3.6: + version "13.3.7" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.3.7.tgz" + integrity sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ== + +multiformats@~13.1.3: + version "13.1.3" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz" + integrity sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw== mz@^2.7.0: version "2.7.0" @@ -2952,6 +2709,16 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^5.0.7: + version "5.1.5" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz" + integrity sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw== + +native-fetch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz" + integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -2960,13 +2727,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -2986,7 +2746,7 @@ object-assign@^4.0.1: one-time@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: fn.name "1.x.x" @@ -2998,35 +2758,35 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + p-defer@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz" integrity sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ== -p-queue@8.0.1, p-queue@^8.0.1: +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + +p-queue@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.0.1.tgz#718b7f83836922ef213ddec263ff4223ce70bef8" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz" integrity sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== dependencies: eventemitter3 "^5.0.1" p-timeout "^6.1.2" -p-queue@^7.3.0, p-queue@^7.3.4: - version "7.4.1" - resolved "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz" - integrity sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA== - dependencies: - eventemitter3 "^5.0.1" - p-timeout "^5.0.2" - -p-timeout@^5.0.2: - version "5.1.0" - resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz" - integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== - p-timeout@^6.1.2: version "6.1.2" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz" integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== param-case@^3.0.4: @@ -3037,6 +2797,11 @@ param-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +parse-duration@^2.1.2: + version "2.1.4" + resolved "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz" + integrity sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg== + pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" @@ -3081,23 +2846,24 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" -prettier@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== +prettier@3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== -progress-events@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz" - integrity sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA== +progress-events@^1.0.0, progress-events@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz" + integrity sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw== -protons-runtime@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.0.tgz" - integrity sha512-jL3VSbXllgm17zurKQ/z+Ath0w+4BknJ+l/NLocfjAB8hbeASOZTNtb7zK3nDsKq2pHK9YFumNQvpkZ6gFfWhA== +protons-runtime@^5.5.0: + version "5.6.0" + resolved "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz" + integrity sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg== dependencies: + uint8-varint "^2.0.2" uint8arraylist "^2.4.3" - uint8arrays "^4.0.6" + uint8arrays "^5.0.1" proxy-from-env@^1.1.0: version "1.1.0" @@ -3114,24 +2880,14 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -rabin-wasm@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz" - integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== dependencies: - "@assemblyscript/loader" "^0.9.4" - bl "^5.0.0" - debug "^4.3.1" - minimist "^1.2.5" - node-fetch "^2.6.1" - readable-stream "^3.6.0" - -race-signal@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/race-signal/-/race-signal-1.0.2.tgz" - integrity sha512-o3xNv0iTcIDQCXFlF6fPAMEBRjFxssgGoRqLbg06m+AdzEXXLUmoNOoUHTVz2NoBI8hHwKFKoC6IqyNtWr2bww== + p-defer "^3.0.0" -readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3147,13 +2903,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -receptacle@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz" - integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== - dependencies: - ms "^2.1.1" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" @@ -3171,36 +2920,38 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -retimer@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz" - integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== - reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rollup@^4.0.2: - version "4.9.6" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz" - integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== + version "4.45.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.0.tgz#92d1b164eca1c6f2cb399ae7a1a8ee78967b6e33" + integrity sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.6" - "@rollup/rollup-android-arm64" "4.9.6" - "@rollup/rollup-darwin-arm64" "4.9.6" - "@rollup/rollup-darwin-x64" "4.9.6" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" - "@rollup/rollup-linux-arm64-gnu" "4.9.6" - "@rollup/rollup-linux-arm64-musl" "4.9.6" - "@rollup/rollup-linux-riscv64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-musl" "4.9.6" - "@rollup/rollup-win32-arm64-msvc" "4.9.6" - "@rollup/rollup-win32-ia32-msvc" "4.9.6" - "@rollup/rollup-win32-x64-msvc" "4.9.6" + "@rollup/rollup-android-arm-eabi" "4.45.0" + "@rollup/rollup-android-arm64" "4.45.0" + "@rollup/rollup-darwin-arm64" "4.45.0" + "@rollup/rollup-darwin-x64" "4.45.0" + "@rollup/rollup-freebsd-arm64" "4.45.0" + "@rollup/rollup-freebsd-x64" "4.45.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.45.0" + "@rollup/rollup-linux-arm-musleabihf" "4.45.0" + "@rollup/rollup-linux-arm64-gnu" "4.45.0" + "@rollup/rollup-linux-arm64-musl" "4.45.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.45.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.45.0" + "@rollup/rollup-linux-riscv64-gnu" "4.45.0" + "@rollup/rollup-linux-riscv64-musl" "4.45.0" + "@rollup/rollup-linux-s390x-gnu" "4.45.0" + "@rollup/rollup-linux-x64-gnu" "4.45.0" + "@rollup/rollup-linux-x64-musl" "4.45.0" + "@rollup/rollup-win32-arm64-msvc" "4.45.0" + "@rollup/rollup-win32-ia32-msvc" "4.45.0" + "@rollup/rollup-win32-x64-msvc" "4.45.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -3217,9 +2968,14 @@ safe-buffer@~5.2.0: safe-stable-stringify@^2.3.1: version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -3251,7 +3007,7 @@ signal-exit@^4.0.1: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" @@ -3281,23 +3037,17 @@ source-map@^0.6.0, source-map@~0.6.0: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sparse-array@^1.3.1, sparse-array@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" - integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== - stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== -stream-browserify@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== +stream-to-it@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz" + integrity sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA== dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" + it-stream-types "^2.0.1" "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" @@ -3365,9 +3115,14 @@ strip-json-comments@^3.1.0: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + version "1.1.2" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== + +strnum@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz" + integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== sucrase@^3.20.3: version "3.35.0" @@ -3382,6 +3137,11 @@ sucrase@^3.20.3: pirates "^4.0.1" ts-interface-checker "^0.1.9" +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + terser@^5.15.1: version "5.26.0" resolved "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz" @@ -3394,7 +3154,7 @@ terser@^5.15.1: text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== thenify-all@^1.0.0: @@ -3411,12 +3171,10 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -timeout-abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz" - integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA== - dependencies: - retimer "^3.0.0" +timestamp-nano@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/timestamp-nano/-/timestamp-nano-1.0.1.tgz" + integrity sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA== to-regex-range@^5.0.1: version "5.0.1" @@ -3432,11 +3190,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" @@ -3444,7 +3197,7 @@ tree-kill@^1.2.2: triple-beam@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-interface-checker@^0.1.9: @@ -3452,19 +3205,14 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tslib@^1.11.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.3.1, tslib@^2.5.0: +tslib@^2.0.3, tslib@^2.5.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsup@8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.0.1.tgz#04a0170f7bbe77e81da3b53006b0a40282291833" + resolved "https://registry.npmjs.org/tsup/-/tsup-8.0.1.tgz" integrity sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg== dependencies: bundle-require "^4.0.0" @@ -3492,7 +3240,7 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -uint8-varint@^2.0.1: +uint8-varint@^2.0.1, uint8-varint@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.2.tgz" integrity sha512-LZXmBT0jiHR7J4oKM1GUhtdLFW1yPauzI8NjJlotXn92TprO9u8VMvEVR4QMk8xhUVUd+2fqfU2/kGbVHYSSWw== @@ -3500,38 +3248,24 @@ uint8-varint@^2.0.1: uint8arraylist "^2.0.0" uint8arrays "^4.0.2" -uint8arraylist@^2.0.0, uint8arraylist@^2.4.3: - version "2.4.7" - resolved "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.7.tgz" - integrity sha512-ohRElqR6C5dd60vRFLq40MCiSnUe1AzkpHvbCEMCGGP6zMoFYECsjdhL6bR1kTK37ONNRDuHQ3RIpScRYcYYIg== - dependencies: - uint8arrays "^4.0.2" - -uint8arraylist@^2.4.8: +uint8arraylist@^2.0.0, uint8arraylist@^2.4.3, uint8arraylist@^2.4.8: version "2.4.8" - resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12" + resolved "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz" integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ== dependencies: uint8arrays "^5.0.1" -uint8arrays@^4.0.2, uint8arrays@^4.0.6: +uint8arrays@^4.0.2: version "4.0.10" resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz" integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA== dependencies: multiformats "^12.0.1" -uint8arrays@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.0.tgz" - integrity sha512-RWO7gR4x6syxnKDfZO8mDCsaaYs1/BqZCxlHgrcRge50E9GTnLmtoA4kwFSGIL4s3dQkryeTkvtG6oEFEya3yg== - dependencies: - multiformats "^12.0.1" - -uint8arrays@^5.0.1, uint8arrays@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.0.2.tgz#f05479bcd521d37c2e7710b24132a460b0ac80e3" - integrity sha512-S0GaeR+orZt7LaqzTRs4ZP8QqzAauJ+0d4xvP2lJTA99jIkKsE2FgDs4tGF/K/z5O9I/2W5Yvrh7IuqNeYH+0Q== +uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.0.3, uint8arrays@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz" + integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww== dependencies: multiformats "^13.0.0" @@ -3540,6 +3274,11 @@ underscore@~1.13.2: resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== + universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" @@ -3550,51 +3289,29 @@ util-deprecate@^1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@9.0.1: +uuid@11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +uuid@^9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -varint-decoder@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/varint-decoder/-/varint-decoder-1.0.0.tgz" - integrity sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ== +weald@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz" + integrity sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ== dependencies: - varint "^5.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + ms "^3.0.0-canary.1" + supports-color "^9.4.0" webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" @@ -3604,6 +3321,13 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +wherearewe@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz" + integrity sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw== + dependencies: + is-electron "^2.2.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -3613,7 +3337,7 @@ which@^2.0.1: winston-transport@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz" integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== dependencies: logform "^2.3.2" @@ -3622,7 +3346,7 @@ winston-transport@^4.7.0: winston@3.12.0: version "3.12.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.12.0.tgz#a5d965a41d3dc31be5408f8c66e927958846c0d0" + resolved "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz" integrity sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w== dependencies: "@colors/colors" "^1.6.0" @@ -3661,6 +3385,6 @@ xmlcreate@^2.0.4: integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== yaml@^2.3.4: - version "2.3.4" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" - integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + version "2.8.0" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== From f99a51d1579a4153707bd58e505bc36ab4222422 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:13:06 -0500 Subject: [PATCH 02/14] Alphabetical Region Ordering Update bundle configuration --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- src/index.js | 419 +++++++++++++++++----------------- src/logger.js | 10 - tsup.config.js | 19 +- 5 files changed, 218 insertions(+), 234 deletions(-) delete mode 100644 src/logger.js diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2ceb9b1..e177bcd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: '20.x' + node-version: '22.x' registry-url: 'https://registry.npmjs.org' - run: yarn install --frozen-lockfile - run: yarn run build diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f977e9c..df4e06f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v3 with: - node-version: '20.x' + node-version: '22.x' - run: yarn install --frozen-lockfile - run: yarn run build - run: node --test --test-concurrency 1 diff --git a/src/index.js b/src/index.js index 956f352..1b4355e 100644 --- a/src/index.js +++ b/src/index.js @@ -176,20 +176,6 @@ class FilebaseClient { return await this.#s3_client.send(command); } - /** - * @summary Lists the buckets in the client. - * @returns {Promise>} - A promise that resolves with an array of objects representing the buckets in the client. - * @example - * // List all buckets - * await client.listBuckets(); - */ - async listBuckets() { - const command = new ListBucketsCommand({}), - { Buckets } = await this.#s3_client.send(command); - - return Buckets; - } - /** * @summary Deletes the specified bucket. * @param {string} name - The name of the bucket to delete. @@ -256,65 +242,45 @@ class FilebaseClient { } throw new Error(`Failed to Fetch CID for Bucket`); } - //endregion - //region File Methods - async uploadDirectory(path, sourceDirectory, options = {}) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - const importOptions = {}; - if (options?.includeHiddenFiles === true) { - importOptions["hidden"] = true; - delete options["includeHiddenFiles"]; - } - const uploadResults = []; - for await (const uploadResult of this.#ipfs_client.addAll( - globSource(path, "*", importOptions), - options, - )) { - uploadResults.push(uploadResult); - } - return uploadResults; - } + /** + * @summary Lists the buckets in the client. + * @returns {Promise>} - A promise that resolves with an array of objects representing the buckets in the client. + * @example + * // List all buckets + * await client.listBuckets(); + */ + async listBuckets() { + const command = new ListBucketsCommand({}), + { Buckets } = await this.#s3_client.send(command); - async uploadFile(path, content, options = {}) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers = options.headers || {}; - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - options.searchParams = options.searchParams || {}; - options.searchParams["preserve-filenames"] = "true"; - return await this.#ipfs_client.add( - { - path, - content, - }, - options, - ); + return Buckets; } + //endregion - async uploadFiles(fileStream, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - const uploadResults = []; - for await (const uploadResult of this.#ipfs_client.addAll( - fileStream, - options, - )) { - uploadResults.push(uploadResult); - } - return uploadResults; - } + //region File Methods + async copyFile(from, to, options) { + const copySource = `${ + options?.sourceBucket || this.#default_bucket + }/${from}`, + command = new CopyObjectCommand({ + CopySource: copySource, + Bucket: options?.destinationBucket || this.#default_bucket, + Key: to, + }); - pinFile(ipfsPath, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - return this.#ipfs_client.pin.add(ipfsPath, options); + await this.#s3_client.send(command); + return true; } - pinFiles(source, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - return this.#ipfs_client.pin.addAll(source, options); + async deleteFile(path, options) { + const command = new DeleteObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: path, + }); + + await this.#s3_client.send(command); + return true; } async downloadFile(path, options) { @@ -327,28 +293,54 @@ class FilebaseClient { return response.Body; } - async deleteFile(path, options) { - const command = new DeleteObjectCommand({ + async generatePresignedUrl(objectKey, expiresInSeconds = 3600, options) { + const command = new GetObjectCommand({ Bucket: options?.bucket || this.#default_bucket, - Key: path, + Key: objectKey, }); - await this.#s3_client.send(command); - return true; + try { + return await getSignedUrl(this.#s3_client, command, { + expiresIn: expiresInSeconds, // URL valid for 1 hour by default + }); + } catch (error) { + console.error("Error generating presigned download URL:", error); + throw error; + } } - async copyFile(from, to, options) { - const copySource = `${ - options?.sourceBucket || this.#default_bucket - }/${from}`, - command = new CopyObjectCommand({ - CopySource: copySource, - Bucket: options?.destinationBucket || this.#default_bucket, - Key: to, - }); + /** + * @typedef {Object} objectOptions + * @property {string} [bucket] - The bucket to pin the IPFS CID into. + */ - await this.#s3_client.send(command); - return true; + /** + * @typedef {Object} objectHeadResult + * @property {string} cid The CID of the uploaded object + * @property {array} [entries] If a directory then returns an array of the containing objects + * @property {string} entries.cid The CID of the uploaded object + * @property {string} entries.path The path of the object + */ + + /** + * @summary Gets an objects info and metadata using the S3 API. + * @param {string} path - The key of the object to be inspected. + * @param {objectOptions} [options] - The options for inspecting the object. + * @returns {Promise} + */ + async getFileMetadata(path, options) { + try { + const command = new HeadObjectCommand({ + Bucket: options?.bucket || this.#default_bucket, + Key: path, + }); + return await this.#s3_client.send(command); + } catch (err) { + if (err.name === "NotFound") { + return false; + } + throw err; + } } /** @@ -429,54 +421,63 @@ class FilebaseClient { return listResponse; } - /** - * @typedef {Object} objectOptions - * @property {string} [bucket] - The bucket to pin the IPFS CID into. - */ + pinFile(ipfsPath, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + return this.#ipfs_client.pin.add(ipfsPath, options); + } - /** - * @typedef {Object} objectHeadResult - * @property {string} cid The CID of the uploaded object - * @property {array} [entries] If a directory then returns an array of the containing objects - * @property {string} entries.cid The CID of the uploaded object - * @property {string} entries.path The path of the object - */ + pinFiles(source, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + return this.#ipfs_client.pin.addAll(source, options); + } - /** - * @summary Gets an objects info and metadata using the S3 API. - * @param {string} path - The key of the object to be inspected. - * @param {objectOptions} [options] - The options for inspecting the object. - * @returns {Promise} - */ - async getFileMetadata(path, options) { - try { - const command = new HeadObjectCommand({ - Bucket: options?.bucket || this.#default_bucket, - Key: path, - }); - return await this.#s3_client.send(command); - } catch (err) { - if (err.name === "NotFound") { - return false; - } - throw err; + async uploadDirectory(path, sourceDirectory, options = {}) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + options.searchParams["directory-name"] = path; + const importOptions = {}; + if (options?.includeHiddenFiles === true) { + importOptions["hidden"] = true; + delete options["includeHiddenFiles"]; + } + const uploadResults = []; + for await (const uploadResult of this.#ipfs_client.addAll( + globSource(path, "*", importOptions), + options, + )) { + uploadResults.push(uploadResult); } + return uploadResults; } - async generatePresignedUrl(objectKey, expiresInSeconds = 3600, options) { - const command = new GetObjectCommand({ - Bucket: options?.bucket || this.#default_bucket, - Key: objectKey, - }); + async uploadFile(path, content, options = {}) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers = options.headers || {}; + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + options.searchParams = options.searchParams || {}; + options.searchParams["preserve-filenames"] = "true"; + return await this.#ipfs_client.add( + { + path, + content, + }, + options, + ); + } - try { - return await getSignedUrl(this.#s3_client, command, { - expiresIn: expiresInSeconds, // URL valid for 1 hour by default - }); - } catch (error) { - console.error("Error generating presigned download URL:", error); - throw error; + async uploadFiles(fileStream, options) { + let encodedCredentials = this.#getIpfsCredentials(options?.bucket); + options.headers["Authorization"] = `Bearer ${encodedCredentials}`; + const uploadResults = []; + for await (const uploadResult of this.#ipfs_client.addAll( + fileStream, + options, + )) { + uploadResults.push(uploadResult); } + return uploadResults; } //endregion @@ -530,6 +531,29 @@ class FilebaseClient { } } + /** + * @summary Deletes an IPNS name with the given label. + * @param {string} label - The label of the IPNS name to delete. + * @returns {Promise} - A promise that resolves to true if the IPNS name was successfully deleted. + * @example + * // List IPNS name with label of `delete-name-example` + * await client.deleteIpnsName(`delete-name-example`); + */ + async deleteIpnsName(label) { + try { + await this.#names_client.request({ + method: "DELETE", + url: `/${label}`, + validateStatus: (status) => { + return status === 204; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + /** * @summary Returns the value of an IPNS name * @param {string} label - Parameter representing the label of the name to resolve. @@ -594,33 +618,18 @@ class FilebaseClient { } /** - * @summary Updates the specified name with the given CID. - * @param {string} label - The label of the name to update. - * @param {string} cid - The cid to associate with the name. - * @param {nameOptions} options - The options for the set operation. - * - * @returns {Promise} - A Promise that resolves to true if the IPNS name was updated. + * @summary Returns a list of IPNS names + * @returns {Promise>} - A promise that resolves to an array of names. * @example - * // Update name with label of `update-name-example` and set the value of the IPNS name. - * await client.updateIpnsName(`update-name-example`, `bafybeidt4nmaci476lyon2mvgfmwyzysdazienhxs2bqnfpdainzjuwjom`); + * // List all IPNS names + * await client.listIpnsNames(); */ - async updateIpnsName(label, cid, options = {}) { + async listIpnsNames() { try { - const updateOptions = { - cid, - }; - if (options?.enabled) { - updateOptions.enabled = Boolean(options.enabled); - } - await this.#names_client.request({ - method: "PUT", - url: `/${label}`, - data: updateOptions, - validateStatus: (status) => { - return status === 200; - }, + const listResponse = await this.#names_client.request({ + method: "GET", }); - return true; + return listResponse.data; } catch (err) { this.#apiErrorHandler(err); } @@ -639,38 +648,30 @@ class FilebaseClient { } /** - * @summary Returns a list of IPNS names - * @returns {Promise>} - A promise that resolves to an array of names. - * @example - * // List all IPNS names - * await client.listIpnsNames(); - */ - async listIpnsNames() { - try { - const listResponse = await this.#names_client.request({ - method: "GET", - }); - return listResponse.data; - } catch (err) { - this.#apiErrorHandler(err); - } - } - - /** - * @summary Deletes an IPNS name with the given label. - * @param {string} label - The label of the IPNS name to delete. - * @returns {Promise} - A promise that resolves to true if the IPNS name was successfully deleted. + * @summary Updates the specified name with the given CID. + * @param {string} label - The label of the name to update. + * @param {string} cid - The cid to associate with the name. + * @param {nameOptions} options - The options for the set operation. + * + * @returns {Promise} - A Promise that resolves to true if the IPNS name was updated. * @example - * // List IPNS name with label of `delete-name-example` - * await client.deleteIpnsName(`delete-name-example`); + * // Update name with label of `update-name-example` and set the value of the IPNS name. + * await client.updateIpnsName(`update-name-example`, `bafybeidt4nmaci476lyon2mvgfmwyzysdazienhxs2bqnfpdainzjuwjom`); */ - async deleteIpnsName(label) { + async updateIpnsName(label, cid, options = {}) { try { + const updateOptions = { + cid, + }; + if (options?.enabled) { + updateOptions.enabled = Boolean(options.enabled); + } await this.#names_client.request({ - method: "DELETE", + method: "PUT", url: `/${label}`, + data: updateOptions, validateStatus: (status) => { - return status === 204; + return status === 200; }, }); return true; @@ -734,6 +735,29 @@ class FilebaseClient { } } + /** + * @summary Deletes a gateway with the given name. + * @param {string} name - The name of the gateway to delete. + * @returns {Promise} - A promise that resolves to true if the gateway was successfully deleted. + * @example + * // Delete gateway with name of `delete-gateway-example` + * await client.deleteGateway(`delete-name-example`); + */ + async deleteGateway(name) { + try { + await this.#gateways_client.request({ + method: "DELETE", + url: `/${name}`, + validateStatus: (status) => { + return status === 204; + }, + }); + return true; + } catch (err) { + this.#apiErrorHandler(err); + } + } + /** * @summary Returns the value of a gateway * @param {string} name - Parameter representing the name to get. @@ -775,29 +799,6 @@ class FilebaseClient { } } - /** - * @summary Deletes a gateway with the given name. - * @param {string} name - The name of the gateway to delete. - * @returns {Promise} - A promise that resolves to true if the gateway was successfully deleted. - * @example - * // Delete gateway with name of `delete-gateway-example` - * await client.deleteGateway(`delete-name-example`); - */ - async deleteGateway(name) { - try { - await this.#gateways_client.request({ - method: "DELETE", - url: `/${name}`, - validateStatus: (status) => { - return status === 204; - }, - }); - return true; - } catch (err) { - this.#apiErrorHandler(err); - } - } - /** * @summary Updates the specified gateway. * @param {string} name - The name of the gateway to update. @@ -840,20 +841,6 @@ class FilebaseClient { //endregion //region Content Fetch Methods - async fetchContentByCid(cid, options = {}) { - return this.#fetchContentFromGateway(cid, "ipfs", options); - } - - async fetchContentByIpnsName(cid, options = {}) { - return this.#fetchContentFromGateway(cid, "ipns", options); - } - - async #fetchIpnsRecord(cid) { - return this.#fetchContentFromGateway(cid, "ipns", { - format: "ipns-record", - }); - } - async #fetchContentFromGateway(cid, resolver, options) { const selectedEndpoint = options?.endpoint || this.#default_gateway; if (typeof selectedEndpoint !== "string") { @@ -886,6 +873,20 @@ class FilebaseClient { }); return downloadResponse.data; } + + async #fetchIpnsRecord(cid) { + return this.#fetchContentFromGateway(cid, "ipns", { + format: "ipns-record", + }); + } + + async fetchContentByCid(cid, options = {}) { + return this.#fetchContentFromGateway(cid, "ipfs", options); + } + + async fetchContentByIpnsName(cid, options = {}) { + return this.#fetchContentFromGateway(cid, "ipns", options); + } //endregion } diff --git a/src/logger.js b/src/logger.js deleted file mode 100644 index afac359..0000000 --- a/src/logger.js +++ /dev/null @@ -1,10 +0,0 @@ -import winston from "winston"; -const { combine, timestamp, json } = winston.format; - -const logger = winston.createLogger({ - level: process.env.LOG_LEVEL || "info", - format: combine(timestamp(), json()), - transports: [new winston.transports.Console()], -}); - -export default logger; diff --git a/tsup.config.js b/tsup.config.js index b9bb4d6..e74c708 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -2,19 +2,12 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: ["src/index.js"], - splitting: false, - sourcemap: false, - noExternal: [ - "@ipld/car", - "@helia/car", - "@helia/unixfs", - "@helia/mfs", - "blockstore-core", - "blockstore-fs", - "datastore-core", - "p-queue", - ], + format: ["cjs", 'esm'], dts: true, - format: ["cjs"], clean: true, + sourcemap: true, + minify: true, + bundle: true, + target: ['es2020', 'node21'], + platform: "neutral", }); From 62b06fbc90db468bdef0fe16091b9cd5bb1bb32e Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:34:45 -0500 Subject: [PATCH 03/14] tsup config change --- package.json | 4 +++- tsup.config.js | 2 +- yarn.lock | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e472351..88f0af4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ ".": { "require": "./dist/index.js", "import": "./src/index.js", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "fallback": "./dist/index.js" } }, "files": [ @@ -55,6 +56,7 @@ "axios": "1.10.0", "ipns": "10.1.2", "kubo-rpc-client": "5.2.0", + "undici": "7.11.0", "winston": "3.12.0" } } diff --git a/tsup.config.js b/tsup.config.js index e74c708..7b60a58 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -2,7 +2,7 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: ["src/index.js"], - format: ["cjs", 'esm'], + format: ["cjs"], dts: true, clean: true, sourcemap: true, diff --git a/yarn.lock b/yarn.lock index fcffa50..51c710d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3279,6 +3279,11 @@ undici-types@~7.8.0: resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== +undici@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.11.0.tgz#8e13a54f62afa756666c0590c38b3866e286d0b3" + integrity sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg== + universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" From ca1c01aa67ccee6218af62c559b9a8660eabb90d Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Wed, 16 Jul 2025 00:17:00 -0500 Subject: [PATCH 04/14] remove kubo-rpc-client that is esm first --- package.json | 24 +- src/index.js | 139 ++-- test/index.spec.cjs | 809 ---------------------- test/index.spec.mjs | 51 +- yarn.lock | 1584 +++++++++++++------------------------------ 5 files changed, 585 insertions(+), 2022 deletions(-) delete mode 100644 test/index.spec.cjs diff --git a/package.json b/package.json index 88f0af4..7923194 100644 --- a/package.json +++ b/package.json @@ -12,22 +12,17 @@ "types": "./dist/index.d.ts", "exports": { ".": { - "require": "./dist/index.js", - "import": "./src/index.js", "types": "./dist/index.d.ts", - "fallback": "./dist/index.js" + "require": "./dist/index.js", + "import": "./src/index.js" } }, "files": [ "dist", "src" ], - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, "scripts": { - "build": "tsup src/index.js --format cjs --dts --clean", + "build": "tsup src/index.js", "test": "node --test", "doc": "jsdoc -c jsdoc.json" }, @@ -43,20 +38,17 @@ "decentralized" ], "devDependencies": { - "clean-jsdoc-theme": "4.2.17", - "jsdoc": "4.0.2", + "clean-jsdoc-theme": "4.3.0", + "jsdoc": "4.0.4", "prettier": "3.6.2", - "tsup": "8.0.1", - "typescript": "5.3.3", + "tsup": "8.5.0", + "typescript": "5.8.3", "uuid": "11.1.0" }, "dependencies": { "@aws-sdk/client-s3": "3.842.0", "@aws-sdk/s3-request-presigner": "3.844.0", "axios": "1.10.0", - "ipns": "10.1.2", - "kubo-rpc-client": "5.2.0", - "undici": "7.11.0", - "winston": "3.12.0" + "ipns": "10.1.2" } } diff --git a/src/index.js b/src/index.js index 1b4355e..7271185 100644 --- a/src/index.js +++ b/src/index.js @@ -13,10 +13,10 @@ import { S3Client, } from "@aws-sdk/client-s3"; import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; -import { create, globSource } from "kubo-rpc-client"; import { unmarshalIPNSRecord } from "ipns"; class FilebaseClient { + #DEFAULT_IPFS_TIMEOUT = 60000; #DEFAULT_IPFS_ENDPOINT = "https://rpc.filebase.io"; #DEFAULT_S3_ENDPOINT = "https://s3.filebase.com"; #DEFAULT_REGION = "us-east-1"; @@ -80,10 +80,18 @@ class FilebaseClient { ipfsCredentials = `${ipfsCredentials}:${options.bucket}`; this.#default_bucket = options.bucket; } - this.#ipfs_client = create({ - url: ipfsEndpoint, + this.#ipfs_client = axios.create({ + baseURL: ipfsEndpoint, + timeout: options?.timeout || this.#DEFAULT_IPFS_TIMEOUT, headers: { - Authorization: `Bearer ${Buffer.from(ipfsCredentials).toString("base64")}`, + common: { + Authorization: `Bearer ${Buffer.from(ipfsCredentials).toString("base64")}`, + }, + }, + method: "POST", + responseType: "text", + validateStatus: function (status) { + return status === 200; }, }); //endregion @@ -92,12 +100,12 @@ class FilebaseClient { const gatewayClientEndpoint = process.env.NODE_ENV === "test" ? process.env.TEST_GW_ENDPOINT || - options?.gateway?.endpoint || - this.#DEFAULT_ENDPOINT + options?.gateway?.endpoint || + this.#DEFAULT_ENDPOINT : options?.gateway?.endpoint || this.#DEFAULT_ENDPOINT; this.#gateways_client = axios.create({ baseURL: `${gatewayClientEndpoint}/v1/gateways`, - timeout: this.#DEFAULT_TIMEOUT, + timeout: options?.timeout || this.#GATEWAY_DEFAULT_TIMEOUT, headers: { common: { Authorization: `Bearer ${Buffer.from(this.#ipfs_credentials).toString("base64")}`, @@ -133,8 +141,8 @@ class FilebaseClient { ) { throw new Error( err.response.data.error?.details || - err.response.data.error?.reason || - err, + err.response.data.error?.reason || + err, ); } throw err; @@ -259,6 +267,31 @@ class FilebaseClient { //endregion //region File Methods + async #uploadFiles(formData, options) { + options.headers = options.headers || {}; + options.headers["Authorization"] = + `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; + options.searchParams = options.searchParams || {}; + options.searchParams["preserve-filenames"] = "true"; + + const downloadResponse = await axios.request({ + url: "api/v0/add", + headers: options.headers, + params: options.searchParams, + }); + + const pins = []; + for (const entry of downloadResponse.data.split("\n")) { + const parsedEntry = JSON.parse(entry); + pins.push({ + name: parsedEntry["Name"], + cid: parsedEntry["Hash"], + size: parsedEntry["Size"], + }); + } + return pins; + } + async copyFile(from, to, options) { const copySource = `${ options?.sourceBucket || this.#default_bucket @@ -421,63 +454,53 @@ class FilebaseClient { return listResponse; } - pinFile(ipfsPath, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - return this.#ipfs_client.pin.add(ipfsPath, options); + async pinFile(path, cid, options) { + await axios.request({ + url: "api/v0/pin/add", + headers: { + Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, + }, + params: { + name: path, + arg: cid, + }, + }); + return true; } - pinFiles(source, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - return this.#ipfs_client.pin.addAll(source, options); + async uploadDirectory(path, formData, options = {}) { + const uploadedFiles = await this.#uploadFiles(formData, { + headers: { + Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, + }, + params: { + "directory-name": path, + "wrap-with-directory": "true", + }, + }); + return uploadedFiles[0]; } - async uploadDirectory(path, sourceDirectory, options = {}) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - options.searchParams["directory-name"] = path; - const importOptions = {}; - if (options?.includeHiddenFiles === true) { - importOptions["hidden"] = true; - delete options["includeHiddenFiles"]; - } - const uploadResults = []; - for await (const uploadResult of this.#ipfs_client.addAll( - globSource(path, "*", importOptions), - options, - )) { - uploadResults.push(uploadResult); - } - return uploadResults; + async uploadFile(path, content, options = {}) { + const uploadFormData = new FormData(); + uploadFormData.append("file", content, path); + + const uploadedFiles = await this.uploadFiles(uploadFormData, options); + return uploadedFiles[0]; } - async uploadFile(path, content, options = {}) { + async uploadFiles(formData, options) { let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers = options.headers || {}; - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - options.searchParams = options.searchParams || {}; - options.searchParams["preserve-filenames"] = "true"; - return await this.#ipfs_client.add( - { - path, - content, + const uploadOptions = { + headers: { + Authorization: `Bearer ${encodedCredentials}`, }, - options, - ); - } + params: { + "preserve-filenames": "true", + }, + }; - async uploadFiles(fileStream, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - options.headers["Authorization"] = `Bearer ${encodedCredentials}`; - const uploadResults = []; - for await (const uploadResult of this.#ipfs_client.addAll( - fileStream, - options, - )) { - uploadResults.push(uploadResult); - } - return uploadResults; + return await this.#uploadFiles(formData, uploadOptions); } //endregion @@ -890,4 +913,4 @@ class FilebaseClient { //endregion } -export default FilebaseClient; \ No newline at end of file +export default FilebaseClient; diff --git a/test/index.spec.cjs b/test/index.spec.cjs deleted file mode 100644 index d557eba..0000000 --- a/test/index.spec.cjs +++ /dev/null @@ -1,809 +0,0 @@ -const test = require("node:test"); -const assert = require("node:assert/strict"); -const path = require("node:path"); -const { writeFile } = require("node:fs/promises"); -const { v4: uuidv4 } = require("uuid"); -const os = require("node:os"); -const FilebaseClient = require("../dist/index.js"); - -// Application Constants -const TEST_PREFIX = Date.now(); - -//region Bucket Tests -test("create bucket", async () => { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; - await filebaseClient.createBucket(bucketNameToCreate); - - try { - // List buckets - const currentBuckets = await filebaseClient.listBuckets(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - // Assert new bucket exists - assert.equal(createdBucket.Name, bucketNameToCreate); - } finally { - // Delete new bucket - await filebaseClient.deleteBucket(bucketNameToCreate); - } -}); - -test("get bucket cid", async () => { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; - await filebaseClient.createBucket(bucketNameToGet); - - try { - // Generate bucket CID - await filebaseClient.generateBucketCid(bucketNameToGet); - - // Get bucket information - const bucketCid = await filebaseClient.getBucketCid(bucketNameToGet); - - // Assert new bucket exists - assert.equal( - bucketCid, - "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", - ); - } finally { - // Delete new bucket - await filebaseClient.deleteBucket(bucketNameToGet); - } -}); - -test("generate bucket cid", async () => { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `create-bucket-test-pass` - const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; - await filebaseClient.createBucket(bucketNameToGenerate); - - try { - // Generate bucket CID - const generatedCid = - await filebaseClient.generateBucketCid(bucketNameToGenerate); - - // Assert new bucket exists - assert.equal( - generatedCid, - "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", - ); - } finally { - // Delete new bucket - await filebaseClient.deleteBucket(bucketNameToGenerate); - } -}); - -test("list buckets", async () => { - const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ), - initialBucketsList = await filebaseClient.listBuckets(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.createBucket(`${testBucketName}-${i}`); - } - const bucketsList = await filebaseClient.listBuckets(); - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.deleteBucket(`${testBucketName}-${i}`); - } - assert.strictEqual( - bucketsList.length, - initialBucketsList.length + countToCreate, - ); -}); - -test("delete bucket", async () => { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket `delete-bucket-test-pass` - const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; - await filebaseClient.createBucket(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await filebaseClient.listBuckets(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - if (typeof createdBucket === "undefined") { - throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); - } - - // Delete new bucket - await filebaseClient.deleteBucket(bucketNameToCreate); - - // List buckets and assert new bucket does not exist - const updatedBuckets = await filebaseClient.listBuckets(), - deletedBucket = updatedBuckets.find((updatedBucket) => { - return updatedBucket.Name === bucketNameToCreate; - }); - assert.equal(typeof deletedBucket, "undefined"); -}); -//endregion - -//region File Tests -async function createBucket(name) { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Create bucket with name - const bucketNameToCreate = name; - await filebaseClient.createBucket(bucketNameToCreate); - - // List buckets and assert new bucket exists - const currentBuckets = await filebaseClient.listBuckets(), - createdBucket = currentBuckets.find((currentBucket) => { - return currentBucket.Name === bucketNameToCreate; - }); - - return typeof createdBucket !== "undefined"; -} - -async function uploadObject(bucket, key, body) { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Upload Object - await filebaseClient.uploadFile(key, body); - - // Confirm Object Uploaded - const uploadedObject = await filebaseClient.getFileMetadata(key); - - return typeof uploadedObject !== "undefined" && uploadedObject !== false - ? uploadedObject - : false; -} - -async function uploadObjects(bucket, key, body) { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Upload Object - await filebaseClient.uploadFiles(key, body); - - // Confirm Object Uploaded - const uploadedObject = await filebaseClient.getFileMetadata(key); - - return typeof uploadedObject !== "undefined" && uploadedObject !== false; -} - -async function deleteObject(bucket, key) { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); - - // Delete Object - await filebaseClient.deleteFile(key); - return true; -} - -async function deleteBucket(bucket) { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); - - // Delete Bucket - await filebaseClient.deleteFile(bucket); - return true; -} - -test("delete object", async () => { - // Create bucket `delete-object-test-pass` - const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; - await createBucket(deleteTestBucket); - - try { - // Upload object `delete-object-test` - const objectNameToCreate = `delete-object-test`; - const uploaded = await uploadObject( - deleteTestBucket, - objectNameToCreate, - Buffer.from("delete object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [delete-object-test]`); - } - - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: deleteTestBucket }, - ); - - // Delete object `delete-object-test` - await filebaseClient.deleteFile(objectNameToCreate); - - // List bucket and assert new object doesn't exist - const uploadedObject = - await filebaseClient.getFileMetadata(objectNameToCreate); - assert.equal(uploadedObject, false); - } finally { - await deleteBucket(deleteTestBucket); - } -}); - -test("upload object", async () => { - // Create Bucket `create-object-test-pass - const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; - await createBucket(uploadTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObject( - uploadTestBucket, - `create-object-test`, - Buffer.from("upload object", "utf-8"), - ); - - assert.strictEqual(uploaded, true); - await deleteObject(uploadTestBucket, `create-object-test`); - } finally { - await deleteBucket(uploadTestBucket); - } -}); - -test("upload directory", async () => { - // Create Bucket `create-object-test-pass - const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; - await createBucket(uploadDirectoryTestBucket); - - try { - // Upload object `create-object-test` - const uploaded = await uploadObjects( - uploadDirectoryTestBucket, - `create-directory-test`, - [ - { - path: "/testObjects/1.txt", - content: Buffer.from("upload test object", "utf-8"), - }, - { - path: "/testObjects/deep/1.txt", - content: Buffer.from("upload deep test object", "utf-8"), - }, - { - path: "/topLevel.txt", - content: Buffer.from("upload top level test object", "utf-8"), - }, - ], - ); - assert.strictEqual(uploaded, true); - await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); - } finally { - await deleteBucket(uploadDirectoryTestBucket); - } -}); - -test("generate presigned url for object", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-presigned-url-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `presigned-url-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [${objectNameToCreate}]`); - } - - try { - // Generate presigned URL for objects - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); - const presignedUrl = - await filebaseClient.generatePresignedUrl(objectNameToCreate); - assert.strictEqual(typeof presignedUrl, "string"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("download object", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); - const downloadStream = - await filebaseClient.downloadFile(objectNameToCreate), - downloadFilename = uuidv4(), - downloadPath = path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("download object using gateway (ipfs)", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); - const downloadStream = await filebaseClient.fetchContentByCid( - uploaded["cid"], - ), - downloadFilename = uuidv4(), - downloadPath = path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); - -test("list objects", async () => { - // Create bucket `list-objects-test-pass` - const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; - await createBucket(listTestBucket); - - try { - let createdObjectCount = 0; - while (createdObjectCount < 26) { - // Upload objects `list-object-test-[x]` - const objectNameToCreate = `list-object-test-${createdObjectCount}`; - await uploadObject( - listTestBucket, - objectNameToCreate, - Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), - ); - createdObjectCount++; - } - - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: listTestBucket }, - ); - - const objectList = await filebaseClient.listFiles(`list-object-test-`, { - MaxKeys: 50, - }); - assert.equal(objectList.Contents.length, 26); - - let deletedObjectCount = 0; - while (deletedObjectCount < 26) { - // Delete objects `list-object-test-[x]` - const objectNameToDelete = `list-object-test-${deletedObjectCount}`; - await deleteObject(listTestBucket, objectNameToDelete); - deletedObjectCount++; - } - } finally { - await deleteBucket(listTestBucket); - } -}); - -test("copy object", async () => { - // Create bucket `copy-object-test-pass-src` - const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; - await createBucket(bucketSrc); - - try { - // Upload object `copy-object-test` - const objectNameToCreateSrc = `copy-object-test`; - const uploaded = await uploadObject( - bucketSrc, - objectNameToCreateSrc, - Buffer.from("copy object", "utf-8"), - ); - try { - assert.equal(uploaded, true); - - // Create bucket `copy-object-test-pass-dest` - const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; - await createBucket(bucketDest); - - try { - // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: bucketSrc }, - ); - - // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` - await filebaseClient.copyFile(objectNameToCreateSrc, bucketDest); - try { - // List bucket and assert new object exists - const copiedObject = await filebaseClient.getFileMetadata( - objectNameToCreateSrc, - ); - assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); - } finally { - await deleteObject(bucketDest, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketDest); - } - } finally { - await deleteObject(bucketSrc, objectNameToCreateSrc); - } - } finally { - await deleteBucket(bucketSrc); - } -}); -//endregion - -//region Gateway Tests -test("delete gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); - await filebaseClient.createGateway(testGatewayName); - await filebaseClient.deleteGateway(testGatewayName); - const deletedName = await filebaseClient.getGateway(testGatewayName); - assert.strictEqual(deletedName, false); -}); - -test("create gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createGateway(testGatewayName); - await filebaseClient.deleteGateway(testGatewayName); - assert.strictEqual(createdName.name, testGatewayName); -}); - -test("update gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createGateway(testGatewayName); - try { - const updatedName = await filebaseClient.updateGateway(createdName.name, { - private: true, - enabled: false, - }); - assert.strictEqual(updatedName, true); - } finally { - await filebaseClient.deleteGateway(testGatewayName); - } -}); - -test("get gateway", async () => { - const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createGateway(testGatewayName, {}); - try { - const testName = await filebaseClient.getGateway(createdName.name); - assert.strictEqual(testName.name, testGatewayName); - } finally { - await filebaseClient.deleteGateway(testGatewayName); - } -}); - -test("list gateways", async () => { - const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), - initialGatewaysList = await filebaseClient.listGateways(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.createGateway(`${testGatewayName}-${i}`); - } - const gatewaysList = await filebaseClient.listGateways(); - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.deleteGateway(`${testGatewayName}-${i}`); - } - assert.strictEqual( - gatewaysList.length, - initialGatewaysList.length + countToCreate, - ); -}); -//endregion - -//region Names Tests -const TEST_CID = process.env.TEST_NAME_CID, - TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY; - -test("delete name", async () => { - const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); - await filebaseClient.createIpnsName(testNameLabel, TEST_CID); - await filebaseClient.deleteIpnsName(testNameLabel); - const deletedName = await filebaseClient.getIpnsName(testNameLabel); - assert.strictEqual(deletedName, false); -}); - -test("create name", async () => { - const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); - await filebaseClient.deleteIpnsName(testNameLabel); - assert.strictEqual(createdName.label, testNameLabel); - assert.strictEqual(createdName.cid, TEST_CID); -}); - -test("import name", async () => { - const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - importedName = await filebaseClient.importIpnsName( - testNameLabel, - TEST_CID, - TEST_PRIVATE_KEY, - ); - await filebaseClient.deleteIpnsName(testNameLabel); - assert.strictEqual(importedName.label, testNameLabel); - assert.strictEqual(importedName.cid, TEST_CID); -}); - -test("update name", async () => { - const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); - try { - const updatedName = await filebaseClient.updateIpnsName( - createdName.label, - TEST_CID, - ); - assert.strictEqual(updatedName, true); - } finally { - await filebaseClient.deleteIpnsName(testNameLabel); - } -}); - -test("get name", async () => { - const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); - try { - const testName = await filebaseClient.getIpnsName(createdName.label); - assert.strictEqual(testName.label, testNameLabel); - assert.strictEqual(testName.cid, TEST_CID); - } finally { - await filebaseClient.deleteIpnsName(testNameLabel); - } -}); - -test("resolve name", async () => { - const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); - try { - const testNameValue = await filebaseClient.resolveIpnsName( - createdName.network_key, - ); - assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); - } finally { - await filebaseClient.deleteIpnsName(testNameLabel); - } -}); - -test("list names", async () => { - const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), - initialNamesList = await filebaseClient.listIpnsNames(), - countToCreate = 3; - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.createIpnsName(`${testNameLabel}-${i}`, TEST_CID); - } - const namesList = await filebaseClient.listIpnsNames(); - for (let i = 0; i < countToCreate; i++) { - await filebaseClient.deleteIpnsName(`${testNameLabel}-${i}`); - } - assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); -}); - -test("download object using gateway (ipns)", async () => { - // Create bucket `download-object-test-pass` - const downloadTestBucket = `${TEST_PREFIX}-download-object-ipns-test-pass`; - await createBucket(downloadTestBucket); - - try { - // Upload object `download-object-test` - const objectNameToCreate = `download-object-test`; - const uploaded = await uploadObject( - downloadTestBucket, - objectNameToCreate, - Buffer.from("download object", "utf-8"), - ); - if (uploaded === false) { - throw Error(`Failed to create object [download-object-test]`); - } - - try { - // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); - - // Create IPNS Name - const createdName = await filebaseClient.createIpnsName( - `${objectNameToCreate}-ipns`, - uploaded.cid, - ); - - const downloadStream = await filebaseClient.fetchContentByIpnsName( - createdName["network_key"], - ), - downloadFilename = uuidv4(), - downloadPath = path.resolve(os.tmpdir(), downloadFilename), - writeFileResult = await writeFile(downloadPath, downloadStream); - assert.strictEqual(typeof writeFileResult, "undefined"); - } finally { - await deleteObject(downloadTestBucket, objectNameToCreate); - } - } finally { - await deleteBucket(downloadTestBucket); - } -}); -//endregion - -//region Pinning API Tests -const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT"; - -test("create pin", async () => { - const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, - testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await filebaseClient.pinFile(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await filebaseClient.deleteFile(createdPin.name); - } finally { - await deleteBucket(testBucketName); - } -}); - -test("create pins", async () => { - const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, - testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await filebaseClient.pinFiles(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await filebaseClient.deleteFile(createdPin.name); - } finally { - await deleteBucket(testBucketName); - } -}); -//endregion diff --git a/test/index.spec.mjs b/test/index.spec.mjs index 10eeecf..9ce0bb6 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -290,23 +290,26 @@ test("upload directory", async () => { try { // Upload object `create-object-test` + const uploadForm = new FormData(); + uploadForm.append( + "file", + Buffer.from("upload test object", "utf-8"), + "/testObjects/1.txt", + ); + uploadForm.append( + "file", + Buffer.from("upload deep test object", "utf-8"), + "/testObjects/deep/1.txt", + ); + uploadForm.append( + "file", + Buffer.from("upload top level test object", "utf-8"), + "/topLevel.txt", + ); const uploaded = await uploadObjects( uploadDirectoryTestBucket, `create-directory-test`, - [ - { - path: "/testObjects/1.txt", - content: Buffer.from("upload test object", "utf-8"), - }, - { - path: "/testObjects/deep/1.txt", - content: Buffer.from("upload deep test object", "utf-8"), - }, - { - path: "/topLevel.txt", - content: Buffer.from("upload top level test object", "utf-8"), - }, - ], + uploadForm, ); assert.strictEqual(uploaded, true); await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); @@ -786,24 +789,4 @@ test("create pin", async () => { await deleteBucket(testBucketName); } }); - -test("create pins", async () => { - const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, - testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); - await createBucket(testBucketName); - try { - const createdPin = await filebaseClient.pinFiles(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await filebaseClient.deleteFile(createdPin.name); - } finally { - await deleteBucket(testBucketName); - } -}); //endregion diff --git a/yarn.lock b/yarn.lock index 51c710d..70052a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -659,157 +659,135 @@ dependencies: "@chainsafe/is-ip" "^2.0.1" -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@ipld/dag-cbor@^9.0.0": - version "9.1.0" - resolved "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.1.0.tgz" - integrity sha512-7pMKjBaapEh+1Nk/1umPPhQGT6znb5E71lke2ekxlcuVZLLrPPdDSy0UAMwWgj3a28cjir/ZJ6CQH2DEs3DUOQ== - dependencies: - cborg "^4.0.0" - multiformats "^13.0.0" - -"@ipld/dag-json@^10.0.0": - version "10.2.0" - resolved "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.0.tgz" - integrity sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA== - dependencies: - cborg "^4.0.0" - multiformats "^13.1.0" - -"@ipld/dag-pb@^4.0.0": - version "4.0.6" - resolved "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.6.tgz" - integrity sha512-wOij3jfDKZsb9yjhQeHp+TQy0pu1vmUkGv324xciFFZ7xGbDfAGTQW03lSA5aJ/7HBBNYgjEE0nvHmNW1Qjfag== - dependencies: - multiformats "^12.0.1" +"@esbuild/aix-ppc64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz#164b19122e2ed54f85469df9dea98ddb01d5e79e" + integrity sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw== + +"@esbuild/android-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz#8f539e7def848f764f6432598e51cc3820fde3a5" + integrity sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA== + +"@esbuild/android-arm@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.6.tgz#4ceb0f40113e9861169be83e2a670c260dd234ff" + integrity sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg== + +"@esbuild/android-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.6.tgz#ad4f280057622c25fe985c08999443a195dc63a8" + integrity sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A== + +"@esbuild/darwin-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz#d1f04027396b3d6afc96bacd0d13167dfd9f01f7" + integrity sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA== + +"@esbuild/darwin-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz#2b4a6cedb799f635758d7832d75b23772c8ef68f" + integrity sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg== + +"@esbuild/freebsd-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz#a26266cc97dd78dc3c3f3d6788b1b83697b1055d" + integrity sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg== + +"@esbuild/freebsd-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz#9feb8e826735c568ebfd94859b22a3fbb6a9bdd2" + integrity sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ== + +"@esbuild/linux-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz#c07cbed8e249f4c28e7f32781d36fc4695293d28" + integrity sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ== + +"@esbuild/linux-arm@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz#d6e2cd8ef3196468065d41f13fa2a61aaa72644a" + integrity sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw== + +"@esbuild/linux-ia32@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz#3e682bd47c4eddcc4b8f1393dfc8222482f17997" + integrity sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw== + +"@esbuild/linux-loong64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz#473f5ea2e52399c08ad4cd6b12e6dbcddd630f05" + integrity sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg== + +"@esbuild/linux-mips64el@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz#9960631c9fd61605b0939c19043acf4ef2b51718" + integrity sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw== + +"@esbuild/linux-ppc64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz#477cbf8bb04aa034b94f362c32c86b5c31db8d3e" + integrity sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw== + +"@esbuild/linux-riscv64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz#bcdb46c8fb8e93aa779e9a0a62cd4ac00dcac626" + integrity sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w== + +"@esbuild/linux-s390x@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz#f412cf5fdf0aea849ff51c73fd817c6c0234d46d" + integrity sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw== + +"@esbuild/linux-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz#d8233c09b5ebc0c855712dc5eeb835a3a3341108" + integrity sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig== + +"@esbuild/netbsd-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz#f51ae8dd1474172e73cf9cbaf8a38d1c72dd8f1a" + integrity sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q== + +"@esbuild/netbsd-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz#a267538602c0e50a858cf41dcfe5d8036f8da8e7" + integrity sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g== + +"@esbuild/openbsd-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz#a51be60c425b85c216479b8c344ad0511635f2d2" + integrity sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg== + +"@esbuild/openbsd-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz#7e4a743c73f75562e29223ba69d0be6c9c9008da" + integrity sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw== + +"@esbuild/openharmony-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz#2087a5028f387879154ebf44bdedfafa17682e5b" + integrity sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA== + +"@esbuild/sunos-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz#56531f861723ea0dc6283a2bb8837304223cb736" + integrity sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA== + +"@esbuild/win32-arm64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz#f4989f033deac6fae323acff58764fa8bc01436e" + integrity sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q== + +"@esbuild/win32-ia32@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz#b260e9df71e3939eb33925076d39f63cec7d1525" + integrity sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ== + +"@esbuild/win32-x64@0.25.6": + version "0.25.6" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz#4276edd5c105bc28b11c6a1f76fb9d29d1bd25c1" + integrity sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -855,6 +833,11 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz" @@ -875,7 +858,7 @@ resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@libp2p/crypto@^5.0.0", "@libp2p/crypto@^5.1.7": +"@libp2p/crypto@^5.0.0": version "5.1.7" resolved "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.7.tgz" integrity sha512-7DO0piidLEKfCuNfS420BlHG0e2tH7W/zugdsPSiC/1Apa/s1B1dBkaIEgfDkGjrRP4S/8Or86Rtq7zXeEu67g== @@ -913,16 +896,6 @@ multiformats "^13.3.6" weald "^1.0.4" -"@libp2p/peer-id@^5.0.0": - version "5.1.8" - resolved "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.8.tgz" - integrity sha512-pGaM4BwjnXdGtAtd84L4/wuABpsnFYE+AQ+h3GxNFme0IsTaTVKWd1jBBE5YFeKHBHGUOhF3TlHsdjFfjQA7TA== - dependencies: - "@libp2p/crypto" "^5.1.7" - "@libp2p/interface" "^2.10.5" - multiformats "^13.3.6" - uint8arrays "^5.1.0" - "@multiformats/dns@^1.0.3", "@multiformats/dns@^1.0.6": version "1.0.6" resolved "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz" @@ -936,14 +909,7 @@ progress-events "^1.0.0" uint8arrays "^5.0.2" -"@multiformats/multiaddr-to-uri@^11.0.0": - version "11.0.2" - resolved "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.2.tgz" - integrity sha512-SiLFD54zeOJ0qMgo9xv1Tl9O5YktDKAVDP4q4hL16mSq4O4sfFNagNADz8eAofxd6TfQUzGQ3TkRRG9IY2uHRg== - dependencies: - "@multiformats/multiaddr" "^12.3.0" - -"@multiformats/multiaddr@^12.2.1", "@multiformats/multiaddr@^12.3.0", "@multiformats/multiaddr@^12.4.4": +"@multiformats/multiaddr@^12.4.4": version "12.5.1" resolved "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz" integrity sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ== @@ -968,131 +934,110 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@rollup/rollup-android-arm-eabi@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz#0592252f7550bc0ea0474bb5a22430850f92bdbd" - integrity sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg== - -"@rollup/rollup-android-arm64@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz#00a51d1d4380cc677da80ac9da1a19e7806bf57e" - integrity sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ== - -"@rollup/rollup-darwin-arm64@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz#6638299dd282ebde1ebdf7dc5b0f150aa6e256e5" - integrity sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg== - -"@rollup/rollup-darwin-x64@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz#33e61daa0a66890059648feda78e1075d4ea1bcb" - integrity sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA== - -"@rollup/rollup-freebsd-arm64@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz#2cc4bd3ba7026cd5374e902285ce76e8fae0f6eb" - integrity sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA== - -"@rollup/rollup-freebsd-x64@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz#64664ba3015deac473a5d6d6c60c068f274bf2d5" - integrity sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw== - -"@rollup/rollup-linux-arm-gnueabihf@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz#7ab16acae3bcae863e9a9bc32038cd05e794a0ff" - integrity sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA== - -"@rollup/rollup-linux-arm-musleabihf@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz#bef91b1e924ab57e82e767dc2655264bbde7acc6" - integrity sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw== - -"@rollup/rollup-linux-arm64-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz#0a811b16da334125f6e44570d0badf543876f49e" - integrity sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g== - -"@rollup/rollup-linux-arm64-musl@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz#e8c166efe3cb963faaa924c7721eafbade63036f" - integrity sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg== - -"@rollup/rollup-linux-loongarch64-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz#239feea00fa2a1e734bdff09b8d1c90def2abbf5" - integrity sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz#1de2f926bddbf7d689a089277c1284ea6df4b6d1" - integrity sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw== - -"@rollup/rollup-linux-riscv64-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz#28dbac643244e477a7b931feb9b475aa826f84c1" - integrity sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w== - -"@rollup/rollup-linux-riscv64-musl@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz#5d05eeaedadec3625cd50e3ca5d35ef6f96a4bf0" - integrity sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA== - -"@rollup/rollup-linux-s390x-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz#55b0790f499fb7adc14eb074c4e46aef92915813" - integrity sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g== - -"@rollup/rollup-linux-x64-gnu@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz#e822632fe5b324b16bdc37149149c8c760b031fd" - integrity sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw== - -"@rollup/rollup-linux-x64-musl@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz#19a3602cb8fabd7eb3087f0a1e1e01adac31bbff" - integrity sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ== - -"@rollup/rollup-win32-arm64-msvc@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz#42e08bf3ea4fc463fc9f199c4f0310a736f03eb1" - integrity sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ== - -"@rollup/rollup-win32-ia32-msvc@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz#043d25557f59d7e28dfe38ee1f60ddcb95a08124" - integrity sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug== - -"@rollup/rollup-win32-x64-msvc@4.45.0": - version "4.45.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz#0a7eecae41f463d6591c8fecd7a5c5087345ee36" - integrity sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA== +"@rollup/rollup-android-arm-eabi@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz#8560592f0dcf43b8cb0949af9f1d916205148d12" + integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA== + +"@rollup/rollup-android-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz#6bfb777bbce998691b6fd3e916b05cd46392d020" + integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ== + +"@rollup/rollup-darwin-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz#7efce10220293a22e7b7b595d05d8b8400a7bcf3" + integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA== + +"@rollup/rollup-darwin-x64@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz#c617a8ece21050bfbea299c126767d2e70cfa79a" + integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og== + +"@rollup/rollup-freebsd-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz#5a6af0a9acf82162d2910933649ae24fc0ea3ecb" + integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g== + +"@rollup/rollup-freebsd-x64@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz#ae9709463560196fc275bd0da598668a2e341023" + integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A== + +"@rollup/rollup-linux-arm-gnueabihf@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz#6ec52661764dbd54c19d6520a403aa385a5c0fbf" + integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q== + +"@rollup/rollup-linux-arm-musleabihf@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz#fd33ba4a43ef8419e96811236493d19436271923" + integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q== + +"@rollup/rollup-linux-arm64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz#933b3d99b73c9d7bf4506cab0d5d313c7e74fd2d" + integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw== + +"@rollup/rollup-linux-arm64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz#dbe9ae24ee9e97b75662fddcb69eb7f23c89280a" + integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog== + +"@rollup/rollup-linux-loongarch64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz#818c5a071eec744436dbcdd76fe9c3c869dc9a8d" + integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg== + +"@rollup/rollup-linux-powerpc64le-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz#6b8591def27d886fa147fb0340126c7d6682a7e4" + integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg== + +"@rollup/rollup-linux-riscv64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz#f1861ac4ee8da64e0b0d23853ff26fe2baa876cf" + integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw== + +"@rollup/rollup-linux-riscv64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz#320c961401a923b374e358664527b188e374e1ae" + integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA== + +"@rollup/rollup-linux-s390x-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz#1763eed3362b50b6164d3f0947486c03cc7e616d" + integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw== + +"@rollup/rollup-linux-x64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971" + integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== + +"@rollup/rollup-linux-x64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb" + integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw== + +"@rollup/rollup-win32-arm64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz#27a6e48d1502e8e4bed96bedfb533738655874f2" + integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg== + +"@rollup/rollup-win32-ia32-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz#a2fbad3bec20ff879f3fd51720adf33692ca8f3d" + integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw== + +"@rollup/rollup-win32-x64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz#e5085c6d13da15b4c5133cd2a6bb11f25b6bb77a" + integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA== "@smithy/abort-controller@^4.0.4": version "4.0.4" @@ -1598,23 +1543,23 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/linkify-it@*": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz" - integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== +"@types/linkify-it@^5": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== -"@types/markdown-it@^12.2.3": - version "12.2.3" - resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz" - integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== +"@types/markdown-it@^14.1.1": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" + integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: - "@types/linkify-it" "*" - "@types/mdurl" "*" + "@types/linkify-it" "^5" + "@types/mdurl" "^2" -"@types/mdurl@*": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz" - integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== +"@types/mdurl@^2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== "@types/node@*": version "24.0.13" @@ -1623,11 +1568,6 @@ dependencies: undici-types "~7.8.0" -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz" @@ -1638,6 +1578,11 @@ abort-error@^1.0.1: resolved "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz" integrity sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg== +acorn@^8.14.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + acorn@^8.8.2: version "8.11.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" @@ -1670,34 +1615,11 @@ any-promise@^1.0.0: resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -any-signal@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz" - integrity sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^3.2.3: - version "3.2.5" - resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -1722,18 +1644,6 @@ base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -blob-to-it@^2.0.5: - version "2.0.10" - resolved "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.10.tgz" - integrity sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg== - dependencies: - browser-readablestream-to-it "^2.0.0" - bluebird@^3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" @@ -1751,18 +1661,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browser-readablestream-to-it@^2.0.0, browser-readablestream-to-it@^2.0.5: - version "2.0.10" - resolved "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz" - integrity sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -1776,16 +1674,16 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bundle-require@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz" - integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== +bundle-require@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== dependencies: load-tsconfig "^0.2.3" -cac@^6.7.12: +cac@^6.7.14: version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== camel-case@^4.1.2: @@ -1803,25 +1701,17 @@ catharsis@^0.9.0: dependencies: lodash "^4.17.15" -cborg@^4.0.0, cborg@^4.2.3: +cborg@^4.2.3: version "4.2.12" resolved "https://registry.npmjs.org/cborg/-/cborg-4.2.12.tgz" integrity sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog== -chokidar@^3.5.1: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" clean-css@~5.3.2: version "5.3.3" @@ -1830,10 +1720,10 @@ clean-css@~5.3.2: dependencies: source-map "~0.6.0" -clean-jsdoc-theme@4.2.17: - version "4.2.17" - resolved "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.17.tgz" - integrity sha512-5SbJNXcQHUXd7N13g+3OpGFiBQdxz36xwEP3p1r1vbo/apLcDRtugaFdUZ56H6Rvlb68Q33EChoBkajSlnD11w== +clean-jsdoc-theme@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz#6cd55ff7b25ff6d1719ae0ff9f1cdb5ef07bf640" + integrity sha512-QMrBdZ2KdPt6V2Ytg7dIt0/q32U4COpxvR0UDhPjRRKRL0o0MvRCR5YpY37/4rPF1SI1AYEKAWyof7ndCb/dzA== dependencies: "@jsdoc/salty" "^0.2.4" fs-extra "^10.1.0" @@ -1842,13 +1732,6 @@ clean-jsdoc-theme@4.2.17: lodash "^4.17.21" showdown "^2.1.0" -color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -1856,40 +1739,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -1917,7 +1771,17 @@ commander@^9.0.0: resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +consola@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + +cross-spawn@^7.0.0: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1926,15 +1790,7 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dag-jose@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/dag-jose/-/dag-jose-5.1.1.tgz" - integrity sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w== - dependencies: - "@ipld/dag-cbor" "^9.0.0" - multiformats "~13.1.3" - -debug@^4.3.1: +debug@^4.4.0: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== @@ -1946,13 +1802,6 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dns-packet@^5.6.1: version "5.6.1" resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" @@ -1973,13 +1822,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-fetch@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz" - integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== - dependencies: - encoding "^0.1.13" - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -1990,61 +1832,42 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - -err-code@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -esbuild@^0.19.2: - version "0.19.12" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== +esbuild@^0.25.0: + version "0.25.6" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.6.tgz#9b82a3db2fa131aec069ab040fd57ed0a880cdcd" + integrity sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg== optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" + "@esbuild/aix-ppc64" "0.25.6" + "@esbuild/android-arm" "0.25.6" + "@esbuild/android-arm64" "0.25.6" + "@esbuild/android-x64" "0.25.6" + "@esbuild/darwin-arm64" "0.25.6" + "@esbuild/darwin-x64" "0.25.6" + "@esbuild/freebsd-arm64" "0.25.6" + "@esbuild/freebsd-x64" "0.25.6" + "@esbuild/linux-arm" "0.25.6" + "@esbuild/linux-arm64" "0.25.6" + "@esbuild/linux-ia32" "0.25.6" + "@esbuild/linux-loong64" "0.25.6" + "@esbuild/linux-mips64el" "0.25.6" + "@esbuild/linux-ppc64" "0.25.6" + "@esbuild/linux-riscv64" "0.25.6" + "@esbuild/linux-s390x" "0.25.6" + "@esbuild/linux-x64" "0.25.6" + "@esbuild/netbsd-arm64" "0.25.6" + "@esbuild/netbsd-x64" "0.25.6" + "@esbuild/openbsd-arm64" "0.25.6" + "@esbuild/openbsd-x64" "0.25.6" + "@esbuild/openharmony-arm64" "0.25.6" + "@esbuild/sunos-x64" "0.25.6" + "@esbuild/win32-arm64" "0.25.6" + "@esbuild/win32-ia32" "0.25.6" + "@esbuild/win32-x64" "0.25.6" escape-string-regexp@^2.0.0: version "2.0.0" @@ -2056,37 +1879,6 @@ eventemitter3@^5.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -fast-fifo@^1.0.0: - version "1.3.2" - resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-glob@^3.2.9, fast-glob@^3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - fast-xml-parser@4.4.1: version "4.4.1" resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" @@ -2101,29 +1893,19 @@ fast-xml-parser@5.2.5: dependencies: strnum "^2.1.0" -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fdir@^6.4.4: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== +fix-dts-default-cjs-exports@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz#955cb6b3d519691c57828b078adadf2cb92e9549" + integrity sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg== dependencies: - to-regex-range "^5.0.1" - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + magic-string "^0.30.17" + mlly "^1.7.4" + rollup "^4.34.8" follow-redirects@^1.15.6: version "1.15.9" @@ -2161,23 +1943,6 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -get-iterator@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz" - integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob@^10.3.10: version "10.3.10" resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" @@ -2189,18 +1954,6 @@ glob@^10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" @@ -2224,33 +1977,11 @@ html-minifier-terser@^7.2.0: relateurl "^0.2.7" terser "^5.15.1" -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -inherits@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - interface-datastore@^8.3.0, interface-datastore@^8.3.1: version "8.3.2" resolved "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.2.tgz" @@ -2264,14 +1995,6 @@ interface-store@^6.0.0: resolved "https://registry.npmjs.org/interface-store/-/interface-store-6.0.3.tgz" integrity sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA== -ipfs-unixfs@^11.1.4: - version "11.2.5" - resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz" - integrity sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g== - dependencies: - protons-runtime "^5.5.0" - uint8arraylist "^2.4.8" - ipns@10.1.2: version "10.1.2" resolved "https://registry.npmjs.org/ipns/-/ipns-10.1.2.tgz" @@ -2288,99 +2011,16 @@ ipns@10.1.2: uint8arraylist "^2.4.8" uint8arrays "^5.1.0" -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-electron@^2.2.0: - version "2.2.2" - resolved "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz" - integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -iso-url@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz" - integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== - -it-all@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz" - integrity sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ== - -it-first@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz" - integrity sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg== - -it-glob@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/it-glob/-/it-glob-3.0.4.tgz" - integrity sha512-73PbGBTK/dHp5PX4l8pkQH1ozCONP0U+PB3qMqltxPonRJQNomINE3Hn9p02m2GOu95VoeVvSZdHI2N+qub0pw== - dependencies: - fast-glob "^3.3.3" - -it-last@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz" - integrity sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q== - -it-map@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz" - integrity sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w== - dependencies: - it-peekable "^3.0.0" - -it-peekable@^3.0.0, it-peekable@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz" - integrity sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w== - it-pushable@^3.2.3: version "3.2.3" resolved "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz" @@ -2388,23 +2028,11 @@ it-pushable@^3.2.3: dependencies: p-defer "^4.0.0" -it-stream-types@^2.0.1, it-stream-types@^2.0.2: +it-stream-types@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz" integrity sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww== -it-to-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz" - integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== - dependencies: - buffer "^6.0.3" - fast-fifo "^1.0.0" - get-iterator "^1.0.2" - p-defer "^3.0.0" - p-fifo "^1.0.0" - readable-stream "^3.6.0" - jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" @@ -2414,9 +2042,9 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -joycon@^3.0.1: +joycon@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== js2xmlparser@^4.0.2: @@ -2426,21 +2054,21 @@ js2xmlparser@^4.0.2: dependencies: xmlcreate "^2.0.4" -jsdoc@4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz" - integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg== +jsdoc@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.4.tgz#86565a9e39cc723a3640465b3fb189a22d1206ca" + integrity sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw== dependencies: "@babel/parser" "^7.20.15" "@jsdoc/salty" "^0.2.1" - "@types/markdown-it" "^12.2.3" + "@types/markdown-it" "^14.1.1" bluebird "^3.7.2" catharsis "^0.9.0" escape-string-regexp "^2.0.0" js2xmlparser "^4.0.2" klaw "^3.0.0" - markdown-it "^12.3.2" - markdown-it-anchor "^8.4.1" + markdown-it "^14.1.0" + markdown-it-anchor "^8.6.7" marked "^4.0.10" mkdirp "^1.0.4" requizzle "^0.2.3" @@ -2470,53 +2098,9 @@ klaw@^3.0.0: dependencies: graceful-fs "^4.1.9" -kubo-rpc-client@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/kubo-rpc-client/-/kubo-rpc-client-5.2.0.tgz" - integrity sha512-J3ppL1xf7f27NDI9jUPGkr1QiExXLyxUTUwHUMMB1a4AZR4s6113SVXPHRYwe1pFIO3hRb5G+0SuHaxYSfhzBA== - dependencies: - "@ipld/dag-cbor" "^9.0.0" - "@ipld/dag-json" "^10.0.0" - "@ipld/dag-pb" "^4.0.0" - "@libp2p/crypto" "^5.0.0" - "@libp2p/interface" "^2.0.0" - "@libp2p/logger" "^5.0.0" - "@libp2p/peer-id" "^5.0.0" - "@multiformats/multiaddr" "^12.2.1" - "@multiformats/multiaddr-to-uri" "^11.0.0" - any-signal "^4.1.1" - blob-to-it "^2.0.5" - browser-readablestream-to-it "^2.0.5" - dag-jose "^5.0.0" - electron-fetch "^1.9.1" - err-code "^3.0.1" - ipfs-unixfs "^11.1.4" - iso-url "^1.2.1" - it-all "^3.0.4" - it-first "^3.0.4" - it-glob "^3.0.1" - it-last "^3.0.4" - it-map "^3.0.5" - it-peekable "^3.0.3" - it-to-stream "^1.0.0" - merge-options "^3.0.4" - multiformats "^13.1.0" - nanoid "^5.0.7" - native-fetch "^4.0.2" - parse-duration "^2.1.2" - react-native-fetch-api "^3.0.0" - stream-to-it "^1.0.1" - uint8arrays "^5.0.3" - wherearewe "^2.0.1" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -lilconfig@^3.0.0: +lilconfig@^3.1.1: version "3.1.3" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: @@ -2524,12 +2108,12 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: - uc.micro "^1.0.1" + uc.micro "^2.0.0" load-tsconfig@^0.2.3: version "0.2.5" @@ -2546,18 +2130,6 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -2570,61 +2142,44 @@ lower-case@^2.0.2: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + main-event@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz" integrity sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw== -markdown-it-anchor@^8.4.1: +markdown-it-anchor@^8.6.7: version "8.6.7" - resolved "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== -markdown-it@^12.3.2: - version "12.3.2" - resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== +markdown-it@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== dependencies: argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" marked@^4.0.10: version "4.3.0" resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -merge-options@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz" - integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== - dependencies: - is-plain-obj "^2.1.0" - -merge-stream@^2.0.0: +mdurl@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== mime-db@1.52.0: version "1.52.0" @@ -2638,11 +2193,6 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - minimatch@^9.0.1: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" @@ -2660,10 +2210,15 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" ms@^2.1.3: version "2.1.3" @@ -2685,21 +2240,11 @@ multiformats@^13.0.0: resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.0.1.tgz" integrity sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA== -multiformats@^13.1.0: - version "13.1.0" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.1.0.tgz" - integrity sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ== - multiformats@^13.2.2, multiformats@^13.3.6: version "13.3.7" resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.3.7.tgz" integrity sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ== -multiformats@~13.1.3: - version "13.1.3" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz" - integrity sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw== - mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" @@ -2709,16 +2254,6 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^5.0.7: - version "5.1.5" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz" - integrity sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw== - -native-fetch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz" - integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -2727,55 +2262,16 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - object-assign@^4.0.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - p-defer@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz" integrity sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ== -p-fifo@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz" - integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== - dependencies: - fast-fifo "^1.0.0" - p-defer "^3.0.0" - p-queue@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz" @@ -2797,11 +2293,6 @@ param-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -parse-duration@^2.1.2: - version "2.1.4" - resolved "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz" - integrity sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg== - pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" @@ -2810,7 +2301,7 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -2823,28 +2314,41 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pirates@^4.0.1: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== +pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" + lilconfig "^3.1.1" prettier@3.6.2: version "3.6.2" @@ -2870,38 +2374,20 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-native-fetch-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz" - integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== - dependencies: - p-defer "^3.0.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== relateurl@^0.2.7: version "0.2.7" @@ -2920,62 +2406,35 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rollup@^4.0.2: - version "4.45.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.0.tgz#92d1b164eca1c6f2cb399ae7a1a8ee78967b6e33" - integrity sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A== +rollup@^4.34.8: + version "4.45.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.1.tgz#d0ef72a8d0a9210d832f9c3c5f3b6a2aa4b0ba64" + integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.45.0" - "@rollup/rollup-android-arm64" "4.45.0" - "@rollup/rollup-darwin-arm64" "4.45.0" - "@rollup/rollup-darwin-x64" "4.45.0" - "@rollup/rollup-freebsd-arm64" "4.45.0" - "@rollup/rollup-freebsd-x64" "4.45.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.45.0" - "@rollup/rollup-linux-arm-musleabihf" "4.45.0" - "@rollup/rollup-linux-arm64-gnu" "4.45.0" - "@rollup/rollup-linux-arm64-musl" "4.45.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.45.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.45.0" - "@rollup/rollup-linux-riscv64-gnu" "4.45.0" - "@rollup/rollup-linux-riscv64-musl" "4.45.0" - "@rollup/rollup-linux-s390x-gnu" "4.45.0" - "@rollup/rollup-linux-x64-gnu" "4.45.0" - "@rollup/rollup-linux-x64-musl" "4.45.0" - "@rollup/rollup-win32-arm64-msvc" "4.45.0" - "@rollup/rollup-win32-ia32-msvc" "4.45.0" - "@rollup/rollup-win32-x64-msvc" "4.45.0" + "@rollup/rollup-android-arm-eabi" "4.45.1" + "@rollup/rollup-android-arm64" "4.45.1" + "@rollup/rollup-darwin-arm64" "4.45.1" + "@rollup/rollup-darwin-x64" "4.45.1" + "@rollup/rollup-freebsd-arm64" "4.45.1" + "@rollup/rollup-freebsd-x64" "4.45.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.45.1" + "@rollup/rollup-linux-arm-musleabihf" "4.45.1" + "@rollup/rollup-linux-arm64-gnu" "4.45.1" + "@rollup/rollup-linux-arm64-musl" "4.45.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.45.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-musl" "4.45.1" + "@rollup/rollup-linux-s390x-gnu" "4.45.1" + "@rollup/rollup-linux-x64-gnu" "4.45.1" + "@rollup/rollup-linux-x64-musl" "4.45.1" + "@rollup/rollup-win32-arm64-msvc" "4.45.1" + "@rollup/rollup-win32-ia32-msvc" "4.45.1" + "@rollup/rollup-win32-x64-msvc" "4.45.1" fsevents "~2.3.2" -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -2995,28 +2454,11 @@ showdown@^2.1.0: dependencies: commander "^9.0.0" -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -3037,18 +2479,6 @@ source-map@^0.6.0, source-map@~0.6.0: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stream-to-it@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz" - integrity sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA== - dependencies: - it-stream-types "^2.0.1" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -3076,13 +2506,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -3104,11 +2527,6 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-json-comments@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" @@ -3124,9 +2542,9 @@ strnum@^2.1.0: resolved "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz" integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== -sucrase@^3.20.3: +sucrase@^3.35.0: version "3.35.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -3152,11 +2570,6 @@ terser@^5.15.1: commander "^2.20.0" source-map-support "~0.5.20" -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" @@ -3176,12 +2589,18 @@ timestamp-nano@^1.0.1: resolved "https://registry.npmjs.org/timestamp-nano/-/timestamp-nano-1.0.1.tgz" integrity sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA== -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== dependencies: - is-number "^7.0.0" + fdir "^6.4.4" + picomatch "^4.0.2" tr46@^1.0.1: version "1.0.1" @@ -3195,11 +2614,6 @@ tree-kill@^1.2.2: resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" @@ -3210,35 +2624,43 @@ tslib@^2.0.3, tslib@^2.5.0, tslib@^2.6.2: resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsup@8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/tsup/-/tsup-8.0.1.tgz" - integrity sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg== - dependencies: - bundle-require "^4.0.0" - cac "^6.7.12" - chokidar "^3.5.1" - debug "^4.3.1" - esbuild "^0.19.2" - execa "^5.0.0" - globby "^11.0.3" - joycon "^3.0.1" - postcss-load-config "^4.0.1" +tsup@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.5.0.tgz#4b1e25b1a8f4e4f89b764207bf37cfe2d7411d31" + integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ== + dependencies: + bundle-require "^5.1.0" + cac "^6.7.14" + chokidar "^4.0.3" + consola "^3.4.0" + debug "^4.4.0" + esbuild "^0.25.0" + fix-dts-default-cjs-exports "^1.0.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" resolve-from "^5.0.0" - rollup "^4.0.2" + rollup "^4.34.8" source-map "0.8.0-beta.0" - sucrase "^3.20.3" + sucrase "^3.35.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.11" tree-kill "^1.2.2" -typescript@5.3.3: - version "5.3.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + +ufo@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" + integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== uint8-varint@^2.0.1, uint8-varint@^2.0.2: version "2.0.2" @@ -3262,7 +2684,7 @@ uint8arrays@^4.0.2: dependencies: multiformats "^12.0.1" -uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.0.3, uint8arrays@^5.1.0: +uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz" integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww== @@ -3279,21 +2701,11 @@ undici-types@~7.8.0: resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== -undici@7.11.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-7.11.0.tgz#8e13a54f62afa756666c0590c38b3866e286d0b3" - integrity sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - uuid@11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz" @@ -3326,13 +2738,6 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -wherearewe@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz" - integrity sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw== - dependencies: - is-electron "^2.2.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -3340,32 +2745,6 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -winston-transport@^4.7.0: - version "4.7.0" - resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@3.12.0: - version "3.12.0" - resolved "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz" - integrity sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.7.0" - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -3388,8 +2767,3 @@ xmlcreate@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz" integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== - -yaml@^2.3.4: - version "2.8.0" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" - integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== From 5ffdc866e18216be0d1c22c4ab4a5d2c869ce8bb Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Wed, 16 Jul 2025 20:55:11 -0500 Subject: [PATCH 05/14] Test fixes --- src/index.js | 41 +++++---- test/index.spec.mjs | 203 +++++++++++++------------------------------- 2 files changed, 84 insertions(+), 160 deletions(-) diff --git a/src/index.js b/src/index.js index 7271185..eab6226 100644 --- a/src/index.js +++ b/src/index.js @@ -29,7 +29,7 @@ class FilebaseClient { #VALID_FORMATS = ["ipns-record", "raw", "car"]; #default_bucket; - #default_gateway = this.#PUBLIC_IPFS_GATEWAY; + #default_gateway; #ipfs_credentials; #ipfs_client; @@ -88,11 +88,7 @@ class FilebaseClient { Authorization: `Bearer ${Buffer.from(ipfsCredentials).toString("base64")}`, }, }, - method: "POST", responseType: "text", - validateStatus: function (status) { - return status === 200; - }, }); //endregion @@ -129,6 +125,11 @@ class FilebaseClient { }, }); //endregion + + //region IPFS Gateway Client + this.#default_gateway = + options?.gateway.endpoint || this.#PUBLIC_IPFS_GATEWAY; + //endregion } //region Utility Methods @@ -269,19 +270,30 @@ class FilebaseClient { //region File Methods async #uploadFiles(formData, options) { options.headers = options.headers || {}; + options.headers = { + ...options.headers, + }; options.headers["Authorization"] = `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; options.searchParams = options.searchParams || {}; options.searchParams["preserve-filenames"] = "true"; - const downloadResponse = await axios.request({ + const downloadResponse = await this.#ipfs_client.request({ + method: "POST", url: "api/v0/add", headers: options.headers, params: options.searchParams, + data: formData, + validateStatus: function (status) { + return status === 200; + }, }); const pins = []; for (const entry of downloadResponse.data.split("\n")) { + if (entry === "") { + continue; + } const parsedEntry = JSON.parse(entry); pins.push({ name: parsedEntry["Name"], @@ -455,7 +467,8 @@ class FilebaseClient { } async pinFile(path, cid, options) { - await axios.request({ + await this.#ipfs_client.request({ + method: "POST", url: "api/v0/pin/add", headers: { Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, @@ -464,6 +477,9 @@ class FilebaseClient { name: path, arg: cid, }, + validateStatus: function (status) { + return status === 200; + }, }); return true; } @@ -490,16 +506,7 @@ class FilebaseClient { } async uploadFiles(formData, options) { - let encodedCredentials = this.#getIpfsCredentials(options?.bucket); - const uploadOptions = { - headers: { - Authorization: `Bearer ${encodedCredentials}`, - }, - params: { - "preserve-filenames": "true", - }, - }; - + const uploadOptions = {}; return await this.#uploadFiles(formData, uploadOptions); } //endregion diff --git a/test/index.spec.mjs b/test/index.spec.mjs index 9ce0bb6..ce32307 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -8,14 +8,13 @@ import FilebaseClient from "../src/index.js"; // Application Constants const TEST_PREFIX = Date.now(); +const CLIENT_KEY = process.env.TEST_S3_KEY; +const CLIENT_SECRET = process.env.TEST_S3_SECRET; //region Bucket Tests test("create bucket", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Create bucket `create-bucket-test-pass` const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; @@ -38,10 +37,7 @@ test("create bucket", async () => { test("get bucket cid", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Create bucket `create-bucket-test-pass` const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; @@ -67,10 +63,7 @@ test("get bucket cid", async () => { test("generate bucket cid", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Create bucket `create-bucket-test-pass` const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; @@ -94,10 +87,7 @@ test("generate bucket cid", async () => { test("list buckets", async () => { const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), initialBucketsList = await filebaseClient.listBuckets(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -115,10 +105,7 @@ test("list buckets", async () => { test("delete bucket", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Create bucket `delete-bucket-test-pass` const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; @@ -148,10 +135,7 @@ test("delete bucket", async () => { //region File Tests async function createBucket(name) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Create bucket with name const bucketNameToCreate = name; @@ -168,11 +152,9 @@ async function createBucket(name) { async function uploadObject(bucket, key, body) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + }); // Upload Object await filebaseClient.uploadFile(key, body); @@ -187,11 +169,9 @@ async function uploadObject(bucket, key, body) { async function uploadObjects(bucket, key, body) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + }); // Upload Object await filebaseClient.uploadFiles(key, body); @@ -204,11 +184,9 @@ async function uploadObjects(bucket, key, body) { async function deleteObject(bucket, key) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + }); // Delete Object await filebaseClient.deleteFile(key); @@ -217,13 +195,10 @@ async function deleteObject(bucket, key) { async function deleteBucket(bucket) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); // Delete Bucket - await filebaseClient.deleteFile(bucket); + await filebaseClient.deleteBucket(bucket); return true; } @@ -238,18 +213,16 @@ test("delete object", async () => { const uploaded = await uploadObject( deleteTestBucket, objectNameToCreate, - Buffer.from("delete object", "utf-8"), + new Blob(["delete object"]), ); if (uploaded === false) { throw Error(`Failed to create object [delete-object-test]`); } // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: deleteTestBucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: deleteTestBucket, + }); // Delete object `delete-object-test` await filebaseClient.deleteFile(objectNameToCreate); @@ -337,11 +310,9 @@ test("generate presigned url for object", async () => { try { // Generate presigned URL for objects - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + }); const presignedUrl = await filebaseClient.generatePresignedUrl(objectNameToCreate); assert.strictEqual(typeof presignedUrl, "string"); @@ -372,11 +343,9 @@ test("download object", async () => { try { // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: downloadTestBucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + }); const downloadStream = await filebaseClient.downloadFile(objectNameToCreate), downloadFilename = uuidv4(), @@ -410,14 +379,10 @@ test("download object using gateway (ipfs)", async () => { try { // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }); const downloadStream = await filebaseClient.fetchContentByCid( uploaded["cid"], ), @@ -451,11 +416,9 @@ test("list objects", async () => { createdObjectCount++; } - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: listTestBucket }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: listTestBucket, + }); const objectList = await filebaseClient.listFiles(`list-object-test-`, { MaxKeys: 50, @@ -496,11 +459,9 @@ test("copy object", async () => { try { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { bucket: bucketSrc }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: bucketSrc, + }); // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` await filebaseClient.copyFile(objectNameToCreateSrc, bucketDest); @@ -528,10 +489,7 @@ test("copy object", async () => { //region Gateway Tests test("delete gateway", async () => { const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ); + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); await filebaseClient.createGateway(testGatewayName); await filebaseClient.deleteGateway(testGatewayName); const deletedName = await filebaseClient.getGateway(testGatewayName); @@ -540,10 +498,7 @@ test("delete gateway", async () => { test("create gateway", async () => { const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createGateway(testGatewayName); await filebaseClient.deleteGateway(testGatewayName); assert.strictEqual(createdName.name, testGatewayName); @@ -551,10 +506,7 @@ test("create gateway", async () => { test("update gateway", async () => { const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createGateway(testGatewayName); try { const updatedName = await filebaseClient.updateGateway(createdName.name, { @@ -569,10 +521,7 @@ test("update gateway", async () => { test("get gateway", async () => { const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createGateway(testGatewayName, {}); try { const testName = await filebaseClient.getGateway(createdName.name); @@ -584,10 +533,7 @@ test("get gateway", async () => { test("list gateways", async () => { const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_GW_KEY || process.env.TEST_KEY, - process.env.TEST_GW_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), initialGatewaysList = await filebaseClient.listGateways(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -610,10 +556,7 @@ const TEST_CID = process.env.TEST_NAME_CID, test("delete name", async () => { const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ); + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); await filebaseClient.createIpnsName(testNameLabel, TEST_CID); await filebaseClient.deleteIpnsName(testNameLabel); const deletedName = await filebaseClient.getIpnsName(testNameLabel); @@ -622,10 +565,7 @@ test("delete name", async () => { test("create name", async () => { const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); await filebaseClient.deleteIpnsName(testNameLabel); assert.strictEqual(createdName.label, testNameLabel); @@ -634,10 +574,7 @@ test("create name", async () => { test("import name", async () => { const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), importedName = await filebaseClient.importIpnsName( testNameLabel, TEST_CID, @@ -650,10 +587,7 @@ test("import name", async () => { test("update name", async () => { const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const updatedName = await filebaseClient.updateIpnsName( @@ -668,10 +602,7 @@ test("update name", async () => { test("get name", async () => { const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const testName = await filebaseClient.getIpnsName(createdName.label); @@ -684,10 +615,7 @@ test("get name", async () => { test("resolve name", async () => { const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const testNameValue = await filebaseClient.resolveIpnsName( @@ -701,10 +629,7 @@ test("resolve name", async () => { test("list names", async () => { const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - ), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), initialNamesList = await filebaseClient.listIpnsNames(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -736,14 +661,10 @@ test("download object using gateway (ipns)", async () => { try { // Download object `download-object-test` and assert it completes - const filebaseClient = new FilebaseClient( - process.env.TEST_S3_KEY || process.env.TEST_KEY, - process.env.TEST_S3_SECRET || process.env.TEST_SECRET, - { - bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, - }, - ); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + }); // Create IPNS Name const createdName = await filebaseClient.createIpnsName( @@ -773,18 +694,14 @@ const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT"; test("create pin", async () => { const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, testPinName = `${TEST_PREFIX}-create-pin-test-pass`, - filebaseClient = new FilebaseClient( - process.env.TEST_NAME_KEY || process.env.TEST_KEY, - process.env.TEST_NAME_SECRET || process.env.TEST_SECRET, - { - bucket: testBucketName, - }, - ); + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: testBucketName, + }); await createBucket(testBucketName); try { const createdPin = await filebaseClient.pinFile(testPinName, TEST_CID_1); - assert.strictEqual(createdPin.pin.cid, TEST_CID_1); - await filebaseClient.deleteFile(createdPin.name); + assert.strictEqual(createdPin, true); + await filebaseClient.deleteFile(testPinName); } finally { await deleteBucket(testBucketName); } From 1d2fb74dbd89176200b9b38184f037d393963ad9 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:43:44 -0500 Subject: [PATCH 06/14] General Fixes for Axios Clients --- src/index.js | 37 ++---- test/index.spec.mjs | 274 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 242 insertions(+), 69 deletions(-) diff --git a/src/index.js b/src/index.js index eab6226..fdf6432 100644 --- a/src/index.js +++ b/src/index.js @@ -16,8 +16,8 @@ import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import { unmarshalIPNSRecord } from "ipns"; class FilebaseClient { - #DEFAULT_IPFS_TIMEOUT = 60000; - #DEFAULT_IPFS_ENDPOINT = "https://rpc.filebase.io"; + #DEFAULT_RPC_TIMEOUT = 60000; + #DEFAULT_RPC_ENDPOINT = "https://rpc.filebase.io"; #DEFAULT_S3_ENDPOINT = "https://s3.filebase.com"; #DEFAULT_REGION = "us-east-1"; @@ -54,10 +54,7 @@ class FilebaseClient { */ constructor(clientKey, clientSecret, options) { //region S3 Client - const clientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_S3_ENDPOINT || this.#DEFAULT_S3_ENDPOINT - : this.#DEFAULT_S3_ENDPOINT; + const clientEndpoint = options?.endpoints?.s3 || this.#DEFAULT_S3_ENDPOINT; this.#s3_client = new S3Client({ credentials: { accessKeyId: clientKey, @@ -70,10 +67,7 @@ class FilebaseClient { //endregion //region IPFS Client - const ipfsEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_IPFS_ENDPOINT || this.#DEFAULT_IPFS_ENDPOINT - : this.#DEFAULT_IPFS_ENDPOINT; + const ipfsEndpoint = options?.endpoints?.rpc || this.#DEFAULT_RPC_ENDPOINT; this.#ipfs_credentials = `${clientKey}:${clientSecret}`; let ipfsCredentials = this.#ipfs_credentials; if (options?.bucket) { @@ -82,7 +76,7 @@ class FilebaseClient { } this.#ipfs_client = axios.create({ baseURL: ipfsEndpoint, - timeout: options?.timeout || this.#DEFAULT_IPFS_TIMEOUT, + timeout: options?.timeout || this.#DEFAULT_RPC_TIMEOUT, headers: { common: { Authorization: `Bearer ${Buffer.from(ipfsCredentials).toString("base64")}`, @@ -94,11 +88,7 @@ class FilebaseClient { //region Gateways Client const gatewayClientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_GW_ENDPOINT || - options?.gateway?.endpoint || - this.#DEFAULT_ENDPOINT - : options?.gateway?.endpoint || this.#DEFAULT_ENDPOINT; + options?.endpoints?.platform || this.#DEFAULT_ENDPOINT; this.#gateways_client = axios.create({ baseURL: `${gatewayClientEndpoint}/v1/gateways`, timeout: options?.timeout || this.#GATEWAY_DEFAULT_TIMEOUT, @@ -112,9 +102,7 @@ class FilebaseClient { //region Names Client const namesClientEndpoint = - process.env.NODE_ENV === "test" - ? process.env.TEST_NAME_ENDPOINT || this.#DEFAULT_ENDPOINT - : this.#DEFAULT_ENDPOINT; + options?.endpoints?.platform || this.#DEFAULT_ENDPOINT; this.#names_client = axios.create({ baseURL: `${namesClientEndpoint}/v1/names`, timeout: this.#DEFAULT_TIMEOUT, @@ -128,7 +116,7 @@ class FilebaseClient { //region IPFS Gateway Client this.#default_gateway = - options?.gateway.endpoint || this.#PUBLIC_IPFS_GATEWAY; + options?.endpoints.gateway || this.#PUBLIC_IPFS_GATEWAY; //endregion } @@ -275,14 +263,14 @@ class FilebaseClient { }; options.headers["Authorization"] = `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; - options.searchParams = options.searchParams || {}; - options.searchParams["preserve-filenames"] = "true"; + options.params = options.params || {}; + options.params["preserve-filenames"] = "true"; const downloadResponse = await this.#ipfs_client.request({ method: "POST", url: "api/v0/add", headers: options.headers, - params: options.searchParams, + params: options.params, data: formData, validateStatus: function (status) { return status === 200; @@ -895,8 +883,7 @@ class FilebaseClient { const downloadResponse = await axios.request({ method: "GET", - baseURL: selectedEndpoint, - url: `/${resolver}/${cid}`, + url: `${selectedEndpoint}/${resolver}/${cid}`, headers: downloadHeaders, responseType: "arraybuffer", timeout: options?.timeout || this.#GATEWAY_DEFAULT_TIMEOUT, diff --git a/test/index.spec.mjs b/test/index.spec.mjs index ce32307..7c01090 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -8,13 +8,27 @@ import FilebaseClient from "../src/index.js"; // Application Constants const TEST_PREFIX = Date.now(); -const CLIENT_KEY = process.env.TEST_S3_KEY; -const CLIENT_SECRET = process.env.TEST_S3_SECRET; +const TEST_IPFS_GATEWAY = + process.env.TEST_IPFS_GATEWAY || "https://ipfs.filebase.io"; +const TEST_S3_ENDPOINT = + process.env.TEST_S3_ENDPOINT || "https://s3.filebase.com"; +const TEST_RPC_ENDPOINT = + process.env.TEST_RPC_ENDPOINT || "https://rpc.filebase.io"; +const TEST_PLATFORM_ENDPOINT = + process.env.TEST_PLATFORM_ENDPOINT || "https://api.filebase.io"; +const CLIENT_KEY = process.env.TEST_KEY; +const CLIENT_SECRET = process.env.TEST_SECRET; //region Bucket Tests test("create bucket", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Create bucket `create-bucket-test-pass` const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; @@ -37,7 +51,13 @@ test("create bucket", async () => { test("get bucket cid", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Create bucket `create-bucket-test-pass` const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; @@ -63,7 +83,13 @@ test("get bucket cid", async () => { test("generate bucket cid", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Create bucket `create-bucket-test-pass` const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; @@ -87,7 +113,13 @@ test("generate bucket cid", async () => { test("list buckets", async () => { const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), initialBucketsList = await filebaseClient.listBuckets(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -105,7 +137,13 @@ test("list buckets", async () => { test("delete bucket", async () => { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Create bucket `delete-bucket-test-pass` const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; @@ -135,7 +173,13 @@ test("delete bucket", async () => { //region File Tests async function createBucket(name) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Create bucket with name const bucketNameToCreate = name; @@ -154,6 +198,11 @@ async function uploadObject(bucket, key, body) { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Upload Object @@ -171,10 +220,15 @@ async function uploadObjects(bucket, key, body) { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Upload Object - await filebaseClient.uploadFiles(key, body); + await filebaseClient.uploadDirectory(key, body); // Confirm Object Uploaded const uploadedObject = await filebaseClient.getFileMetadata(key); @@ -186,6 +240,11 @@ async function deleteObject(bucket, key) { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Delete Object @@ -195,7 +254,13 @@ async function deleteObject(bucket, key) { async function deleteBucket(bucket) { // Initialize FilebaseClient - const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); // Delete Bucket await filebaseClient.deleteBucket(bucket); @@ -222,6 +287,11 @@ test("delete object", async () => { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: deleteTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Delete object `delete-object-test` @@ -246,10 +316,10 @@ test("upload object", async () => { const uploaded = await uploadObject( uploadTestBucket, `create-object-test`, - Buffer.from("upload object", "utf-8"), + new Blob(["upload object"]), ); - assert.strictEqual(uploaded, true); + assert.notEqual(uploaded, false); await deleteObject(uploadTestBucket, `create-object-test`); } finally { await deleteBucket(uploadTestBucket); @@ -266,25 +336,25 @@ test("upload directory", async () => { const uploadForm = new FormData(); uploadForm.append( "file", - Buffer.from("upload test object", "utf-8"), - "/testObjects/1.txt", + new Blob(["upload test object"]), + "testObjects/1.txt", ); uploadForm.append( "file", - Buffer.from("upload deep test object", "utf-8"), - "/testObjects/deep/1.txt", + new Blob(["upload deep test object"]), + "testObjects/deep/1.txt", ); uploadForm.append( "file", - Buffer.from("upload top level test object", "utf-8"), - "/topLevel.txt", + new Blob(["upload top level test object"]), + "topLevel.txt", ); const uploaded = await uploadObjects( uploadDirectoryTestBucket, `create-directory-test`, uploadForm, ); - assert.strictEqual(uploaded, true); + assert.notEqual(uploaded, false); await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); } finally { await deleteBucket(uploadDirectoryTestBucket); @@ -302,7 +372,7 @@ test("generate presigned url for object", async () => { const uploaded = await uploadObject( downloadTestBucket, objectNameToCreate, - Buffer.from("download object", "utf-8"), + new Blob(["download object"]), ); if (uploaded === false) { throw Error(`Failed to create object [${objectNameToCreate}]`); @@ -312,6 +382,11 @@ test("generate presigned url for object", async () => { // Generate presigned URL for objects const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: downloadTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); const presignedUrl = await filebaseClient.generatePresignedUrl(objectNameToCreate); @@ -335,7 +410,7 @@ test("download object", async () => { const uploaded = await uploadObject( downloadTestBucket, objectNameToCreate, - Buffer.from("download object", "utf-8"), + new Blob(["download object"]), ); if (uploaded === false) { throw Error(`Failed to create object [download-object-test]`); @@ -345,6 +420,11 @@ test("download object", async () => { // Download object `download-object-test` and assert it completes const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: downloadTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); const downloadStream = await filebaseClient.downloadFile(objectNameToCreate), @@ -371,7 +451,7 @@ test("download object using gateway (ipfs)", async () => { const uploaded = await uploadObject( downloadTestBucket, objectNameToCreate, - Buffer.from("download object", "utf-8"), + new Blob(["download object"]), ); if (uploaded === false) { throw Error(`Failed to create object [download-object-test]`); @@ -381,10 +461,15 @@ test("download object using gateway (ipfs)", async () => { // Download object `download-object-test` and assert it completes const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: downloadTestBucket, - gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + gateway: TEST_IPFS_GATEWAY, + }, }); const downloadStream = await filebaseClient.fetchContentByCid( - uploaded["cid"], + uploaded["Metadata"]["cid"], ), downloadFilename = uuidv4(), downloadPath = Path.resolve(os.tmpdir(), downloadFilename), @@ -411,19 +496,24 @@ test("list objects", async () => { await uploadObject( listTestBucket, objectNameToCreate, - Buffer.from(`list objects ${createdObjectCount}`, "utf-8"), + new Blob([`list objects ${createdObjectCount}`]), ); createdObjectCount++; } const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: listTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); const objectList = await filebaseClient.listFiles(`list-object-test-`, { MaxKeys: 50, }); - assert.equal(objectList.Contents.length, 26); + assert.equal(objectList.entries.length, 26); let deletedObjectCount = 0; while (deletedObjectCount < 26) { @@ -448,10 +538,10 @@ test("copy object", async () => { const uploaded = await uploadObject( bucketSrc, objectNameToCreateSrc, - Buffer.from("copy object", "utf-8"), + new Blob(["copy object"]), ); try { - assert.equal(uploaded, true); + assert.notEqual(uploaded, false); // Create bucket `copy-object-test-pass-dest` const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; @@ -461,16 +551,30 @@ test("copy object", async () => { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: bucketSrc, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` - await filebaseClient.copyFile(objectNameToCreateSrc, bucketDest); + await filebaseClient.copyFile( + objectNameToCreateSrc, + objectNameToCreateSrc, + { + destinationBucket: bucketDest, + }, + ); try { // List bucket and assert new object exists const copiedObject = await filebaseClient.getFileMetadata( objectNameToCreateSrc, + { + bucket: bucketDest, + }, ); - assert.equal(copiedObject.ETag, '"8605273d870f50fde0d8fbcad4a8f702"'); + assert.equal(copiedObject.ETag, '"1181cc81508b7da38b06cc32da7df1f0"'); } finally { await deleteObject(bucketDest, objectNameToCreateSrc); } @@ -489,7 +593,13 @@ test("copy object", async () => { //region Gateway Tests test("delete gateway", async () => { const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); await filebaseClient.createGateway(testGatewayName); await filebaseClient.deleteGateway(testGatewayName); const deletedName = await filebaseClient.getGateway(testGatewayName); @@ -498,7 +608,13 @@ test("delete gateway", async () => { test("create gateway", async () => { const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createGateway(testGatewayName); await filebaseClient.deleteGateway(testGatewayName); assert.strictEqual(createdName.name, testGatewayName); @@ -506,7 +622,13 @@ test("create gateway", async () => { test("update gateway", async () => { const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createGateway(testGatewayName); try { const updatedName = await filebaseClient.updateGateway(createdName.name, { @@ -521,7 +643,13 @@ test("update gateway", async () => { test("get gateway", async () => { const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createGateway(testGatewayName, {}); try { const testName = await filebaseClient.getGateway(createdName.name); @@ -533,7 +661,13 @@ test("get gateway", async () => { test("list gateways", async () => { const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), initialGatewaysList = await filebaseClient.listGateways(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -556,7 +690,13 @@ const TEST_CID = process.env.TEST_NAME_CID, test("delete name", async () => { const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET); + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); await filebaseClient.createIpnsName(testNameLabel, TEST_CID); await filebaseClient.deleteIpnsName(testNameLabel); const deletedName = await filebaseClient.getIpnsName(testNameLabel); @@ -565,7 +705,13 @@ test("delete name", async () => { test("create name", async () => { const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); await filebaseClient.deleteIpnsName(testNameLabel); assert.strictEqual(createdName.label, testNameLabel); @@ -574,7 +720,13 @@ test("create name", async () => { test("import name", async () => { const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), importedName = await filebaseClient.importIpnsName( testNameLabel, TEST_CID, @@ -587,7 +739,13 @@ test("import name", async () => { test("update name", async () => { const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const updatedName = await filebaseClient.updateIpnsName( @@ -602,7 +760,13 @@ test("update name", async () => { test("get name", async () => { const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const testName = await filebaseClient.getIpnsName(createdName.label); @@ -615,7 +779,13 @@ test("get name", async () => { test("resolve name", async () => { const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); try { const testNameValue = await filebaseClient.resolveIpnsName( @@ -629,7 +799,13 @@ test("resolve name", async () => { test("list names", async () => { const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, - filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET), + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), initialNamesList = await filebaseClient.listIpnsNames(), countToCreate = 3; for (let i = 0; i < countToCreate; i++) { @@ -653,7 +829,7 @@ test("download object using gateway (ipns)", async () => { const uploaded = await uploadObject( downloadTestBucket, objectNameToCreate, - Buffer.from("download object", "utf-8"), + new Blob(["download object"]), ); if (uploaded === false) { throw Error(`Failed to create object [download-object-test]`); @@ -664,12 +840,17 @@ test("download object using gateway (ipns)", async () => { const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: downloadTestBucket, gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); // Create IPNS Name const createdName = await filebaseClient.createIpnsName( `${objectNameToCreate}-ipns`, - uploaded.cid, + uploaded["Metadata"]["cid"], ); const downloadStream = await filebaseClient.fetchContentByIpnsName( @@ -696,6 +877,11 @@ test("create pin", async () => { testPinName = `${TEST_PREFIX}-create-pin-test-pass`, filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { bucket: testBucketName, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, }); await createBucket(testBucketName); try { From a0407465a3c7727a6771ff720d13833a94c57067 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Mon, 21 Jul 2025 15:26:03 -0500 Subject: [PATCH 07/14] Use named export for better browser support --- package.json | 13 +- src/index.js | 2 +- test/index.spec.cjs | 895 ++++++++++++++++++++++++++++++++++++++++++++ test/index.spec.mjs | 2 +- tsup.config.js | 43 ++- yarn.lock | 458 +++++++++++++---------- 6 files changed, 1192 insertions(+), 221 deletions(-) create mode 100644 test/index.spec.cjs diff --git a/package.json b/package.json index 7923194..fb45ce8 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,12 @@ "module": "./src/index.js", "types": "./dist/index.d.ts", "exports": { - ".": { - "types": "./dist/index.d.ts", - "require": "./dist/index.js", - "import": "./src/index.js" - } + "node": { + "types": "./dist/node/index.d.ts", + "require": "./dist/node/index.js", + "import": "./dist/node/index.mjs" + }, + "default": "./dist/browser/index.js" }, "files": [ "dist", @@ -39,6 +40,8 @@ ], "devDependencies": { "clean-jsdoc-theme": "4.3.0", + "esbuild": "^0.25.8", + "esbuild-plugins-node-modules-polyfill": "1.7.1", "jsdoc": "4.0.4", "prettier": "3.6.2", "tsup": "8.5.0", diff --git a/src/index.js b/src/index.js index fdf6432..8588eb0 100644 --- a/src/index.js +++ b/src/index.js @@ -907,4 +907,4 @@ class FilebaseClient { //endregion } -export default FilebaseClient; +export { FilebaseClient }; diff --git a/test/index.spec.cjs b/test/index.spec.cjs new file mode 100644 index 0000000..7e81d19 --- /dev/null +++ b/test/index.spec.cjs @@ -0,0 +1,895 @@ +const test = require("node:test"); +const assert = require("node:assert/strict"); +const Path = require("node:path"); +const { writeFile } = require("node:fs/promises"); +const { v4: uuidv4 } = require("uuid"); +const os = require("node:os"); +const { FilebaseClient } = require("../dist/node/index.js"); + +// Application Constants +const TEST_PREFIX = Date.now(); +const TEST_IPFS_GATEWAY = + process.env.TEST_IPFS_GATEWAY || "https://ipfs.filebase.io"; +const TEST_S3_ENDPOINT = + process.env.TEST_S3_ENDPOINT || "https://s3.filebase.com"; +const TEST_RPC_ENDPOINT = + process.env.TEST_RPC_ENDPOINT || "https://rpc.filebase.io"; +const TEST_PLATFORM_ENDPOINT = + process.env.TEST_PLATFORM_ENDPOINT || "https://api.filebase.io"; +const CLIENT_KEY = process.env.TEST_KEY; +const CLIENT_SECRET = process.env.TEST_SECRET; + +//region Bucket Tests +test("create bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create bucket `create-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-create-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + try { + // List buckets + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + // Assert new bucket exists + assert.equal(createdBucket.Name, bucketNameToCreate); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + } +}); + +test("get bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGet = `${TEST_PREFIX}-get-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGet); + + try { + // Generate bucket CID + await filebaseClient.generateBucketCid(bucketNameToGet); + + // Get bucket information + const bucketCid = await filebaseClient.getBucketCid(bucketNameToGet); + + // Assert new bucket exists + assert.equal( + bucketCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGet); + } +}); + +test("generate bucket cid", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create bucket `create-bucket-test-pass` + const bucketNameToGenerate = `${TEST_PREFIX}-generate-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToGenerate); + + try { + // Generate bucket CID + const generatedCid = + await filebaseClient.generateBucketCid(bucketNameToGenerate); + + // Assert new bucket exists + assert.equal( + generatedCid, + "bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354", + ); + } finally { + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToGenerate); + } +}); + +test("list buckets", async () => { + const testBucketName = `${TEST_PREFIX}-list-bucket-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + initialBucketsList = await filebaseClient.listBuckets(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createBucket(`${testBucketName}-${i}`); + } + const bucketsList = await filebaseClient.listBuckets(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteBucket(`${testBucketName}-${i}`); + } + assert.strictEqual( + bucketsList.length, + initialBucketsList.length + countToCreate, + ); +}); + +test("delete bucket", async () => { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create bucket `delete-bucket-test-pass` + const bucketNameToCreate = `${TEST_PREFIX}-delete-bucket-test-pass`; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + if (typeof createdBucket === "undefined") { + throw new Error(`Unable to create test bucket [delete-bucket-test-pass]`); + } + + // Delete new bucket + await filebaseClient.deleteBucket(bucketNameToCreate); + + // List buckets and assert new bucket does not exist + const updatedBuckets = await filebaseClient.listBuckets(), + deletedBucket = updatedBuckets.find((updatedBucket) => { + return updatedBucket.Name === bucketNameToCreate; + }); + assert.equal(typeof deletedBucket, "undefined"); +}); +//endregion + +//region File Tests +async function createBucket(name) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create bucket with name + const bucketNameToCreate = name; + await filebaseClient.createBucket(bucketNameToCreate); + + // List buckets and assert new bucket exists + const currentBuckets = await filebaseClient.listBuckets(), + createdBucket = currentBuckets.find((currentBucket) => { + return currentBucket.Name === bucketNameToCreate; + }); + + return typeof createdBucket !== "undefined"; +} + +async function uploadObject(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Upload Object + await filebaseClient.uploadFile(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false + ? uploadedObject + : false; +} + +async function uploadObjects(bucket, key, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Upload Object + await filebaseClient.uploadDirectory(key, body); + + // Confirm Object Uploaded + const uploadedObject = await filebaseClient.getFileMetadata(key); + + return typeof uploadedObject !== "undefined" && uploadedObject !== false; +} + +async function deleteObject(bucket, key) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Delete Object + await filebaseClient.deleteFile(key); + return true; +} + +async function deleteBucket(bucket) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Delete Bucket + await filebaseClient.deleteBucket(bucket); + return true; +} + +test("delete object", async () => { + // Create bucket `delete-object-test-pass` + const deleteTestBucket = `${TEST_PREFIX}-delete-object-test-pass`; + await createBucket(deleteTestBucket); + + try { + // Upload object `delete-object-test` + const objectNameToCreate = `delete-object-test`; + const uploaded = await uploadObject( + deleteTestBucket, + objectNameToCreate, + new Blob(["delete object"]), + ); + if (uploaded === false) { + throw Error(`Failed to create object [delete-object-test]`); + } + + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: deleteTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Delete object `delete-object-test` + await filebaseClient.deleteFile(objectNameToCreate); + + // List bucket and assert new object doesn't exist + const uploadedObject = + await filebaseClient.getFileMetadata(objectNameToCreate); + assert.equal(uploadedObject, false); + } finally { + await deleteBucket(deleteTestBucket); + } +}); + +test("upload object", async () => { + // Create Bucket `create-object-test-pass + const uploadTestBucket = `${TEST_PREFIX}-create-object-test-pass`; + await createBucket(uploadTestBucket); + + try { + // Upload object `create-object-test` + const uploaded = await uploadObject( + uploadTestBucket, + `create-object-test`, + new Blob(["upload object"]), + ); + + assert.notEqual(uploaded, false); + await deleteObject(uploadTestBucket, `create-object-test`); + } finally { + await deleteBucket(uploadTestBucket); + } +}); + +test("upload directory", async () => { + // Create Bucket `create-object-test-pass + const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; + await createBucket(uploadDirectoryTestBucket); + + try { + // Upload object `create-object-test` + const uploadForm = new FormData(); + uploadForm.append( + "file", + new Blob(["upload test object"]), + "testObjects/1.txt", + ); + uploadForm.append( + "file", + new Blob(["upload deep test object"]), + "testObjects/deep/1.txt", + ); + uploadForm.append( + "file", + new Blob(["upload top level test object"]), + "topLevel.txt", + ); + const uploaded = await uploadObjects( + uploadDirectoryTestBucket, + `create-directory-test`, + uploadForm, + ); + assert.notEqual(uploaded, false); + await deleteObject(uploadDirectoryTestBucket, `create-directory-test`); + } finally { + await deleteBucket(uploadDirectoryTestBucket); + } +}); + +test("generate presigned url for object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-presigned-url-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `presigned-url-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + new Blob(["download object"]), + ); + if (uploaded === false) { + throw Error(`Failed to create object [${objectNameToCreate}]`); + } + + try { + // Generate presigned URL for objects + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + const presignedUrl = + await filebaseClient.generatePresignedUrl(objectNameToCreate); + assert.strictEqual(typeof presignedUrl, "string"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + new Blob(["download object"]), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + const downloadStream = + await filebaseClient.downloadFile(objectNameToCreate), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("download object using gateway (ipfs)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + new Blob(["download object"]), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + gateway: TEST_IPFS_GATEWAY, + }, + }); + const downloadStream = await filebaseClient.fetchContentByCid( + uploaded["Metadata"]["cid"], + ), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); + +test("list objects", async () => { + // Create bucket `list-objects-test-pass` + const listTestBucket = `${TEST_PREFIX}-list-objects-test-pass`; + await createBucket(listTestBucket); + + try { + let createdObjectCount = 0; + while (createdObjectCount < 26) { + // Upload objects `list-object-test-[x]` + const objectNameToCreate = `list-object-test-${createdObjectCount}`; + await uploadObject( + listTestBucket, + objectNameToCreate, + new Blob([`list objects ${createdObjectCount}`]), + ); + createdObjectCount++; + } + + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: listTestBucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + const objectList = await filebaseClient.listFiles(`list-object-test-`, { + MaxKeys: 50, + }); + assert.equal(objectList.entries.length, 26); + + let deletedObjectCount = 0; + while (deletedObjectCount < 26) { + // Delete objects `list-object-test-[x]` + const objectNameToDelete = `list-object-test-${deletedObjectCount}`; + await deleteObject(listTestBucket, objectNameToDelete); + deletedObjectCount++; + } + } finally { + await deleteBucket(listTestBucket); + } +}); + +test("copy object", async () => { + // Create bucket `copy-object-test-pass-src` + const bucketSrc = `${TEST_PREFIX}-copy-object-test-pass-src`; + await createBucket(bucketSrc); + + try { + // Upload object `copy-object-test` + const objectNameToCreateSrc = `copy-object-test`; + const uploaded = await uploadObject( + bucketSrc, + objectNameToCreateSrc, + new Blob(["copy object"]), + ); + try { + assert.notEqual(uploaded, false); + + // Create bucket `copy-object-test-pass-dest` + const bucketDest = `${TEST_PREFIX}-copy-object-test-pass-dest`; + await createBucket(bucketDest); + + try { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: bucketSrc, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Copy object `copy-object-test` from `copy-object-test-pass-src` to `copy-object-test-pass-dest` + await filebaseClient.copyFile( + objectNameToCreateSrc, + objectNameToCreateSrc, + { + destinationBucket: bucketDest, + }, + ); + try { + // List bucket and assert new object exists + const copiedObject = await filebaseClient.getFileMetadata( + objectNameToCreateSrc, + { + bucket: bucketDest, + }, + ); + assert.equal(copiedObject.ETag, '"1181cc81508b7da38b06cc32da7df1f0"'); + } finally { + await deleteObject(bucketDest, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketDest); + } + } finally { + await deleteObject(bucketSrc, objectNameToCreateSrc); + } + } finally { + await deleteBucket(bucketSrc); + } +}); +//endregion + +//region Gateway Tests +test("delete gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-delete-gateway-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + const deletedName = await filebaseClient.getGateway(testGatewayName); + assert.strictEqual(deletedName, false); +}); + +test("create gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-create-gateway-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createGateway(testGatewayName); + await filebaseClient.deleteGateway(testGatewayName); + assert.strictEqual(createdName.name, testGatewayName); +}); + +test("update gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-update-gateway-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createGateway(testGatewayName); + try { + const updatedName = await filebaseClient.updateGateway(createdName.name, { + private: true, + enabled: false, + }); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("get gateway", async () => { + const testGatewayName = `${TEST_PREFIX}-get-gateway-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createGateway(testGatewayName, {}); + try { + const testName = await filebaseClient.getGateway(createdName.name); + assert.strictEqual(testName.name, testGatewayName); + } finally { + await filebaseClient.deleteGateway(testGatewayName); + } +}); + +test("list gateways", async () => { + const testGatewayName = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + initialGatewaysList = await filebaseClient.listGateways(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createGateway(`${testGatewayName}-${i}`); + } + const gatewaysList = await filebaseClient.listGateways(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteGateway(`${testGatewayName}-${i}`); + } + assert.strictEqual( + gatewaysList.length, + initialGatewaysList.length + countToCreate, + ); +}); +//endregion + +//region Names Tests +const TEST_CID = process.env.TEST_NAME_CID, + TEST_PRIVATE_KEY = process.env.TEST_NAME_PRIVATE_KEY; + +test("delete name", async () => { + const testNameLabel = `${TEST_PREFIX}-delete-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + const deletedName = await filebaseClient.getIpnsName(testNameLabel); + assert.strictEqual(deletedName, false); +}); + +test("create name", async () => { + const testNameLabel = `${TEST_PREFIX}-create-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(createdName.label, testNameLabel); + assert.strictEqual(createdName.cid, TEST_CID); +}); + +test("import name", async () => { + const testNameLabel = `${TEST_PREFIX}-import-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + importedName = await filebaseClient.importIpnsName( + testNameLabel, + TEST_CID, + TEST_PRIVATE_KEY, + ); + await filebaseClient.deleteIpnsName(testNameLabel); + assert.strictEqual(importedName.label, testNameLabel); + assert.strictEqual(importedName.cid, TEST_CID); +}); + +test("update name", async () => { + const testNameLabel = `${TEST_PREFIX}-update-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const updatedName = await filebaseClient.updateIpnsName( + createdName.label, + TEST_CID, + ); + assert.strictEqual(updatedName, true); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("get name", async () => { + const testNameLabel = `${TEST_PREFIX}-get-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testName = await filebaseClient.getIpnsName(createdName.label); + assert.strictEqual(testName.label, testNameLabel); + assert.strictEqual(testName.cid, TEST_CID); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("resolve name", async () => { + const testNameLabel = `${TEST_PREFIX}-resolve-name-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + createdName = await filebaseClient.createIpnsName(testNameLabel, TEST_CID); + try { + const testNameValue = await filebaseClient.resolveIpnsName( + createdName.network_key, + ); + assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); + } finally { + await filebaseClient.deleteIpnsName(testNameLabel); + } +}); + +test("list names", async () => { + const testNameLabel = `${TEST_PREFIX}-list-names-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }), + initialNamesList = await filebaseClient.listIpnsNames(), + countToCreate = 3; + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.createIpnsName(`${testNameLabel}-${i}`, TEST_CID); + } + const namesList = await filebaseClient.listIpnsNames(); + for (let i = 0; i < countToCreate; i++) { + await filebaseClient.deleteIpnsName(`${testNameLabel}-${i}`); + } + assert.strictEqual(namesList.length, initialNamesList.length + countToCreate); +}); + +test("download object using gateway (ipns)", async () => { + // Create bucket `download-object-test-pass` + const downloadTestBucket = `${TEST_PREFIX}-download-object-ipns-test-pass`; + await createBucket(downloadTestBucket); + + try { + // Upload object `download-object-test` + const objectNameToCreate = `download-object-test`; + const uploaded = await uploadObject( + downloadTestBucket, + objectNameToCreate, + new Blob(["download object"]), + ); + if (uploaded === false) { + throw Error(`Failed to create object [download-object-test]`); + } + + try { + // Download object `download-object-test` and assert it completes + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: downloadTestBucket, + gateway: { endpoint: process.env.TEST_IPFS_GATEWAY }, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Create IPNS Name + const createdName = await filebaseClient.createIpnsName( + `${objectNameToCreate}-ipns`, + uploaded["Metadata"]["cid"], + ); + + const downloadStream = await filebaseClient.fetchContentByIpnsName( + createdName["network_key"], + ), + downloadFilename = uuidv4(), + downloadPath = Path.resolve(os.tmpdir(), downloadFilename), + writeFileResult = await writeFile(downloadPath, downloadStream); + assert.strictEqual(typeof writeFileResult, "undefined"); + } finally { + await deleteObject(downloadTestBucket, objectNameToCreate); + } + } finally { + await deleteBucket(downloadTestBucket); + } +}); +//endregion + +//region Pinning API Tests +const TEST_CID_1 = "QmSEu6zGwKgkQA3ZKaDnvkrwre1kkQa7eRFCbQi7waNwTT"; + +test("create pin", async () => { + const testBucketName = `${TEST_PREFIX}-create-pin-test-pass`, + testPinName = `${TEST_PREFIX}-create-pin-test-pass`, + filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket: testBucketName, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + await createBucket(testBucketName); + try { + const createdPin = await filebaseClient.pinFile(testPinName, TEST_CID_1); + assert.strictEqual(createdPin, true); + await filebaseClient.deleteFile(testPinName); + } finally { + await deleteBucket(testBucketName); + } +}); +//endregion diff --git a/test/index.spec.mjs b/test/index.spec.mjs index 7c01090..ff181e5 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -4,7 +4,7 @@ import * as Path from "node:path"; import { writeFile } from "node:fs/promises"; import { v4 as uuidv4 } from "uuid"; import os from "node:os"; -import FilebaseClient from "../src/index.js"; +import { FilebaseClient } from "../dist/node/index.mjs"; // Application Constants const TEST_PREFIX = Date.now(); diff --git a/tsup.config.js b/tsup.config.js index 7b60a58..47494c4 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -1,13 +1,34 @@ import { defineConfig } from "tsup"; +import { nodeModulesPolyfillPlugin } from "esbuild-plugins-node-modules-polyfill"; -export default defineConfig({ - entry: ["src/index.js"], - format: ["cjs"], - dts: true, - clean: true, - sourcemap: true, - minify: true, - bundle: true, - target: ['es2020', 'node21'], - platform: "neutral", -}); +export default defineConfig([ + { + entry: ["src/index.js"], + format: ["cjs", "esm"], + target: "node18", + outDir: "dist/node", + dts: true, + clean: true, + sourcemap: true, + minify: true, + noExternal: ["ipns"], + }, + { + entry: ["src/index.js"], + format: ["esm"], + target: "es2018", + outDir: "dist/browser", + dts: true, + clean: true, + sourcemap: true, + minify: true, + noExternal: ["ipns"], + esbuildPlugins: [ + nodeModulesPolyfillPlugin({ + modules: { + crypto: true, + }, + }), + ], + }, +]); diff --git a/yarn.lock b/yarn.lock index 70052a2..79cf246 100644 --- a/yarn.lock +++ b/yarn.lock @@ -659,135 +659,135 @@ dependencies: "@chainsafe/is-ip" "^2.0.1" -"@esbuild/aix-ppc64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz#164b19122e2ed54f85469df9dea98ddb01d5e79e" - integrity sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw== - -"@esbuild/android-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz#8f539e7def848f764f6432598e51cc3820fde3a5" - integrity sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA== - -"@esbuild/android-arm@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.6.tgz#4ceb0f40113e9861169be83e2a670c260dd234ff" - integrity sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg== - -"@esbuild/android-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.6.tgz#ad4f280057622c25fe985c08999443a195dc63a8" - integrity sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A== - -"@esbuild/darwin-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz#d1f04027396b3d6afc96bacd0d13167dfd9f01f7" - integrity sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA== - -"@esbuild/darwin-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz#2b4a6cedb799f635758d7832d75b23772c8ef68f" - integrity sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg== - -"@esbuild/freebsd-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz#a26266cc97dd78dc3c3f3d6788b1b83697b1055d" - integrity sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg== - -"@esbuild/freebsd-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz#9feb8e826735c568ebfd94859b22a3fbb6a9bdd2" - integrity sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ== - -"@esbuild/linux-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz#c07cbed8e249f4c28e7f32781d36fc4695293d28" - integrity sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ== - -"@esbuild/linux-arm@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz#d6e2cd8ef3196468065d41f13fa2a61aaa72644a" - integrity sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw== - -"@esbuild/linux-ia32@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz#3e682bd47c4eddcc4b8f1393dfc8222482f17997" - integrity sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw== - -"@esbuild/linux-loong64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz#473f5ea2e52399c08ad4cd6b12e6dbcddd630f05" - integrity sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg== - -"@esbuild/linux-mips64el@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz#9960631c9fd61605b0939c19043acf4ef2b51718" - integrity sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw== - -"@esbuild/linux-ppc64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz#477cbf8bb04aa034b94f362c32c86b5c31db8d3e" - integrity sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw== - -"@esbuild/linux-riscv64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz#bcdb46c8fb8e93aa779e9a0a62cd4ac00dcac626" - integrity sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w== - -"@esbuild/linux-s390x@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz#f412cf5fdf0aea849ff51c73fd817c6c0234d46d" - integrity sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw== - -"@esbuild/linux-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz#d8233c09b5ebc0c855712dc5eeb835a3a3341108" - integrity sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig== - -"@esbuild/netbsd-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz#f51ae8dd1474172e73cf9cbaf8a38d1c72dd8f1a" - integrity sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q== - -"@esbuild/netbsd-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz#a267538602c0e50a858cf41dcfe5d8036f8da8e7" - integrity sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g== - -"@esbuild/openbsd-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz#a51be60c425b85c216479b8c344ad0511635f2d2" - integrity sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg== - -"@esbuild/openbsd-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz#7e4a743c73f75562e29223ba69d0be6c9c9008da" - integrity sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw== - -"@esbuild/openharmony-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz#2087a5028f387879154ebf44bdedfafa17682e5b" - integrity sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA== - -"@esbuild/sunos-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz#56531f861723ea0dc6283a2bb8837304223cb736" - integrity sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA== - -"@esbuild/win32-arm64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz#f4989f033deac6fae323acff58764fa8bc01436e" - integrity sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q== - -"@esbuild/win32-ia32@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz#b260e9df71e3939eb33925076d39f63cec7d1525" - integrity sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ== - -"@esbuild/win32-x64@0.25.6": - version "0.25.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz#4276edd5c105bc28b11c6a1f76fb9d29d1bd25c1" - integrity sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA== +"@esbuild/aix-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727" + integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== + +"@esbuild/android-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6" + integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== + +"@esbuild/android-arm@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059" + integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== + +"@esbuild/android-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0" + integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== + +"@esbuild/darwin-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d" + integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== + +"@esbuild/darwin-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2" + integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== + +"@esbuild/freebsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada" + integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== + +"@esbuild/freebsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343" + integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== + +"@esbuild/linux-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9" + integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== + +"@esbuild/linux-arm@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19" + integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== + +"@esbuild/linux-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d" + integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== + +"@esbuild/linux-loong64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4" + integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== + +"@esbuild/linux-mips64el@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340" + integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== + +"@esbuild/linux-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe" + integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== + +"@esbuild/linux-riscv64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083" + integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== + +"@esbuild/linux-s390x@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71" + integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== + +"@esbuild/linux-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz" + integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ== + +"@esbuild/netbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0" + integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== + +"@esbuild/netbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c" + integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg== + +"@esbuild/openbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45" + integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== + +"@esbuild/openbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc" + integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ== + +"@esbuild/openharmony-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a" + integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== + +"@esbuild/sunos-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb" + integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== + +"@esbuild/win32-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1" + integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== + +"@esbuild/win32-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4" + integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== + +"@esbuild/win32-x64@0.25.8": + version "0.25.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c" + integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -835,7 +835,7 @@ "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.4" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz" integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== "@jridgewell/trace-mapping@^0.3.9": @@ -853,6 +853,11 @@ dependencies: lodash "^4.17.21" +"@jspm/core@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@jspm/core/-/core-2.1.0.tgz" + integrity sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg== + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" @@ -1016,12 +1021,12 @@ "@rollup/rollup-linux-x64-gnu@4.45.1": version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz" integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== "@rollup/rollup-linux-x64-musl@4.45.1": version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz" integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw== "@rollup/rollup-win32-arm64-msvc@4.45.1": @@ -1540,17 +1545,17 @@ "@types/estree@1.0.8": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/linkify-it@^5": version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== "@types/markdown-it@^14.1.1": version "14.1.2" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" + resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: "@types/linkify-it" "^5" @@ -1558,7 +1563,7 @@ "@types/mdurl@^2": version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== "@types/node@*": @@ -1580,7 +1585,7 @@ abort-error@^1.0.1: acorn@^8.14.0: version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== acorn@^8.8.2: @@ -1676,14 +1681,14 @@ buffer@^6.0.3: bundle-require@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz" integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== dependencies: load-tsconfig "^0.2.3" cac@^6.7.14: version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== camel-case@^4.1.2: @@ -1708,7 +1713,7 @@ cborg@^4.2.3: chokidar@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" @@ -1722,7 +1727,7 @@ clean-css@~5.3.2: clean-jsdoc-theme@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz#6cd55ff7b25ff6d1719ae0ff9f1cdb5ef07bf640" + resolved "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz" integrity sha512-QMrBdZ2KdPt6V2Ytg7dIt0/q32U4COpxvR0UDhPjRRKRL0o0MvRCR5YpY37/4rPF1SI1AYEKAWyof7ndCb/dzA== dependencies: "@jsdoc/salty" "^0.2.4" @@ -1773,12 +1778,17 @@ commander@^9.0.0: confbox@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz" integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== +confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + consola@^3.4.0: version "3.4.2" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + resolved "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz" integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== cross-spawn@^7.0.0: @@ -1792,7 +1802,7 @@ cross-spawn@^7.0.0: debug@^4.4.0: version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" @@ -1837,37 +1847,46 @@ entities@^4.4.0: resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -esbuild@^0.25.0: - version "0.25.6" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.6.tgz#9b82a3db2fa131aec069ab040fd57ed0a880cdcd" - integrity sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg== +esbuild-plugins-node-modules-polyfill@1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.7.1.tgz" + integrity sha512-IEaUhaS1RukGGcatDzqJmR+AzUWJ2upTJZP2i7FzR37Iw5Lk0LReCTnWnPMWnGG9lO4MWTGKEGGLWEOPegTRJA== + dependencies: + "@jspm/core" "^2.1.0" + local-pkg "^1.1.1" + resolve.exports "^2.0.3" + +esbuild@^0.25.0, esbuild@^0.25.8: + version "0.25.8" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz" + integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.6" - "@esbuild/android-arm" "0.25.6" - "@esbuild/android-arm64" "0.25.6" - "@esbuild/android-x64" "0.25.6" - "@esbuild/darwin-arm64" "0.25.6" - "@esbuild/darwin-x64" "0.25.6" - "@esbuild/freebsd-arm64" "0.25.6" - "@esbuild/freebsd-x64" "0.25.6" - "@esbuild/linux-arm" "0.25.6" - "@esbuild/linux-arm64" "0.25.6" - "@esbuild/linux-ia32" "0.25.6" - "@esbuild/linux-loong64" "0.25.6" - "@esbuild/linux-mips64el" "0.25.6" - "@esbuild/linux-ppc64" "0.25.6" - "@esbuild/linux-riscv64" "0.25.6" - "@esbuild/linux-s390x" "0.25.6" - "@esbuild/linux-x64" "0.25.6" - "@esbuild/netbsd-arm64" "0.25.6" - "@esbuild/netbsd-x64" "0.25.6" - "@esbuild/openbsd-arm64" "0.25.6" - "@esbuild/openbsd-x64" "0.25.6" - "@esbuild/openharmony-arm64" "0.25.6" - "@esbuild/sunos-x64" "0.25.6" - "@esbuild/win32-arm64" "0.25.6" - "@esbuild/win32-ia32" "0.25.6" - "@esbuild/win32-x64" "0.25.6" + "@esbuild/aix-ppc64" "0.25.8" + "@esbuild/android-arm" "0.25.8" + "@esbuild/android-arm64" "0.25.8" + "@esbuild/android-x64" "0.25.8" + "@esbuild/darwin-arm64" "0.25.8" + "@esbuild/darwin-x64" "0.25.8" + "@esbuild/freebsd-arm64" "0.25.8" + "@esbuild/freebsd-x64" "0.25.8" + "@esbuild/linux-arm" "0.25.8" + "@esbuild/linux-arm64" "0.25.8" + "@esbuild/linux-ia32" "0.25.8" + "@esbuild/linux-loong64" "0.25.8" + "@esbuild/linux-mips64el" "0.25.8" + "@esbuild/linux-ppc64" "0.25.8" + "@esbuild/linux-riscv64" "0.25.8" + "@esbuild/linux-s390x" "0.25.8" + "@esbuild/linux-x64" "0.25.8" + "@esbuild/netbsd-arm64" "0.25.8" + "@esbuild/netbsd-x64" "0.25.8" + "@esbuild/openbsd-arm64" "0.25.8" + "@esbuild/openbsd-x64" "0.25.8" + "@esbuild/openharmony-arm64" "0.25.8" + "@esbuild/sunos-x64" "0.25.8" + "@esbuild/win32-arm64" "0.25.8" + "@esbuild/win32-ia32" "0.25.8" + "@esbuild/win32-x64" "0.25.8" escape-string-regexp@^2.0.0: version "2.0.0" @@ -1879,6 +1898,11 @@ eventemitter3@^5.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +exsolve@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz" + integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== + fast-xml-parser@4.4.1: version "4.4.1" resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" @@ -1895,12 +1919,12 @@ fast-xml-parser@5.2.5: fdir@^6.4.4: version "6.4.6" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== fix-dts-default-cjs-exports@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz#955cb6b3d519691c57828b078adadf2cb92e9549" + resolved "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz" integrity sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg== dependencies: magic-string "^0.30.17" @@ -1909,7 +1933,7 @@ fix-dts-default-cjs-exports@^1.0.0: follow-redirects@^1.15.6: version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== foreground-child@^3.1.0: @@ -2044,7 +2068,7 @@ jackspeak@^2.3.5: joycon@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== js2xmlparser@^4.0.2: @@ -2056,7 +2080,7 @@ js2xmlparser@^4.0.2: jsdoc@4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.4.tgz#86565a9e39cc723a3640465b3fb189a22d1206ca" + resolved "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz" integrity sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw== dependencies: "@babel/parser" "^7.20.15" @@ -2100,7 +2124,7 @@ klaw@^3.0.0: lilconfig@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: @@ -2110,7 +2134,7 @@ lines-and-columns@^1.1.6: linkify-it@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: uc.micro "^2.0.0" @@ -2120,6 +2144,15 @@ load-tsconfig@^0.2.3: resolved "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz" integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== +local-pkg@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz" + integrity sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg== + dependencies: + mlly "^1.7.4" + pkg-types "^2.0.1" + quansync "^0.2.8" + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" @@ -2144,7 +2177,7 @@ lower-case@^2.0.2: magic-string@^0.30.17: version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -2156,12 +2189,12 @@ main-event@^1.0.1: markdown-it-anchor@^8.6.7: version "8.6.7" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + resolved "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz" integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== markdown-it@^14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== dependencies: argparse "^2.0.1" @@ -2178,7 +2211,7 @@ marked@^4.0.10: mdurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== mime-db@1.52.0: @@ -2212,7 +2245,7 @@ mkdirp@^1.0.4: mlly@^1.7.4: version "1.7.4" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz" integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== dependencies: acorn "^8.14.0" @@ -2222,7 +2255,7 @@ mlly@^1.7.4: ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== ms@^3.0.0-canary.1: @@ -2314,19 +2347,19 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -pathe@^2.0.1: +pathe@^2.0.1, pathe@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pirates@^4.0.1: @@ -2336,16 +2369,25 @@ pirates@^4.0.1: pkg-types@^1.3.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== dependencies: confbox "^0.1.8" mlly "^1.7.4" pathe "^2.0.1" +pkg-types@^2.0.1: + version "2.2.0" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz" + integrity sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ== + dependencies: + confbox "^0.2.2" + exsolve "^1.0.7" + pathe "^2.0.3" + postcss-load-config@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz" integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== dependencies: lilconfig "^3.1.1" @@ -2376,7 +2418,7 @@ proxy-from-env@^1.1.0: punycode.js@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@^2.1.0: @@ -2384,9 +2426,14 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +quansync@^0.2.8: + version "0.2.10" + resolved "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz" + integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== + readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== relateurl@^0.2.7: @@ -2406,9 +2453,14 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve.exports@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + rollup@^4.34.8: version "4.45.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.1.tgz#d0ef72a8d0a9210d832f9c3c5f3b6a2aa4b0ba64" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz" integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== dependencies: "@types/estree" "1.0.8" @@ -2544,7 +2596,7 @@ strnum@^2.1.0: sucrase@^3.35.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -2591,12 +2643,12 @@ timestamp-nano@^1.0.1: tinyexec@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== tinyglobby@^0.2.11: version "0.2.14" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz" integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== dependencies: fdir "^6.4.4" @@ -2626,7 +2678,7 @@ tslib@^2.0.3, tslib@^2.5.0, tslib@^2.6.2: tsup@8.5.0: version "8.5.0" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.5.0.tgz#4b1e25b1a8f4e4f89b764207bf37cfe2d7411d31" + resolved "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz" integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ== dependencies: bundle-require "^5.1.0" @@ -2649,17 +2701,17 @@ tsup@8.5.0: typescript@5.8.3: version "5.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== ufo@^1.5.4: version "1.6.1" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz" integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== uint8-varint@^2.0.1, uint8-varint@^2.0.2: From 7a05ab53e6af39e9851837ac21c4125a99dc2929 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:35:37 -0500 Subject: [PATCH 08/14] Documentation updates on source. --- src/index.js | 309 +++++++++++++++++++++++++++++++------------- test/index.spec.cjs | 2 +- test/index.spec.mjs | 2 +- 3 files changed, 224 insertions(+), 89 deletions(-) diff --git a/src/index.js b/src/index.js index 8588eb0..0bc1186 100644 --- a/src/index.js +++ b/src/index.js @@ -10,11 +10,15 @@ import { ListBucketsCommand, ListObjectsV2Command, PutBucketTaggingCommand, + PutObjectCommand, S3Client, } from "@aws-sdk/client-s3"; import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import { unmarshalIPNSRecord } from "ipns"; +/** + */ + class FilebaseClient { #DEFAULT_RPC_TIMEOUT = 60000; #DEFAULT_RPC_ENDPOINT = "https://rpc.filebase.io"; @@ -26,7 +30,7 @@ class FilebaseClient { #GATEWAY_DEFAULT_TIMEOUT = 60000; #PUBLIC_IPFS_GATEWAY = "https://ipfs.filebase.io"; - #VALID_FORMATS = ["ipns-record", "raw", "car"]; + #VALID_FORMATS = ["ipns-record", "raw", "car", "tar"]; #default_bucket; #default_gateway; @@ -37,20 +41,18 @@ class FilebaseClient { #names_client; #s3_client; - /** - * @typedef {Object} clientOptions - * @property {string} [bucket] The bucket to use for file operations (optional) - */ - /** * @summary Creates a new instance of the constructor. * @param {string} clientKey - The access key ID for authentication. * @param {string} clientSecret - The secret access key for authentication. - * @param {clientOptions} [options] - Options for the client (optional) + * @param {Object} [options] - Options for the client (optional) + * @property {string} options.bucket The bucket to use for file operations (optional) * @tutorial quickstart-bucket * @example * import FilebaseClient from "@filebase/sdk"; - * const client = new FilebaseClient("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD"); + * const client = new FilebaseClient("KEY_FROM_DASHBOARD", "SECRET_FROM_DASHBOARD", { + * bucket: "my-main-bucket" + * }); */ constructor(clientKey, clientSecret, options) { //region S3 Client @@ -163,7 +165,7 @@ class FilebaseClient { * @returns {Promise} - A promise that resolves when the bucket is created. * @example * // Create bucket with name of `create-bucket-example` - * await client.createBucket(`create-bucket-example`); + * const createdBucket = await client.createBucket(`create-bucket-example`); */ async createBucket(name) { const command = new CreateBucketCommand({ @@ -193,7 +195,10 @@ class FilebaseClient { /** * @summary Generates the IPFS Directory/Folder CID for a given bucket * @param {string} name - The name of the bucket to use. - * @returns {Promise} A promise that resolves with the CID of the new directory/folder + * @returns {Promise} A promise that resolves with the CID of the new directory/folder + * @example + * // Generate CID for bucket with name of `bucket-name-to-mfs` + * const generatedCid = await client.generateBucketCid(`bucket-name-to-mfs`); */ async generateBucketCid(name) { const command = new PutBucketTaggingCommand({ @@ -221,6 +226,14 @@ class FilebaseClient { return cid; } + /** + * @summary Gets the IPFS Directory/Folder CID for a given bucket + * @param {string} name - The name of the bucket to use. + * @returns {Promise} A promise that resolves with the CID of the directory + * @example + * // Get CID for bucket with name of `bucket-name-with-mfs` + * const bucketCid = await client.generateBucketCid(`bucket-name-with-mfs`); + */ async getBucketCid(name) { const getCidCommand = new GetBucketTaggingCommand({ Bucket: name, @@ -245,7 +258,7 @@ class FilebaseClient { * @returns {Promise>} - A promise that resolves with an array of objects representing the buckets in the client. * @example * // List all buckets - * await client.listBuckets(); + * const bucketList = await client.listBuckets(); */ async listBuckets() { const command = new ListBucketsCommand({}), @@ -292,6 +305,18 @@ class FilebaseClient { return pins; } + /** + * @summary Copies a file by name. Can also copy files to another bucket. + * @param {string} from - The name of the file to use as the source. + * @param {string} to - The name to use for the destination file + * @param {Object} [options] Options for copying file + * @property {string} options.sourceBucket The bucket to copy the file from. + * @property {string} entries.destinationBucket The bucket to copy the file into. + * @returns {Promise} - A promise that resolves when the file has been copied. + * @example + * // Copy file with name of `copy-file-example` + * const copiedFile = await client.copyFile(`copy-file-example`, `copy-file-example-copy1`); + */ async copyFile(from, to, options) { const copySource = `${ options?.sourceBucket || this.#default_bucket @@ -306,68 +331,99 @@ class FilebaseClient { return true; } - async deleteFile(path, options) { + /** + * @summary Deletes a file by name. + * @param {string} name - The name of the file to delete. + * @param {Object} [options] Options for deleting file + * @property {string} options.bucket The bucket to delete the file from. + * @returns {Promise} - A promise that resolves when the file has been deleted. + * @example + * // Delete file with name of `delete-file-example` + * const deletedFile = await client.deleteFile(`delete-file-example`); + */ + async deleteFile(name, options) { const command = new DeleteObjectCommand({ Bucket: options?.bucket || this.#default_bucket, - Key: path, + Key: name, }); await this.#s3_client.send(command); return true; } - async downloadFile(path, options) { + /** + * @summary Downloads a file by name. + * @param {string} name - The name of the file to download. + * @param {Object} [options] Options for downloading file + * @property {string} options.bucket The bucket to download the file from. + * @returns {Promise} - A promise that resolves with the contents of the file. + * @example + * // Download file with name of `download-file-example` + * const downloadedFile = await client.downloadFile(`download-file-example`); + */ + async downloadFile(name, options) { const command = new GetObjectCommand({ Bucket: options?.bucket || this.#default_bucket, - Key: path, + Key: name, }), response = await this.#s3_client.send(command); return response.Body; } - async generatePresignedUrl(objectKey, expiresInSeconds = 3600, options) { - const command = new GetObjectCommand({ + /** + * @summary Generate presigned URL for uploading a file. + * @param {string} name - The name of the file to upload. + * @param {Object} [options] Options for downloading file + * @property {string} options.bucket The bucket to upload the file into. + * @property {string} options.expectedContentType The content type that the uploaded file should be. + * @property {integer} options.expectedFileSize The number of bytes the file should be on upload. + * @property {integer} options.expirationInSeconds The number of seconds for the URL to be valid. + * @returns {Promise} - A promise that resolves with the presigned URL to use for the upload. + * @example + * // Generate a presigned URL to upload a file with name of `presigned-upload-file-example` + * const presignedUrl = await client.generatePresignedUrl(`presigned-upload-file-example`, { + * expirationInSeconds: 600, + * }); + */ + async generatePresignedUrl(name, options) { + const putObjectOptions = { Bucket: options?.bucket || this.#default_bucket, - Key: objectKey, - }); + Key: name, + }; + if (options?.expectedContentType) { + putObjectOptions["ContentType"] = options?.expectedContentType; + } + if (options?.expectedFileSize) { + putObjectOptions["ContentLength"] = options?.expectedFileSize; + } try { + const command = new PutObjectCommand(putObjectOptions); return await getSignedUrl(this.#s3_client, command, { - expiresIn: expiresInSeconds, // URL valid for 1 hour by default + expiresIn: options?.expirationInSeconds || 3600, // URL valid for 1 hour by default }); } catch (error) { - console.error("Error generating presigned download URL:", error); + console.error(`Error generating presigned upload URL:`, error); throw error; } } - /** - * @typedef {Object} objectOptions - * @property {string} [bucket] - The bucket to pin the IPFS CID into. - */ - - /** - * @typedef {Object} objectHeadResult - * @property {string} cid The CID of the uploaded object - * @property {array} [entries] If a directory then returns an array of the containing objects - * @property {string} entries.cid The CID of the uploaded object - * @property {string} entries.path The path of the object - */ - /** * @summary Gets an objects info and metadata using the S3 API. - * @param {string} path - The key of the object to be inspected. - * @param {objectOptions} [options] - The options for inspecting the object. - * @returns {Promise} + * @param {string} name - The key of the object to be inspected. + * @param {Object} [options] - The options for inspecting the object. + * @property {string} options.bucket - The bucket to pin the IPFS CID into. + * @returns {Promise} */ - async getFileMetadata(path, options) { + async getFileMetadata(name, options) { try { const command = new HeadObjectCommand({ Bucket: options?.bucket || this.#default_bucket, - Key: path, + Key: name, }); - return await this.#s3_client.send(command); + const headOutput = await this.#s3_client.send(command); + return headOutput["Metadata"]; } catch (err) { if (err.name === "NotFound") { return false; @@ -386,19 +442,14 @@ class FilebaseClient { * @property {function} [nextPage] Convenience function to get the next page of files */ - /** - * @typedef {Object} listObjectOptions - * @property {string} [Bucket] The name of the bucket. If not provided, the default bucket will be used. - * @property {string|null} [ContinuationToken=null] Continues listing from this objects name. - * @property {string|null} [Delimiter=null] Character used to group keys - * @property {number} [MaxKeys=1000] The maximum number of objects to retrieve. Defaults to 1000. - */ - /** * Retrieves a list of files from a specified bucket. * * @param {string} prefix - The prefix to filter the files list with. - * @param {listObjectOptions} [options] - The options for listing files. + * @param {Object} [options] - The options for listing files. + * @property {string} options.Bucket The name of the bucket. If not provided, the default bucket will be used. + * @property {string} options.ContinuationToken=null Continues listing from this objects name. + * @property {string} options.Delimiter=null Character used to group keys * @returns {Promise} - A promise that resolves to an array of files. * @example * // List files in bucket with a limit of 1000 @@ -454,7 +505,18 @@ class FilebaseClient { return listResponse; } - async pinFile(path, cid, options) { + /** + * @summary Pins a file by name and CID. + * @param {string} name - The name of the file to pin. + * @param {string} cid - The CID of the file to pin. + * @param {Object} [options] Options for pinning file + * @property {string} options.bucket The bucket to pin the file to. + * @returns {Promise} - A promise that resolves when the file has been queued for pinning. + * @example + * // Pin file with name of `pin-file-example` + * const pinnedFile = await client.pinFile(`pin-file-example`, 'QmbQDovX7wRe9ek7u6QXe9zgCXkTzoUSsTFJEkrYV1HrVR'); + */ + async pinFile(name, cid, options) { await this.#ipfs_client.request({ method: "POST", url: "api/v0/pin/add", @@ -462,7 +524,7 @@ class FilebaseClient { Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, }, params: { - name: path, + name: name, arg: cid, }, validateStatus: function (status) { @@ -472,30 +534,75 @@ class FilebaseClient { return true; } - async uploadDirectory(path, formData, options = {}) { - const uploadedFiles = await this.#uploadFiles(formData, { + /** + * @typedef {Object} pinnedFile + * @property {string} name Name of the pinned file + * @property {string} cid CID of the pinned file + * @property {number} size Size in Bytes of the pinned file + */ + + /** + * @summary Uploads an array of Files as a directory + * @param {string} name - The name of the directory once pinned. + * @param {File[]} input - The array of files to include in the directory. + * @param {Object} [options] Options for uploading directory + * @property {string} options.bucket The bucket to upload the pinned directory into. + * @returns {Promise} - A promise that resolves when the directory has finished uploading. + * @example + * // Pin file with name of `pin-file-example` + * const pinnedFile = await client.pinFile(`pin-file-example`, 'QmbQDovX7wRe9ek7u6QXe9zgCXkTzoUSsTFJEkrYV1HrVR'); + */ + async uploadDirectory(name, input, options = {}) { + const uploadedFiles = await this.#uploadFiles(input, { headers: { Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, }, params: { - "directory-name": path, + "directory-name": name, "wrap-with-directory": "true", }, }); return uploadedFiles[0]; } - async uploadFile(path, content, options = {}) { + /** + * @summary Uploads a single file + * @param {string} name - The name of the file once pinned. + * @param {File} content - The file to upload. + * @param {Object} [options] Options for uploading file + * @property {string} options.bucket The bucket to upload the pinned directory into. + * @property {Object} options.headers The headers to pass to the RPC API. + * @property {Object} options.params The params to pass to the RPC API. + * @returns {Promise} - A promise that resolves when the file has finished uploading. + * @example + * // Upload file with name of `upload-file-example` + * const uploadedFile = await client.uploadFile(`upload-file-example`, new Blob(["Hello Filebase!"])); + */ + async uploadFile(name, content, options = {}) { const uploadFormData = new FormData(); - uploadFormData.append("file", content, path); + uploadFormData.append("file", content, name); const uploadedFiles = await this.uploadFiles(uploadFormData, options); return uploadedFiles[0]; } - async uploadFiles(formData, options) { - const uploadOptions = {}; - return await this.#uploadFiles(formData, uploadOptions); + /** + * @summary Uploads multiple files at once. + * @param {FormData} content - The form to upload. + * @param {Object} [options] Options for uploading file + * @property {string} options.bucket The bucket to upload the pinned directory into. + * @property {Object} options.headers The headers to pass to the RPC API. + * @property {Object} options.params The params to pass to the RPC API. + * @returns {Promise} - A promise that resolves when the file has finished uploading. + * @example + * // Upload files with a form + * const uploadForm = new FormData(); + * uploadForm.append('File', new Blob(['Hello Jack!']), 'jacks/file.txt'); + * uploadForm.append('File', new Blob(['Hello Jill!']), 'jills/file.txt'); + * const uploadedFiles = await client.uploadFiles(uploadForm); + */ + uploadFiles(content, options = {}) { + return this.#uploadFiles(content, options); } //endregion @@ -512,20 +619,16 @@ class FilebaseClient { * @property {date} updated_at Date the name was last updated */ - /** - * @typedef {Object} nameOptions - * @property {boolean} [enabled] Whether the name is enabled or not. - */ - /** * @summary Creates a new IPNS name with the given name as the label and CID. * @param {string} label - The label of the new IPNS name. * @param {string} cid - The CID of the IPNS name. - * @param {nameOptions} [options] - Additional options for the IPNS name. + * @param {Object} [options] - Additional options for the IPNS name. + * @param {boolean} options.enabled - Whether the name is enabled or not. * @returns {Promise} - A Promise that resolves with the response JSON. * @example * // Create IPNS name with label of `create-name-example` and CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` - * await client.createIpnsName(`create-name-example`, `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm`); + * const createdName = await client.createIpnsName(`create-name-example`, `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm`); */ async createIpnsName( label, @@ -578,7 +681,7 @@ class FilebaseClient { * @returns {Promise} - A promise that resolves to the value of a name. * @example * // Get IPNS name with label of `list-name-example` - * await nameManager.get(`list-name-example`); + * const ipnsName = await nameManager.get(`list-name-example`); */ async getIpnsName(label) { try { @@ -600,12 +703,13 @@ class FilebaseClient { * @param {string} label - The label for the IPNS name. * @param {string} cid - The CID (Content Identifier) of the data. * @param {string} privateKey - The existing private key encoded in Base64. - * @param {nameOptions} [options] - Additional options for the IPNS name. + * @param {Object} [options] - Additional options for the IPNS name. + * @param {boolean} options.enabled - Whether the name is enabled or not. * @returns {Promise} - A Promise that resolves to the server response. * @example * // Import IPNS private key with label of `create-name-example`, CID of `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` * // and a private key encoded with base64 - * await client.importIpnsName( + * const createdName = await client.importIpnsName( * `create-name-example`, * `QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm` * `BASE64_ENCODED_PRIVATEKEY` @@ -640,7 +744,7 @@ class FilebaseClient { * @returns {Promise>} - A promise that resolves to an array of names. * @example * // List all IPNS names - * await client.listIpnsNames(); + * const namesList = await client.listIpnsNames(); */ async listIpnsNames() { try { @@ -653,13 +757,30 @@ class FilebaseClient { } } - async resolveIpnsName(value) { + /** + * @summary Resolves an IPNS CID using your selected gateway + * @param {string} value - The IPNS CID to resolve. + * @param {Object} [options] - Optional options for fetching content. + * @param {string} options.endpoint - Gateway to use for downloading data. + * @param {string} options.format - Format for returned data. ["car", "tar", "raw", "ipns-record"] + * @param {number} options.timeout - Timeout for request in milliseconds. + * @param {string} options.token - Token for accessing gateway. + * @returns {Promise} - A promise that resolves to the IPFS CID. + */ + async resolveIpnsName(value, options = {}) { try { - const resolvedIpnsName = await this.#fetchIpnsRecord(value); - const buf = Buffer.from(resolvedIpnsName); - const body = new Uint8Array(buf, 0, buf.byteLength); - const ipnsRecord = unmarshalIPNSRecord(body); - return ipnsRecord.value; + const resolvedIpnsName = await this.#fetchContentFromGateway( + value, + "ipns", + { + ...options, + format: "ipns-record", + }, + ); + return unmarshalIPNSRecord(Buffer.from(resolvedIpnsName)).value.replace( + "/ipfs/", + "", + ); } catch (err) { this.#apiErrorHandler(err); } @@ -669,8 +790,8 @@ class FilebaseClient { * @summary Updates the specified name with the given CID. * @param {string} label - The label of the name to update. * @param {string} cid - The cid to associate with the name. - * @param {nameOptions} options - The options for the set operation. - * + * @param {Object} options - The options for the set operation. + * @param {boolean} options.enabled - Whether the name is enabled or not. * * @returns {Promise} - A Promise that resolves to true if the IPNS name was updated. * @example * // Update name with label of `update-name-example` and set the value of the IPNS name. @@ -725,7 +846,7 @@ class FilebaseClient { * @example * // Create gateway with name of `create-gateway-example` and a custom domain of `cname.mycustomdomain.com`. * // The custom domain must already exist and have a CNAME record pointed at `create-gateway-example.myfilebase.com`. - * await client.createGateway(`create-gateway-example`, { + * const createdGateway = await client.createGateway(`create-gateway-example`, { * domain: `cname.mycustomdomain.com` * }); */ @@ -782,7 +903,7 @@ class FilebaseClient { * @returns {Promise} - A promise that resolves to the value of a gateway. * @example * // Get gateway with name of `gateway-get-example` - * await client.getGateway(`gateway-get-example`); + * const existingGateway = await client.getGateway(`gateway-get-example`); */ async getGateway(name) { try { @@ -804,7 +925,7 @@ class FilebaseClient { * @returns {Promise>} - A promise that resolves to an array of gateways. * @example * // List all gateways - * await client.listGateways(); + * const gatewaysList = await client.listGateways(); */ async listGateways() { try { @@ -891,16 +1012,30 @@ class FilebaseClient { return downloadResponse.data; } - async #fetchIpnsRecord(cid) { - return this.#fetchContentFromGateway(cid, "ipns", { - format: "ipns-record", - }); - } - + /** + * @summary Fetches content by the IPFS CID from your selected gateway. + * @param {string} cid - The CID for the IPFS content to fetch data from. + * @param {Object} [options] - Optional options for fetching content. + * @param {string} options.endpoint - Gateway to use for downloading data. + * @param {string} options.format - Format for returned data. ["car", "tar", "raw", "ipns-record"] + * @param {number} options.timeout - Timeout for request in milliseconds. + * @param {string} options.token - Token for accessing gateway. + * @returns {Promise} + */ async fetchContentByCid(cid, options = {}) { return this.#fetchContentFromGateway(cid, "ipfs", options); } + /** + * @summary Fetches content by the IPNS CID from your selected gateway. + * @param {string} cid - The CID for the IPNS name to fetch data from. + * @param {Object} [options] - Optional options for fetching content. + * @param {string} options.endpoint - Gateway to use for downloading data. + * @param {string} options.format - Format for returned data. ["car", "tar", "raw", "ipns-record"] + * @param {number} options.timeout - Timeout for request in milliseconds. + * @param {string} options.token - Token for accessing gateway. + * @returns {Promise} + */ async fetchContentByIpnsName(cid, options = {}) { return this.#fetchContentFromGateway(cid, "ipns", options); } diff --git a/test/index.spec.cjs b/test/index.spec.cjs index 7e81d19..acdc8cd 100644 --- a/test/index.spec.cjs +++ b/test/index.spec.cjs @@ -791,7 +791,7 @@ test("resolve name", async () => { const testNameValue = await filebaseClient.resolveIpnsName( createdName.network_key, ); - assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); + assert.strictEqual(testNameValue, TEST_CID); } finally { await filebaseClient.deleteIpnsName(testNameLabel); } diff --git a/test/index.spec.mjs b/test/index.spec.mjs index ff181e5..5475f0a 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -791,7 +791,7 @@ test("resolve name", async () => { const testNameValue = await filebaseClient.resolveIpnsName( createdName.network_key, ); - assert.strictEqual(testNameValue, `/ipfs/${TEST_CID}`); + assert.strictEqual(testNameValue, TEST_CID); } finally { await filebaseClient.deleteIpnsName(testNameLabel); } From bcbbf315c6ed316d9a7de22c0c6d48e5d26cbc84 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Thu, 24 Jul 2025 18:55:13 -0500 Subject: [PATCH 09/14] Simplify listFiles method Update tutorials and readme.md --- readme.md | 94 ++++++++++++++------------- src/index.js | 108 +++++++++++++++---------------- test/index.spec.cjs | 2 +- test/index.spec.mjs | 2 +- tutorials/quickstart-bucket.md | 18 ++---- tutorials/quickstart-files.json | 3 + tutorials/quickstart-files.md | 23 +++++++ tutorials/quickstart-gateway.md | 22 +++---- tutorials/quickstart-name.md | 28 ++++---- tutorials/quickstart-object.json | 3 - tutorials/quickstart-object.md | 24 ------- tutorials/quickstart-pin.md | 19 +++--- 12 files changed, 169 insertions(+), 177 deletions(-) create mode 100644 tutorials/quickstart-files.json create mode 100644 tutorials/quickstart-files.md delete mode 100644 tutorials/quickstart-object.json delete mode 100644 tutorials/quickstart-object.md diff --git a/readme.md b/readme.md index 766424e..af60306 100644 --- a/readme.md +++ b/readme.md @@ -1,15 +1,15 @@ -

• Filebase SDK •

+

‥ Filebase SDK ‥

Developer Friendly [ IPFS | IPNS | S3 ]

## About -The Filebase SDK provides a hybrid data management solution, blending S3-compatible cloud storage with IPFS -(InterPlanetary File System) pinning services. It features robust S3 bucket management, object handling for uploads and -downloads, and seamless integration with IPFS and IPNS (InterPlanetary Naming System) for decentralized storage +The Filebase SDK provides a hybrid data management solution, blending S3-compatible cloud storage with IPFS +(InterPlanetary File System) pinning services. It features robust S3 bucket management, object handling for uploads and +downloads, and seamless integration with IPFS and IPNS (InterPlanetary Naming System) for decentralized storage operations. The SDK supports advanced data tasks like compiling files into CAR (Content Addressable aRchive) formats and -ensures secure transactions through strong authentication. Designed for varied applications, the Filebase SDK is ideal -for scenarios demanding the dependability of cloud storage combined with the advantages of decentralized, peer-to-peer -storage, catering to diverse needs such as content distribution, data backup, and archival. Developing InterPlanetary +ensures secure transactions through strong authentication. Designed for varied applications, the Filebase SDK is ideal +for scenarios demanding the dependability of cloud storage combined with the advantages of decentralized, peer-to-peer +storage, catering to diverse needs such as content distribution, data backup, and archival. Developing InterPlanetary Applications has never been easier. ### JS Client @@ -28,68 +28,72 @@ yarn add @filebase/sdk ### Getting started -The snippet below shows how to create a new bucket with `BucketManager`, upload a new object to IPFS -with `ObjectManager`, publish the object to IPNS with `NameManager`, delete the object with `ObjectManager` and finally -delete the bucket with `BucketManager`. +The snippet below shows how to create a new bucket, upload a new file to IPFS with `ObjectManager`, publish the +object to IPNS, delete the object and finally delete the bucket. -To use the library in your project, use npm or yarn to install the [`@filebase/sdk`](https://www.npmjs.com/package/@filebase/sdk) module. Requires node.js 16+. +To use the library in your project, use npm or yarn to install the [ +`@filebase/sdk`](https://www.npmjs.com/package/@filebase/sdk) module. Requires node.js 16+. **node.js** + ````js -// Import Classes -import { - BucketManager, - ObjectManager, - NameManager, - GatewayManager, - PinManager -} from '@filebase/sdk' - -// Initialize BucketManager -const bucketManager = new BucketManager(S3_KEY, S3_SECRET); +// Import example +import {FilebaseClient} from '@filebase/sdk' + // Create bucket +const client = new FilebaseClient(S3_KEY, S3_SECRET); const bucketName = `create-bucket-[random string]`; -await bucketManager.create(bucketName); +await client.createBucket(bucketName); + +// Upload File +const client = new FilebaseClient(S3_KEY, S3_SECRET, { + bucket: bucketName +}); +const fileName = `new-object`; +const uploadedFile = await client.uploadFile(fileName, new Blob(["Hello Filebase!"])); -// Initialize ObjectManager -const objectManager = new ObjectManager(S3_KEY, S3_SECRET, { +// Download File +const client = new FilebaseClient(S3_KEY, S3_SECRET, { + bucket: bucketName +}); +await client.downloadFile("/organized/my-object"); +await client.fetchContentByCid(uploadedFile.cid, { + endpoint: "my-custom-gateway.myfilebase.com", +}); + +// Copy File to a New Bucket +const client = new FilebaseClient(S3_KEY, S3_SECRET, { bucket: bucketName }); -// Upload Object -const objectName = `new-object`; -const uploadedObject = await objectManager.upload(objectName, body); -// Download Object -await uploadedObject.download(); -// Copy Object to a New Bucket const bucketCopyDestinationName = `copy-dest-bucket` -await bucketManager.create(bucketCopyDestinationName); -await objectManager.copy(`new-object`, bucketCopyDestinationName); +await client.createBucket(bucketCopyDestinationName); +await client.copyFile(`my-original-file`, 'my-copied-file', { + destinationBucket: bucketCopyDestinationName +}); -// Initialize NameManager -const nameManager = new NameManager(S3_KEY, S3_SECRET); // Create New IPNS Name with Broadcast Disabled +const client = new FilebaseClient(S3_KEY, S3_SECRET); const ipnsLabel = `myFirstIpnsKey`; -const ipnsName = await nameManager.create(ipnsLabel, uploadedObject.cid, { +const ipnsName = await client.createIpnsName(ipnsLabel, uploadedObject.cid, { enabled: true }); +const downloadedFile = await client.fetchContentByIpnsName(ipnsLabel, { + endpoint: "my-gw.myfilebase.com" +}) -// Initialize GatewayManager -const gatewayManager = new GatewayManager(S3_KEY, S3_SECRET); // Create New Gateway +const client = new FilebaseClient(S3_KEY, S3_SECRET); const gatewayName = "myRandomGatewayName"; -const myGateway = await gatewayManager.create(gatewayName); +const myGateway = await client.createGateway(gatewayName); -// Initialize PinManager -const pinManager = new PinManager(S3_KEY, S3_SECRET, { +// Create New Pin +const client = new FilebaseClient(S3_KEY, S3_SECRET, { bucket: bucketName, gateway: { endpoint: "https://myRandomGatewayName.myfilebase.com" } }); -// Create New Pin with Metadata -const myNewPin = await pinManager.create("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF", { - "application": "my-custom-app-on-filebase" -}); +const myNewPin = await client.pinFile("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF"); ```` Full API reference doc for the JS client are available at https://filebase.github.io/filebase-sdk diff --git a/src/index.js b/src/index.js index 0bc1186..921cb51 100644 --- a/src/index.js +++ b/src/index.js @@ -447,43 +447,39 @@ class FilebaseClient { * * @param {string} prefix - The prefix to filter the files list with. * @param {Object} [options] - The options for listing files. - * @property {string} options.Bucket The name of the bucket. If not provided, the default bucket will be used. - * @property {string} options.ContinuationToken=null Continues listing from this objects name. - * @property {string} options.Delimiter=null Character used to group keys + * @property {string} options.bucket The name of the bucket. If not provided, the default bucket will be used. + * @property {string} options.nextToken Continues listing from this objects name. + * @property {number} options.limit=1000 Continues listing from this objects name. * @returns {Promise} - A promise that resolves to an array of files. * @example * // List files in bucket with a limit of 1000 - * await filebaseClient.listFiles('my-favorites-folder', { - * MaxKeys: 1000 + * await client.listFiles('my-favorites-folder', { + * limit: 1000 * }); */ async listFiles( prefix = undefined, options = { - Bucket: this.#default_bucket, - ContinuationToken: null, - Delimiter: null, - MaxKeys: 1000, + bucket: this.#default_bucket, + nextToken: null, + limit: 1000, }, ) { const listOptions = { - ...options, - Prefix: prefix, + Bucket: options?.bucket || this.#default_bucket, + Prefix: prefix || "", + Delimiter: "/", + MaxKeys: listOptions?.limit || 1000, }; - if (listOptions?.MaxKeys && listOptions.MaxKeys > 100000) { - throw new Error(`MaxKeys Maximum value is 100000`); + if (listOptions?.limit && listOptions.limit > 100000) { + throw new Error(`Maximum limit is 100000`); } - const bucket = listOptions?.Bucket || this.#default_bucket, - limit = listOptions?.MaxKeys || 1000, - commandOptions = { - Bucket: bucket, - MaxKeys: limit, - }, - command = new ListObjectsV2Command({ - ...listOptions, - ...commandOptions, - }); - + if (options?.nextToken) { + listOptions.ContinuationToken = options?.nextToken; + } + const command = new ListObjectsV2Command({ + ...listOptions, + }); const { Contents, IsTruncated, NextContinuationToken } = await this.#s3_client.send(command); const listResponse = { @@ -498,42 +494,13 @@ class FilebaseClient { }; if (IsTruncated) { listResponse["nextPage"] = this.listFiles(prefix, { - ...options, - ContinuationToken: NextContinuationToken, + ...listOptions, + continuationToken: NextContinuationToken, }); } return listResponse; } - /** - * @summary Pins a file by name and CID. - * @param {string} name - The name of the file to pin. - * @param {string} cid - The CID of the file to pin. - * @param {Object} [options] Options for pinning file - * @property {string} options.bucket The bucket to pin the file to. - * @returns {Promise} - A promise that resolves when the file has been queued for pinning. - * @example - * // Pin file with name of `pin-file-example` - * const pinnedFile = await client.pinFile(`pin-file-example`, 'QmbQDovX7wRe9ek7u6QXe9zgCXkTzoUSsTFJEkrYV1HrVR'); - */ - async pinFile(name, cid, options) { - await this.#ipfs_client.request({ - method: "POST", - url: "api/v0/pin/add", - headers: { - Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, - }, - params: { - name: name, - arg: cid, - }, - validateStatus: function (status) { - return status === 200; - }, - }); - return true; - } - /** * @typedef {Object} pinnedFile * @property {string} name Name of the pinned file @@ -979,6 +946,37 @@ class FilebaseClient { } //endregion + //region Pinning Methods + /** + * @summary Pins a file by name and CID. + * @param {string} name - The name of the file to pin. + * @param {string} cid - The CID of the file to pin. + * @param {Object} [options] Options for pinning file + * @property {string} options.bucket The bucket to pin the file to. + * @returns {Promise} - A promise that resolves when the file has been queued for pinning. + * @example + * // Pin file with name of `pin-file-example` + * const pinnedFile = await client.pinFile(`pin-file-example`, 'QmbQDovX7wRe9ek7u6QXe9zgCXkTzoUSsTFJEkrYV1HrVR'); + */ + async pinFile(name, cid, options) { + await this.#ipfs_client.request({ + method: "POST", + url: "api/v0/pin/add", + headers: { + Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, + }, + params: { + name: name, + arg: cid, + }, + validateStatus: function (status) { + return status === 200; + }, + }); + return true; + } + //endregion + //region Content Fetch Methods async #fetchContentFromGateway(cid, resolver, options) { const selectedEndpoint = options?.endpoint || this.#default_gateway; diff --git a/test/index.spec.cjs b/test/index.spec.cjs index acdc8cd..4144ea4 100644 --- a/test/index.spec.cjs +++ b/test/index.spec.cjs @@ -511,7 +511,7 @@ test("list objects", async () => { }); const objectList = await filebaseClient.listFiles(`list-object-test-`, { - MaxKeys: 50, + limit: 50, }); assert.equal(objectList.entries.length, 26); diff --git a/test/index.spec.mjs b/test/index.spec.mjs index 5475f0a..d5db2a4 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -511,7 +511,7 @@ test("list objects", async () => { }); const objectList = await filebaseClient.listFiles(`list-object-test-`, { - MaxKeys: 50, + limit: 50, }); assert.equal(objectList.entries.length, 26); diff --git a/tutorials/quickstart-bucket.md b/tutorials/quickstart-bucket.md index 1d8a1a3..8890ba6 100644 --- a/tutorials/quickstart-bucket.md +++ b/tutorials/quickstart-bucket.md @@ -1,21 +1,17 @@ **node.js** ````js -// Import Classes -import {BucketManager} from '@filebase/sdk'; +// Import Client +import { FilebaseClient } from '@filebase/sdk'; -// Initialize BucketManager -const bucketManager = new BucketManager(S3_KEY, S3_SECRET); +// Initialize FilebaseClient +const client = new FilebaseClient(S3_KEY, S3_SECRET); // Create bucket const bucketName = `create-bucket-[random string]`; -await bucketManager.create(bucketName); +await client.createBucket(bucketName); // List buckets -const bucketsList = await bucketManager.list(); - -// Toggle bucket privacy off -await bucketManager.setPrivacy(bucketName, false); -console.dir(bucketsList); +const bucketsList = await client.listBuckets(); // Delete Bucket -await bucketManager.delete(bucketName); \ No newline at end of file +await client.deleteBucket(bucketName); \ No newline at end of file diff --git a/tutorials/quickstart-files.json b/tutorials/quickstart-files.json new file mode 100644 index 0000000..bfe2060 --- /dev/null +++ b/tutorials/quickstart-files.json @@ -0,0 +1,3 @@ +{ + "title": "Files" +} \ No newline at end of file diff --git a/tutorials/quickstart-files.md b/tutorials/quickstart-files.md new file mode 100644 index 0000000..083d5ab --- /dev/null +++ b/tutorials/quickstart-files.md @@ -0,0 +1,23 @@ +**node.js** +````js +// Import Client +import { FilebaseClient } from '@filebase/sdk'; + +// Initialize FilebaseClient +const bucketName = `create-file-[random string]`; +const client = new FilebaseClient(S3_KEY, S3_SECRET, { + bucket: bucketName +}); + +// Upload File +const fileName = `new-file`; +const uploadedFile = await client.uploadFile(fileName, new Blob["Hello Filebase!"]); + +// Confirm File Uploaded +const filesList = await client.listFiles(key, { + limit: 1, +}); +console.dir(filesList); + +// Delete File +await client.deleteFile(fileName); \ No newline at end of file diff --git a/tutorials/quickstart-gateway.md b/tutorials/quickstart-gateway.md index 85f2778..33f091c 100644 --- a/tutorials/quickstart-gateway.md +++ b/tutorials/quickstart-gateway.md @@ -1,32 +1,28 @@ **node.js** ````js -// Import Classes -import {GatewayManager} from '@filebase/sdk'; +// Import Client +import { FilebaseClient } from '@filebase/sdk'; -// Initialize GatewayManager -const gatewayManager = new GatewayManager(S3_KEY, S3_SECRET); +// Initialize FilebaseClient +const client = new FilebaseClient(S3_KEY, S3_SECRET); // Create New Gateway with a custom domain of `cname.mycustomdomain.com`. // The custom domain must already exist and have a CNAME record pointed at `myRandomGatewayName.myfilebase.com`. const gatewayName = "myRandomGatewayName"; -const myGateway = await gatewayManager.create(gatewayName); -await gatewayManager.create(gatewayname, { +const myGateway = await client.createGateway(gatewayname, { domain: `cname.mycustomdomain.com` }); // Get Gateway Setup -const gatewayConfig = await gatewayManager.get(gatewayName); +const gatewayConfig = await client.getGateway(gatewayName); // List IPFS Gateways -const myGateways = await gatewayManager.list(); +const myGateways = await client.listGateways(); // Update Gateway -const myUpdatedGateway = await gatewayManager.update(gatewayName, { +const myUpdatedGateway = await client.updateGateway(gatewayName, { enabled: false }); -// Toggle Gateway State -await gatewayManager.toggle(gatewayName, true) - // Delete Gateway -await gatewayManager.delete(gatewayName); \ No newline at end of file +await client.deleteGateway(gatewayName); \ No newline at end of file diff --git a/tutorials/quickstart-name.md b/tutorials/quickstart-name.md index 94c003e..574940b 100644 --- a/tutorials/quickstart-name.md +++ b/tutorials/quickstart-name.md @@ -1,36 +1,36 @@ **node.js** ````js -// Import Classes -import {NameManager} from '@filebase/sdk'; +// Import Client +import { FilebaseClient } from '@filebase/sdk'; -// Initialize NameManager -const nameManager = new NameManager(S3_KEY, S3_SECRET); +// Initialize FilebaseClient +const client = new FilebaseClient(S3_KEY, S3_SECRET); // Create New IPNS Name with Broadcast Disabled const ipnsCid = "QmZqkuqX1qTspb1GgmnzyRFetf1uMyA3CemvvgPZD39sPo"; -const ipnsName = await nameManager.create(`myFirstIpnsKey`, ipnsCid, { +const ipnsName = await client.createIpnsName(`myFirstIpnsKey`, ipnsCid, { enabled: true }); // Update IPNS Value and Optionally Enable the Broadcast const ipnsLabel = `myFirstIpnsKey`; -await nameManager.set(ipnsLabel, ipnsCid, { - enabled: true, +await client.updateIpnsName(ipnsLabel, ipnsCid, { + enabled: true }); -// Enable IPNS Broadcast without updating the IPNS Record -await nameManager.toggle(ipnsLabel, true); - // List IPNS Names -const myIpnsNames = await nameManager.list(); +const myIpnsNames = await client.listIpnsNames(); // List Specific IPNS Name -const myIpnsName = await nameManager.list(ipnsLabel); +const myIpnsName = await client.getIpnsName(ipnsLabel); // Import IPNS Name -const myImportedIpnsName = await nameManager.import(ipnsLabel, ipnsCid, Base64EncodedPrivateKey, { +const myImportedIpnsName = await client.importIpnsName(ipnsLabel, ipnsCid, Base64EncodedPrivateKey, { enabled: false, }); +// Resolve IPNS CID +const resolvedCid = await client.resolveIpnsName(ipnsCid); + // Delete Name -await nameManager.delete(ipnsLabel); \ No newline at end of file +await client.deleteIpnsName(ipnsLabel); \ No newline at end of file diff --git a/tutorials/quickstart-object.json b/tutorials/quickstart-object.json deleted file mode 100644 index 7088f34..0000000 --- a/tutorials/quickstart-object.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "title": "Objects" -} \ No newline at end of file diff --git a/tutorials/quickstart-object.md b/tutorials/quickstart-object.md deleted file mode 100644 index 559f3be..0000000 --- a/tutorials/quickstart-object.md +++ /dev/null @@ -1,24 +0,0 @@ -**node.js** -````js -// Import Classes -import {ObjectManager} from '@filebase/sdk'; - -// Initialize ObjectManager -const bucketName = `create-object-[random string]`; -const objectManager = new ObjectManager(S3_KEY, S3_SECRET, { - bucket: bucketName -}); - -// Upload Object -const objectName = `new-object`; -const uploadedObject = await objectManager.upload(objectName, body); - -// Confirm Object Uploaded -const objectsList = await objectManager.list({ - Prefix: key, - MaxKeys: 1, -}); -console.dir(objectsList) - -// Delete Object -await objectManager.delete(objectName); \ No newline at end of file diff --git a/tutorials/quickstart-pin.md b/tutorials/quickstart-pin.md index 427f1bc..d923dc9 100644 --- a/tutorials/quickstart-pin.md +++ b/tutorials/quickstart-pin.md @@ -1,16 +1,15 @@ **node.js** ````js -// Import Classes -import {PinManager} from '@filebase/sdk'; +// Import Client +import { FilebaseClient } from '@filebase/sdk'; -// Initialize PinManager -const pinManager = new PinManager(S3_KEY, S3_SECRET, { +// Initialize FilebaseClient +const client = new FilebaseClient(S3_KEY, S3_SECRET, { bucket: bucketName, - gateway: { - endpoint: "https://myRandomGatewayName.myfilebase.com" + endpoints: { + gateway: "https://myRandomGatewayName.myfilebase.com" } }); -// Create New Pin with Metadata -const myNewPin = await pinManager.create("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF", { - "application": "my-custom-app-on-filebase" -}); \ No newline at end of file + +// Create New Pin +const myNewPin = await client.pinFile("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF"); \ No newline at end of file From a54d671a93d81bc1502e5f45405a6dc8e33eb442 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:39:20 -0500 Subject: [PATCH 10/14] Make gateway top level option --- src/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 921cb51..9f11155 100644 --- a/src/index.js +++ b/src/index.js @@ -47,6 +47,8 @@ class FilebaseClient { * @param {string} clientSecret - The secret access key for authentication. * @param {Object} [options] - Options for the client (optional) * @property {string} options.bucket The bucket to use for file operations (optional) + * @property {string} options.gateway The gateway to use for file retrievals (optional) + * @property {string} options.timeout The amount of time to wait for responses (optional) * @tutorial quickstart-bucket * @example * import FilebaseClient from "@filebase/sdk"; @@ -117,8 +119,7 @@ class FilebaseClient { //endregion //region IPFS Gateway Client - this.#default_gateway = - options?.endpoints.gateway || this.#PUBLIC_IPFS_GATEWAY; + this.#default_gateway = options?.gateway || this.#PUBLIC_IPFS_GATEWAY; //endregion } From 0a49c7e8c6639dbee7eaf0b55c2ae92071ab2676 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:47:35 -0500 Subject: [PATCH 11/14] Simplify readme.md --- readme.md | 82 +++++++++++++++++++------------------------------------ 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/readme.md b/readme.md index af60306..d4137cf 100644 --- a/readme.md +++ b/readme.md @@ -1,38 +1,29 @@ -

‥ Filebase SDK ‥

-

Developer Friendly [ IPFS | IPNS | S3 ]

+# 🗂️ Filebase SDK -## About - -The Filebase SDK provides a hybrid data management solution, blending S3-compatible cloud storage with IPFS -(InterPlanetary File System) pinning services. It features robust S3 bucket management, object handling for uploads and -downloads, and seamless integration with IPFS and IPNS (InterPlanetary Naming System) for decentralized storage -operations. The SDK supports advanced data tasks like compiling files into CAR (Content Addressable aRchive) formats and -ensures secure transactions through strong authentication. Designed for varied applications, the Filebase SDK is ideal -for scenarios demanding the dependability of cloud storage combined with the advantages of decentralized, peer-to-peer -storage, catering to diverse needs such as content distribution, data backup, and archival. Developing InterPlanetary -Applications has never been easier. +[![npm version](https://badge.fury.io/js/@filebase%2Fsdk.svg)](https://badge.fury.io/js/@filebase%2Fsdk) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -### JS Client +--- +## About -Install the package using npm +The Filebase SDK for JavaScript offers a straightforward way to add decentralized storage to your applications. It lets your team easily work with IPFS and IPNS, handling the tricky parts for you. -```shell -npm install @filebase/sdk -``` +Here's what you can do: -or yarn: +* Manage Storage: Easily create and control your storage spaces and gateways. +* Handle IPFS Files: Upload, download, and "pin" files to the IPFS network with ease. +* Control IPNS Names: Set up and find IPNS names to keep your content links consistent. +* Move Data: Quickly copy files between different storage spots. -```shell -yarn add @filebase/sdk -``` +Just install it with `npm install @filebase/sdk`. This SDK helps your team quickly build solutions using the power of decentralized data. Check out the full guide for all the details! ### Getting started -The snippet below shows how to create a new bucket, upload a new file to IPFS with `ObjectManager`, publish the -object to IPNS, delete the object and finally delete the bucket. +The snippet below shows how to create a new bucket, create a new gateway, upload a file to IPFS, publish the +file to IPNS. -To use the library in your project, use npm or yarn to install the [ -`@filebase/sdk`](https://www.npmjs.com/package/@filebase/sdk) module. Requires node.js 16+. +To use the library in your project, use npm to install the [ +`@filebase/sdk`](https://www.npmjs.com/package/@filebase/sdk) module. **node.js** @@ -41,30 +32,32 @@ To use the library in your project, use npm or yarn to install the [ import {FilebaseClient} from '@filebase/sdk' // Create bucket -const client = new FilebaseClient(S3_KEY, S3_SECRET); +const client = new FilebaseClient(clientKey, clientSecret); const bucketName = `create-bucket-[random string]`; await client.createBucket(bucketName); +// Create New Gateway +const gatewayName = "myRandomGatewayName"; +const myGateway = await client.createGateway(gatewayName); + // Upload File -const client = new FilebaseClient(S3_KEY, S3_SECRET, { - bucket: bucketName +const client = new FilebaseClient(clientKey, clientSecret, { + bucket: bucketName, + gateway: "https://myRandomGatewayName.myfilebase.com" }); const fileName = `new-object`; const uploadedFile = await client.uploadFile(fileName, new Blob(["Hello Filebase!"])); +// Pin File +const myNewPin = await client.pinFile("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF"); + // Download File -const client = new FilebaseClient(S3_KEY, S3_SECRET, { - bucket: bucketName -}); await client.downloadFile("/organized/my-object"); await client.fetchContentByCid(uploadedFile.cid, { endpoint: "my-custom-gateway.myfilebase.com", }); // Copy File to a New Bucket -const client = new FilebaseClient(S3_KEY, S3_SECRET, { - bucket: bucketName -}); const bucketCopyDestinationName = `copy-dest-bucket` await client.createBucket(bucketCopyDestinationName); await client.copyFile(`my-original-file`, 'my-copied-file', { @@ -72,7 +65,6 @@ await client.copyFile(`my-original-file`, 'my-copied-file', { }); // Create New IPNS Name with Broadcast Disabled -const client = new FilebaseClient(S3_KEY, S3_SECRET); const ipnsLabel = `myFirstIpnsKey`; const ipnsName = await client.createIpnsName(ipnsLabel, uploadedObject.cid, { enabled: true @@ -80,24 +72,6 @@ const ipnsName = await client.createIpnsName(ipnsLabel, uploadedObject.cid, { const downloadedFile = await client.fetchContentByIpnsName(ipnsLabel, { endpoint: "my-gw.myfilebase.com" }) - -// Create New Gateway -const client = new FilebaseClient(S3_KEY, S3_SECRET); -const gatewayName = "myRandomGatewayName"; -const myGateway = await client.createGateway(gatewayName); - -// Create New Pin -const client = new FilebaseClient(S3_KEY, S3_SECRET, { - bucket: bucketName, - gateway: { - endpoint: "https://myRandomGatewayName.myfilebase.com" - } -}); -const myNewPin = await client.pinFile("my-pin", "QmTJkc7crTuPG7xRmCQSz1yioBpCW3juFBtJPXhQfdCqGF"); ```` -Full API reference doc for the JS client are available at https://filebase.github.io/filebase-sdk - -### Testing - -Test are found in the `test` directory and are built to be run with the Node.js v20+ test runner. \ No newline at end of file +Full API reference doc for the JS client are available at https://filebase.github.io/filebase-sdk \ No newline at end of file From 8e17e1dc298ef4662e6cb627e77b2885917b1541 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Tue, 5 Aug 2025 09:39:07 -0500 Subject: [PATCH 12/14] Add CID version support --- src/index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/index.js b/src/index.js index 9f11155..6f41279 100644 --- a/src/index.js +++ b/src/index.js @@ -279,6 +279,9 @@ class FilebaseClient { `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; options.params = options.params || {}; options.params["preserve-filenames"] = "true"; + options.params["cid-version"] = options.params.cidVersion + ? Number(options.params.cidVersion) + : 0; const downloadResponse = await this.#ipfs_client.request({ method: "POST", @@ -514,6 +517,7 @@ class FilebaseClient { * @param {string} name - The name of the directory once pinned. * @param {File[]} input - The array of files to include in the directory. * @param {Object} [options] Options for uploading directory + * @property {number} options.cidVersion The version of CID to use for the files hash. * @property {string} options.bucket The bucket to upload the pinned directory into. * @returns {Promise} - A promise that resolves when the directory has finished uploading. * @example @@ -526,6 +530,7 @@ class FilebaseClient { Authorization: `Bearer ${this.#getIpfsCredentials(options?.bucket)}`, }, params: { + "cid-version": options?.cidVersion || 0, "directory-name": name, "wrap-with-directory": "true", }, @@ -538,6 +543,7 @@ class FilebaseClient { * @param {string} name - The name of the file once pinned. * @param {File} content - The file to upload. * @param {Object} [options] Options for uploading file + * @property {number} options.cidVersion The version of CID to use for the files hash. * @property {string} options.bucket The bucket to upload the pinned directory into. * @property {Object} options.headers The headers to pass to the RPC API. * @property {Object} options.params The params to pass to the RPC API. @@ -558,6 +564,7 @@ class FilebaseClient { * @summary Uploads multiple files at once. * @param {FormData} content - The form to upload. * @param {Object} [options] Options for uploading file + * @property {number} options.cidVersion The version of CID to use for the files hash. * @property {string} options.bucket The bucket to upload the pinned directory into. * @property {Object} options.headers The headers to pass to the RPC API. * @property {Object} options.params The params to pass to the RPC API. From cbda3515cc2a9a6a0fbdd90dab6d064ceb2eb263 Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:56:38 -0500 Subject: [PATCH 13/14] Use `to-files` from Kubo RPC API for setting file locations --- src/index.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 6f41279..f4fa077 100644 --- a/src/index.js +++ b/src/index.js @@ -278,7 +278,7 @@ class FilebaseClient { options.headers["Authorization"] = `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; options.params = options.params || {}; - options.params["preserve-filenames"] = "true"; + options.params["to-files"] = options.params.toFiles || ""; options.params["cid-version"] = options.params.cidVersion ? Number(options.params.cidVersion) : 0; @@ -531,7 +531,7 @@ class FilebaseClient { }, params: { "cid-version": options?.cidVersion || 0, - "directory-name": name, + "to-files": name, "wrap-with-directory": "true", }, }); @@ -554,7 +554,8 @@ class FilebaseClient { */ async uploadFile(name, content, options = {}) { const uploadFormData = new FormData(); - uploadFormData.append("file", content, name); + uploadFormData.append("file", content); + options["to-files"] = name; const uploadedFiles = await this.uploadFiles(uploadFormData, options); return uploadedFiles[0]; @@ -577,7 +578,10 @@ class FilebaseClient { * const uploadedFiles = await client.uploadFiles(uploadForm); */ uploadFiles(content, options = {}) { - return this.#uploadFiles(content, options); + return this.#uploadFiles(content, { + ...options, + "to-files": options?.prefix || "", + }); } //endregion From a14d677d2e2b046171591017f73dde3f7acb8a4e Mon Sep 17 00:00:00 2001 From: jtsmedley <38006759+jtsmedley@users.noreply.github.com> Date: Thu, 7 Aug 2025 12:59:15 -0500 Subject: [PATCH 14/14] Revert to-files changes Add upload files test --- src/index.js | 29 ++++++++++--------------- test/index.spec.cjs | 52 +++++++++++++++++++++++++++++++++++++++++++++ test/index.spec.mjs | 52 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 18 deletions(-) diff --git a/src/index.js b/src/index.js index f4fa077..c704c0b 100644 --- a/src/index.js +++ b/src/index.js @@ -271,23 +271,20 @@ class FilebaseClient { //region File Methods async #uploadFiles(formData, options) { - options.headers = options.headers || {}; - options.headers = { - ...options.headers, - }; - options.headers["Authorization"] = + const uploadHeaders = options.headers || {}; + uploadHeaders["Authorization"] = `Bearer ${this.#getIpfsCredentials(options?.bucket)}`; - options.params = options.params || {}; - options.params["to-files"] = options.params.toFiles || ""; - options.params["cid-version"] = options.params.cidVersion - ? Number(options.params.cidVersion) + const uploadParams = options.params || {}; + uploadParams["preserve-filenames"] = "true"; + uploadParams["cid-version"] = uploadParams.cidVersion + ? Number(uploadParams.cidVersion) : 0; const downloadResponse = await this.#ipfs_client.request({ method: "POST", url: "api/v0/add", - headers: options.headers, - params: options.params, + headers: uploadHeaders, + params: uploadParams, data: formData, validateStatus: function (status) { return status === 200; @@ -531,7 +528,7 @@ class FilebaseClient { }, params: { "cid-version": options?.cidVersion || 0, - "to-files": name, + "directory-name": name, "wrap-with-directory": "true", }, }); @@ -554,8 +551,7 @@ class FilebaseClient { */ async uploadFile(name, content, options = {}) { const uploadFormData = new FormData(); - uploadFormData.append("file", content); - options["to-files"] = name; + uploadFormData.append("file", content, name); const uploadedFiles = await this.uploadFiles(uploadFormData, options); return uploadedFiles[0]; @@ -578,10 +574,7 @@ class FilebaseClient { * const uploadedFiles = await client.uploadFiles(uploadForm); */ uploadFiles(content, options = {}) { - return this.#uploadFiles(content, { - ...options, - "to-files": options?.prefix || "", - }); + return this.#uploadFiles(content, options); } //endregion diff --git a/test/index.spec.cjs b/test/index.spec.cjs index 4144ea4..2428a27 100644 --- a/test/index.spec.cjs +++ b/test/index.spec.cjs @@ -236,6 +236,23 @@ async function uploadObjects(bucket, key, body) { return typeof uploadedObject !== "undefined" && uploadedObject !== false; } +async function uploadFiles(bucket, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Upload Object + await filebaseClient.uploadFiles(body); + + return true; +} + async function deleteObject(bucket, key) { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { @@ -326,6 +343,41 @@ test("upload object", async () => { } }); +test("upload objects", async () => { + // Create Bucket `create-objects-test-pass + const uploadTestBucket = `${TEST_PREFIX}-create-objects-test-pass`; + await createBucket(uploadTestBucket); + + try { + // Upload object `create-object-test` + const objectPrefix = `create-objects-test/`; + const objectsForm = new FormData(); + objectsForm.append( + "file", + new Blob(["upload object 1"]), + `${objectPrefix}testObjects/1.txt`, + ); + objectsForm.append( + "file", + new Blob(["upload object 2"]), + `${objectPrefix}testObjects/2.txt`, + ); + objectsForm.append( + "file", + new Blob(["upload object 3"]), + `${objectPrefix}testObjects/3.txt`, + ); + const uploaded = await uploadFiles(uploadTestBucket, objectsForm); + + assert.notEqual(uploaded, false); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/1.txt`); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/2.txt`); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/3.txt`); + } finally { + await deleteBucket(uploadTestBucket); + } +}); + test("upload directory", async () => { // Create Bucket `create-object-test-pass const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`; diff --git a/test/index.spec.mjs b/test/index.spec.mjs index d5db2a4..a34290f 100644 --- a/test/index.spec.mjs +++ b/test/index.spec.mjs @@ -236,6 +236,23 @@ async function uploadObjects(bucket, key, body) { return typeof uploadedObject !== "undefined" && uploadedObject !== false; } +async function uploadFiles(bucket, body) { + // Initialize FilebaseClient + const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { + bucket, + endpoints: { + s3: TEST_S3_ENDPOINT, + rpc: TEST_RPC_ENDPOINT, + platform: TEST_PLATFORM_ENDPOINT, + }, + }); + + // Upload Object + await filebaseClient.uploadFiles(body); + + return true; +} + async function deleteObject(bucket, key) { // Initialize FilebaseClient const filebaseClient = new FilebaseClient(CLIENT_KEY, CLIENT_SECRET, { @@ -326,6 +343,41 @@ test("upload object", async () => { } }); +test("upload objects", async () => { + // Create Bucket `create-objects-test-pass + const uploadTestBucket = `${TEST_PREFIX}-create-objects-test-pass`; + await createBucket(uploadTestBucket); + + try { + // Upload object `create-object-test` + const objectPrefix = `create-objects-test/`; + const objectsForm = new FormData(); + objectsForm.append( + "file", + new Blob(["upload object 1"]), + `${objectPrefix}testObjects/1.txt`, + ); + objectsForm.append( + "file", + new Blob(["upload object 2"]), + `${objectPrefix}testObjects/2.txt`, + ); + objectsForm.append( + "file", + new Blob(["upload object 3"]), + `${objectPrefix}testObjects/3.txt`, + ); + const uploaded = await uploadFiles(uploadTestBucket, objectsForm); + + assert.notEqual(uploaded, false); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/1.txt`); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/2.txt`); + await deleteObject(uploadTestBucket, `${objectPrefix}testObjects/3.txt`); + } finally { + await deleteBucket(uploadTestBucket); + } +}); + test("upload directory", async () => { // Create Bucket `create-object-test-pass const uploadDirectoryTestBucket = `${TEST_PREFIX}-create-directory-test-pass`;