diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index e33833f..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - env: { - browser: true, - commonjs: true, - es2021: true, - node: true, - }, - extends: [ - 'airbnb-base', - 'plugin:jest/recommended', - 'plugin:jsdoc/recommended', - ], - overrides: [], - parserOptions: { - ecmaVersion: 'latest', - project: './jsconfig.json', - }, - plugins: ['jest', 'jsdoc'], - rules: { - camelcase: 'off', - 'comma-dangle': 'off', - 'generator-star-spacing': 'off', - 'max-len': 'off', - 'operator-linebreak': 'off', - 'jsdoc/require-param-description': 'off', - 'jsdoc/tag-lines': ['error', 'any', { startLines: 1 }], - }, -}; diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..699ed73 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index f89ed5f..3d9e69c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,10 @@ { - "editor.formatOnSave": true + "editor.formatOnSave": true, + "biome.requireConfiguration": true, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + } } diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..63919df --- /dev/null +++ b/biome.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.0.0/schema.json", + "formatter": { + "indentStyle": "space", + "indentWidth": 2 + }, + "javascript": { + "formatter": { + "trailingComma": "es5" + } + }, + "linter": { + "enabled": true, + "rules": { + "a11y": { + "useAltText": "off", + "useMediaCaption": "off", + "noSvgWithoutTitle": "off" + }, + "performance": { + "noAccumulatingSpread": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noExplicitAny": "off" + }, + "complexity": { + "useOptionalChain": "off" + } + } + } +} diff --git a/index.d.ts b/index.d.ts index 1218cf6..3b9d80c 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,7 +1,7 @@ -declare module 'replicate' { - type Status = 'starting' | 'processing' | 'succeeded' | 'failed' | 'canceled'; - type Visibility = 'public' | 'private'; - type WebhookEventType = 'start' | 'output' | 'logs' | 'completed'; +declare module "replicate" { + type Status = "starting" | "processing" | "succeeded" | "failed" | "canceled"; + type Visibility = "public" | "private"; + type WebhookEventType = "start" | "output" | "logs" | "completed"; export interface ApiError extends Error { request: Request; @@ -17,7 +17,7 @@ declare module 'replicate' { export interface Hardware { sku: string; - name: string + name: string; } export interface Model { @@ -25,7 +25,7 @@ declare module 'replicate' { owner: string; name: string; description?: string; - visibility: 'public' | 'private'; + visibility: "public" | "private"; github_url?: string; paper_url?: string; license_url?: string; @@ -49,7 +49,7 @@ declare module 'replicate' { version: string; input: object; output?: any; - source: 'api' | 'web'; + source: "api" | "web"; error?: any; logs?: string; metrics?: { @@ -69,7 +69,7 @@ declare module 'replicate' { export type Training = Prediction; - interface Page { + export interface Page { previous?: string; next?: string; results: T[]; @@ -80,13 +80,16 @@ declare module 'replicate' { auth?: string; userAgent?: string; baseUrl?: string; - fetch?: Function; + fetch?: ( + input: Request | string, + init?: RequestInit + ) => Promise; }); auth: string; userAgent?: string; baseUrl?: string; - fetch: Function; + fetch: (input: Request | string, init?: RequestInit) => Promise; run( identifier: `${string}/${string}` | `${string}/${string}:${string}`, @@ -100,14 +103,17 @@ declare module 'replicate' { progress?: (prediction: Prediction) => void ): Promise; - request(route: string | URL, options: { - method?: string; - headers?: object | Headers; - params?: object; - data?: object; - }): Promise; + request( + route: string | URL, + options: { + method?: string; + headers?: object | Headers; + params?: object; + data?: object; + } + ): Promise; - paginate(endpoint: () => Promise>): AsyncGenerator<[ T ]>; + paginate(endpoint: () => Promise>): AsyncGenerator<[T]>; wait( prediction: Prediction, @@ -138,8 +144,8 @@ declare module 'replicate' { }; hardware: { - list(): Promise - } + list(): Promise; + }; models: { get(model_owner: string, model_name: string): Promise; @@ -155,7 +161,8 @@ declare module 'replicate' { paper_url?: string; license_url?: string; cover_image_url?: string; - }): Promise; + } + ): Promise; versions: { list(model_owner: string, model_name: string): Promise; get( diff --git a/index.js b/index.js index 8736bb8..b908226 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,15 @@ -const ApiError = require('./lib/error'); -const ModelVersionIdentifier = require('./lib/identifier'); -const { withAutomaticRetries } = require('./lib/util'); +const ApiError = require("./lib/error"); +const ModelVersionIdentifier = require("./lib/identifier"); +const { withAutomaticRetries } = require("./lib/util"); -const collections = require('./lib/collections'); -const deployments = require('./lib/deployments'); -const hardware = require('./lib/hardware'); -const models = require('./lib/models'); -const predictions = require('./lib/predictions'); -const trainings = require('./lib/trainings'); +const collections = require("./lib/collections"); +const deployments = require("./lib/deployments"); +const hardware = require("./lib/hardware"); +const models = require("./lib/models"); +const predictions = require("./lib/predictions"); +const trainings = require("./lib/trainings"); -const packageJSON = require('./package.json'); +const packageJSON = require("./package.json"); /** * Replicate API client library @@ -43,7 +43,7 @@ class Replicate { this.auth = options.auth || process.env.REPLICATE_API_TOKEN; this.userAgent = options.userAgent || `replicate-javascript/${packageJSON.version}`; - this.baseUrl = options.baseUrl || 'https://api.replicate.com/v1'; + this.baseUrl = options.baseUrl || "https://api.replicate.com/v1"; this.fetch = options.fetch || globalThis.fetch; this.collections = { @@ -54,7 +54,7 @@ class Replicate { this.deployments = { predictions: { create: deployments.predictions.create.bind(this), - } + }, }; this.hardware = { @@ -131,26 +131,30 @@ class Replicate { const { signal } = options; - prediction = await this.wait(prediction, wait || {}, async (updatedPrediction) => { - // Call progress callback with the updated prediction object - if (progress) { - progress(updatedPrediction); - } - - if (signal && signal.aborted) { - await this.predictions.cancel(updatedPrediction.id); - return true; // stop polling + prediction = await this.wait( + prediction, + wait || {}, + async (updatedPrediction) => { + // Call progress callback with the updated prediction object + if (progress) { + progress(updatedPrediction); + } + + if (signal && signal.aborted) { + await this.predictions.cancel(updatedPrediction.id); + return true; // stop polling + } + + return false; // continue polling } - - return false; // continue polling - }); + ); // Call progress callback with the completed prediction object if (progress) { progress(prediction); } - if (prediction.status === 'failed') { + if (prediction.status === "failed") { throw new Error(`Prediction failed: ${prediction.error}`); } @@ -177,31 +181,27 @@ class Replicate { url = route; } else { url = new URL( - route.startsWith('/') ? route.slice(1) : route, - baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/` + route.startsWith("/") ? route.slice(1) : route, + baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/` ); } - const { - method = 'GET', - params = {}, - data, - } = options; + const { method = "GET", params = {}, data } = options; - Object.entries(params).forEach(([key, value]) => { + for (const [key, value] of Object.entries(params)) { url.searchParams.append(key, value); - }); + } const headers = new Headers(); if (auth) { - headers.append('Authorization', `Token ${auth}`); + headers.append("Authorization", `Token ${auth}`); } - headers.append('Content-Type', 'application/json'); - headers.append('User-Agent', userAgent); + headers.append("Content-Type", "application/json"); + headers.append("User-Agent", userAgent); if (options.headers) { - options.headers.forEach((value, key) => { + for (const [key, value] of options.headers.entries()) { headers.append(key, value); - }); + } } const init = { @@ -210,14 +210,17 @@ class Replicate { body: data ? JSON.stringify(data) : undefined, }; - const shouldRetry = method === 'GET' ? - (response) => (response.status === 429 || response.status >= 500) : - (response) => (response.status === 429); + const shouldRetry = + method === "GET" + ? (response) => response.status === 429 || response.status >= 500 + : (response) => response.status === 429; // Workaround to fix `TypeError: Illegal invocation` error in Cloudflare Workers // https://github.com/replicate/replicate-javascript/issues/134 const _fetch = this.fetch; // eslint-disable-line no-underscore-dangle - const response = await withAutomaticRetries(async () => _fetch(url, init), { shouldRetry }); + const response = await withAutomaticRetries(async () => _fetch(url, init), { + shouldRetry, + }); if (!response.ok) { const request = new Request(url, init); @@ -225,7 +228,7 @@ class Replicate { throw new ApiError( `Request to ${url} failed with status ${response.status} ${response.statusText}: ${responseText}.`, request, - response, + response ); } @@ -243,11 +246,12 @@ class Replicate { * @param {Function} endpoint - Function that returns a promise for the next page of results * @yields {object[]} Each page of results */ - async * paginate(endpoint) { + async *paginate(endpoint) { const response = await endpoint(); yield response.results; if (response.next) { - const nextPage = () => this.request(response.next, { method: 'GET' }).then((r) => r.json()); + const nextPage = () => + this.request(response.next, { method: "GET" }).then((r) => r.json()); yield* this.paginate(nextPage); } } @@ -271,13 +275,13 @@ class Replicate { async wait(prediction, options, stop) { const { id } = prediction; if (!id) { - throw new Error('Invalid prediction'); + throw new Error("Invalid prediction"); } if ( - prediction.status === 'succeeded' || - prediction.status === 'failed' || - prediction.status === 'canceled' + prediction.status === "succeeded" || + prediction.status === "failed" || + prediction.status === "canceled" ) { return prediction; } @@ -290,12 +294,12 @@ class Replicate { let updatedPrediction = await this.predictions.get(id); while ( - updatedPrediction.status !== 'succeeded' && - updatedPrediction.status !== 'failed' && - updatedPrediction.status !== 'canceled' + updatedPrediction.status !== "succeeded" && + updatedPrediction.status !== "failed" && + updatedPrediction.status !== "canceled" ) { /* eslint-disable no-await-in-loop */ - if (stop && await stop(updatedPrediction) === true) { + if (stop && (await stop(updatedPrediction)) === true) { break; } @@ -304,7 +308,7 @@ class Replicate { /* eslint-enable no-await-in-loop */ } - if (updatedPrediction.status === 'failed') { + if (updatedPrediction.status === "failed") { throw new Error(`Prediction failed: ${updatedPrediction.error}`); } diff --git a/index.test.ts b/index.test.ts index 2684b85..98bff4a 100644 --- a/index.test.ts +++ b/index.test.ts @@ -1,20 +1,20 @@ -import { expect, jest, test } from '@jest/globals'; -import Replicate, { ApiError, Model, Prediction } from 'replicate'; -import nock from 'nock'; -import fetch from 'cross-fetch'; +import { expect, jest, test } from "@jest/globals"; +import Replicate, { ApiError, Model, Prediction } from "replicate"; +import nock from "nock"; +import fetch from "cross-fetch"; let client: Replicate; -const BASE_URL = 'https://api.replicate.com/v1'; +const BASE_URL = "https://api.replicate.com/v1"; nock.disableNetConnect(); -describe('Replicate client', () => { - let unmatched: Object[] = []; +describe("Replicate client", () => { + let unmatched: any[] = []; const handleNoMatch = (req: unknown, options: any, body: string) => unmatched.push({ req, options, body }); beforeEach(() => { - client = new Replicate({ auth: 'test-token' }); + client = new Replicate({ auth: "test-token" }); client.fetch = fetch; unmatched = []; @@ -29,59 +29,60 @@ describe('Replicate client', () => { nock.cleanAll(); }); - describe('constructor', () => { - test('Sets default baseUrl', () => { - expect(client.baseUrl).toBe('https://api.replicate.com/v1'); + describe("constructor", () => { + test("Sets default baseUrl", () => { + expect(client.baseUrl).toBe("https://api.replicate.com/v1"); }); - test('Sets custom baseUrl', () => { + test("Sets custom baseUrl", () => { const clientWithCustomBaseUrl = new Replicate({ - baseUrl: 'https://example.com/', - auth: 'test-token', + baseUrl: "https://example.com/", + auth: "test-token", }); - expect(clientWithCustomBaseUrl.baseUrl).toBe('https://example.com/'); + expect(clientWithCustomBaseUrl.baseUrl).toBe("https://example.com/"); }); - test('Sets custom userAgent', () => { + test("Sets custom userAgent", () => { const clientWithCustomUserAgent = new Replicate({ - userAgent: 'my-app/1.2.3', - auth: 'test-token', + userAgent: "my-app/1.2.3", + auth: "test-token", }); - expect(clientWithCustomUserAgent.userAgent).toBe('my-app/1.2.3'); + expect(clientWithCustomUserAgent.userAgent).toBe("my-app/1.2.3"); }); - test('Does not throw error if auth token is not provided', () => { - process.env.REPLICATE_API_TOKEN = 'test-token'; + test("Does not throw error if auth token is not provided", () => { + process.env.REPLICATE_API_TOKEN = "test-token"; expect(() => { const clientWithImplicitAuth = new Replicate(); - expect(clientWithImplicitAuth.auth).toBe('test-token'); + expect(clientWithImplicitAuth.auth).toBe("test-token"); }).not.toThrow(); }); - test('Does not throw error if blank auth token is provided', () => { + test("Does not throw error if blank auth token is provided", () => { expect(() => { new Replicate({ auth: "" }); }).not.toThrow(); }); }); - describe('collections.list', () => { - test('Calls the correct API route', async () => { + describe("collections.list", () => { + test("Calls the correct API route", async () => { nock(BASE_URL) - .get('/collections') + .get("/collections") .reply(200, { results: [ { - name: 'Super resolution', - slug: 'super-resolution', - description: 'Upscaling models that create high-quality images from low-quality images.', + name: "Super resolution", + slug: "super-resolution", + description: + "Upscaling models that create high-quality images from low-quality images.", }, { - name: 'Image classification', - slug: 'image-classification', - description: 'Models that classify images.', + name: "Image classification", + slug: "image-classification", + description: "Models that classify images.", }, ], next: null, @@ -94,54 +95,57 @@ describe('Replicate client', () => { // Add more tests for error handling, edge cases, etc. }); - describe('collections.get', () => { - test('Calls the correct API route', async () => { - nock(BASE_URL).get('/collections/super-resolution').reply(200, { - name: 'Super resolution', - slug: 'super-resolution', - description: 'Upscaling models that create high-quality images from low-quality images.', + describe("collections.get", () => { + test("Calls the correct API route", async () => { + nock(BASE_URL).get("/collections/super-resolution").reply(200, { + name: "Super resolution", + slug: "super-resolution", + description: + "Upscaling models that create high-quality images from low-quality images.", models: [], }); - const collection = await client.collections.get('super-resolution'); - expect(collection.name).toBe('Super resolution'); + const collection = await client.collections.get("super-resolution"); + expect(collection.name).toBe("Super resolution"); }); // Add more tests for error handling, edge cases, etc. }); - describe('models.get', () => { - test('Calls the correct API route', async () => { - nock(BASE_URL).get('/models/replicate/hello-world').reply(200, { - url: 'https://replicate.com/replicate/hello-world', - owner: 'replicate', - name: 'hello-world', - description: 'A tiny model that says hello', - visibility: 'public', - github_url: 'https://github.com/replicate/cog-examples', + describe("models.get", () => { + test("Calls the correct API route", async () => { + nock(BASE_URL).get("/models/replicate/hello-world").reply(200, { + url: "https://replicate.com/replicate/hello-world", + owner: "replicate", + name: "hello-world", + description: "A tiny model that says hello", + visibility: "public", + github_url: "https://github.com/replicate/cog-examples", paper_url: null, license_url: null, run_count: 12345, - cover_image_url: '', + cover_image_url: "", default_example: {}, latest_version: {}, }); - await client.models.get('replicate', 'hello-world'); + await client.models.get("replicate", "hello-world"); }); // Add more tests for error handling, edge cases, etc. }); - describe('models.list', () => { - test('Paginates results', async () => { + describe("models.list", () => { + test("Paginates results", async () => { nock(BASE_URL) - .get('/models') + .get("/models") .reply(200, { - results: [ { url: 'https://replicate.com/some-user/model-1' } ], - next: 'https://api.replicate.com/v1/models?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw', + results: [{ url: "https://replicate.com/some-user/model-1" }], + next: "https://api.replicate.com/v1/models?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw", }) - .get('/models?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw') + .get( + "/models?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw" + ) .reply(200, { - results: [ { url: 'https://replicate.com/some-user/model-2' } ], + results: [{ url: "https://replicate.com/some-user/model-2" }], next: null, }); @@ -149,32 +153,35 @@ describe('Replicate client', () => { for await (const batch of client.paginate(client.models.list)) { results.push(...batch); } - expect(results).toEqual([ { url: 'https://replicate.com/some-user/model-1' }, { url: 'https://replicate.com/some-user/model-2' } ]); + expect(results).toEqual([ + { url: "https://replicate.com/some-user/model-1" }, + { url: "https://replicate.com/some-user/model-2" }, + ]); // Add more tests for error handling, edge cases, etc. }); }); - describe('predictions.create', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("predictions.create", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .post('/predictions') + .post("/predictions") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - model: 'replicate/hello-world', + id: "ufawqhfynnddngldkgtslldrkq", + model: "replicate/hello-world", version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", urls: { - get: 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq', + get: "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq", cancel: - 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel', + "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel", }, - created_at: '2022-04-26T22:13:06.224088Z', + created_at: "2022-04-26T22:13:06.224088Z", started_at: null, completed_at: null, - status: 'starting', + status: "starting", input: { - text: 'Alice', + text: "Alice", }, output: null, error: null, @@ -183,200 +190,220 @@ describe('Replicate client', () => { }); const prediction = await client.predictions.create({ version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { - text: 'Alice', + text: "Alice", }, - webhook: 'http://test.host/webhook', - webhook_events_filter: [ 'output', 'completed' ], + webhook: "http://test.host/webhook", + webhook_events_filter: ["output", "completed"], }); - expect(prediction.id).toBe('ufawqhfynnddngldkgtslldrkq'); + expect(prediction.id).toBe("ufawqhfynnddngldkgtslldrkq"); }); - test('Passes stream parameter to API endpoint', async () => { + test("Passes stream parameter to API endpoint", async () => { nock(BASE_URL) - .post('/predictions') + .post("/predictions") .reply(201, (_uri, body) => { expect((body as any).stream).toBe(true); - return body - }) + return body; + }); await client.predictions.create({ version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { - prompt: 'Tell me a story', + prompt: "Tell me a story", }, - stream: true + stream: true, }); }); - test('Throws an error if webhook URL is invalid', async () => { + test("Throws an error if webhook URL is invalid", async () => { await expect(async () => { await client.predictions.create({ - version: '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + version: + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { - text: 'Alice', + text: "Alice", }, - webhook: 'invalid-url', + webhook: "invalid-url", }); - }).rejects.toThrow('Invalid webhook URL'); + }).rejects.toThrow("Invalid webhook URL"); }); - test('Throws an error with details failing response is JSON', async () => { - nock(BASE_URL) - .post('/predictions') - .reply(400, { + test("Throws an error with details failing response is JSON", async () => { + nock(BASE_URL).post("/predictions").reply( + 400, + { status: 400, detail: "Invalid input", - }, { "Content-Type": "application/json" }) + }, + { "Content-Type": "application/json" } + ); try { expect.hasAssertions(); await client.predictions.create({ - version: '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + version: + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { text: null, }, }); } catch (error) { expect((error as ApiError).response.status).toBe(400); - expect((error as ApiError).message).toContain("Invalid input") + expect((error as ApiError).message).toContain("Invalid input"); } - }) + }); - test('Automatically retries on 429', async () => { + test("Automatically retries on 429", async () => { nock(BASE_URL) - .post('/predictions') - .reply(429, { - detail: "Too many requests", - }, { "Content-Type": "application/json", "Retry-After": "1" }) - .post('/predictions') + .post("/predictions") + .reply( + 429, + { + detail: "Too many requests", + }, + { "Content-Type": "application/json", "Retry-After": "1" } + ) + .post("/predictions") .reply(201, { - id: 'ufawqhfynnddngldkgtslldrkq', + id: "ufawqhfynnddngldkgtslldrkq", }); const prediction = await client.predictions.create({ version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { - text: 'Alice', + text: "Alice", }, }); - expect(prediction.id).toBe('ufawqhfynnddngldkgtslldrkq'); + expect(prediction.id).toBe("ufawqhfynnddngldkgtslldrkq"); }); - test('Does not automatically retry on 500', async () => { - nock(BASE_URL) - .post('/predictions') - .reply(500, { + test("Does not automatically retry on 500", async () => { + nock(BASE_URL).post("/predictions").reply( + 500, + { detail: "Internal server error", - }, { "Content-Type": "application/json" }); + }, + { "Content-Type": "application/json" } + ); await expect( client.predictions.create({ version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", input: { - text: 'Alice', + text: "Alice", }, }) - ).rejects.toThrow(`Request to https://api.replicate.com/v1/predictions failed with status 500 Internal Server Error: {"detail":"Internal server error"}.`) + ).rejects.toThrow( + `Request to https://api.replicate.com/v1/predictions failed with status 500 Internal Server Error: {"detail":"Internal server error"}.` + ); }); }); - describe('predictions.get', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("predictions.get", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .get('/predictions/rrr4z55ocneqzikepnug6xezpe') + .get("/predictions/rrr4z55ocneqzikepnug6xezpe") .reply(200, { - id: 'rrr4z55ocneqzikepnug6xezpe', - model: 'stability-ai/stable-diffusion', + id: "rrr4z55ocneqzikepnug6xezpe", + model: "stability-ai/stable-diffusion", version: - 'be04660a5b93ef2aff61e3668dedb4cbeb14941e62a3fd5998364a32d613e35e', + "be04660a5b93ef2aff61e3668dedb4cbeb14941e62a3fd5998364a32d613e35e", urls: { - get: 'https://api.replicate.com/v1/predictions/rrr4z55ocneqzikepnug6xezpe', + get: "https://api.replicate.com/v1/predictions/rrr4z55ocneqzikepnug6xezpe", cancel: - 'https://api.replicate.com/v1/predictions/rrr4z55ocneqzikepnug6xezpe/cancel', + "https://api.replicate.com/v1/predictions/rrr4z55ocneqzikepnug6xezpe/cancel", }, - created_at: '2022-09-13T22:54:18.578761Z', - started_at: '2022-09-13T22:54:19.438525Z', - completed_at: '2022-09-13T22:54:23.236610Z', - source: 'api', - status: 'succeeded', + created_at: "2022-09-13T22:54:18.578761Z", + started_at: "2022-09-13T22:54:19.438525Z", + completed_at: "2022-09-13T22:54:23.236610Z", + source: "api", + status: "succeeded", input: { - prompt: 'oak tree with boletus growing on its branches', + prompt: "oak tree with boletus growing on its branches", }, output: [ - 'https://replicate.com/api/models/stability-ai/stable-diffusion/files/9c3b6fe4-2d37-4571-a17a-83951b1cb120/out-0.png', + "https://replicate.com/api/models/stability-ai/stable-diffusion/files/9c3b6fe4-2d37-4571-a17a-83951b1cb120/out-0.png", ], error: null, - logs: 'Using seed: 36941...', + logs: "Using seed: 36941...", metrics: { predict_time: 4.484541, }, }); const prediction = await client.predictions.get( - 'rrr4z55ocneqzikepnug6xezpe' + "rrr4z55ocneqzikepnug6xezpe" ); - expect(prediction.id).toBe('rrr4z55ocneqzikepnug6xezpe'); + expect(prediction.id).toBe("rrr4z55ocneqzikepnug6xezpe"); }); - test('Automatically retries on 429', async () => { + test("Automatically retries on 429", async () => { nock(BASE_URL) - .get('/predictions/rrr4z55ocneqzikepnug6xezpe') - .reply(429, { - detail: "Too many requests", - }, { "Content-Type": "application/json", "Retry-After": "1" }) - .get('/predictions/rrr4z55ocneqzikepnug6xezpe') + .get("/predictions/rrr4z55ocneqzikepnug6xezpe") + .reply( + 429, + { + detail: "Too many requests", + }, + { "Content-Type": "application/json", "Retry-After": "1" } + ) + .get("/predictions/rrr4z55ocneqzikepnug6xezpe") .reply(200, { - id: 'rrr4z55ocneqzikepnug6xezpe', + id: "rrr4z55ocneqzikepnug6xezpe", }); const prediction = await client.predictions.get( - 'rrr4z55ocneqzikepnug6xezpe' + "rrr4z55ocneqzikepnug6xezpe" ); - expect(prediction.id).toBe('rrr4z55ocneqzikepnug6xezpe'); + expect(prediction.id).toBe("rrr4z55ocneqzikepnug6xezpe"); }); - test('Automatically retries on 500', async () => { + test("Automatically retries on 500", async () => { nock(BASE_URL) - .get('/predictions/rrr4z55ocneqzikepnug6xezpe') - .reply(500, { - detail: "Internal server error", - }, { "Content-Type": "application/json" }) - .get('/predictions/rrr4z55ocneqzikepnug6xezpe') + .get("/predictions/rrr4z55ocneqzikepnug6xezpe") + .reply( + 500, + { + detail: "Internal server error", + }, + { "Content-Type": "application/json" } + ) + .get("/predictions/rrr4z55ocneqzikepnug6xezpe") .reply(200, { - id: 'rrr4z55ocneqzikepnug6xezpe', + id: "rrr4z55ocneqzikepnug6xezpe", }); const prediction = await client.predictions.get( - 'rrr4z55ocneqzikepnug6xezpe' + "rrr4z55ocneqzikepnug6xezpe" ); - expect(prediction.id).toBe('rrr4z55ocneqzikepnug6xezpe'); + expect(prediction.id).toBe("rrr4z55ocneqzikepnug6xezpe"); }); }); - describe('predictions.cancel', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("predictions.cancel", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .post('/predictions/ufawqhfynnddngldkgtslldrkq/cancel') + .post("/predictions/ufawqhfynnddngldkgtslldrkq/cancel") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - model: 'replicate/hello-world', + id: "ufawqhfynnddngldkgtslldrkq", + model: "replicate/hello-world", version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", urls: { - get: 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq', + get: "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq", cancel: - 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel', + "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel", }, - created_at: '2022-04-26T22:13:06.224088Z', - started_at: '2022-04-26T22:13:06.224088Z', - completed_at: '2022-04-26T22:14:06.224088Z', - status: 'canceled', + created_at: "2022-04-26T22:13:06.224088Z", + started_at: "2022-04-26T22:13:06.224088Z", + completed_at: "2022-04-26T22:14:06.224088Z", + status: "canceled", input: { - text: 'Alice', + text: "Alice", }, output: null, error: null, @@ -385,58 +412,58 @@ describe('Replicate client', () => { }); const prediction = await client.predictions.cancel( - 'ufawqhfynnddngldkgtslldrkq' + "ufawqhfynnddngldkgtslldrkq" ); - expect(prediction.status).toBe('canceled'); + expect(prediction.status).toBe("canceled"); }); // Add more tests for error handling, edge cases, etc. }); - describe('predictions.list', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("predictions.list", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .get('/predictions') + .get("/predictions") .reply(200, { - next: 'https://api.replicate.com/v1/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw', + next: "https://api.replicate.com/v1/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw", previous: null, results: [ { - id: 'jpzd7hm5gfcapbfyt4mqytarku', - model: 'stability-ai/stable-diffusion', + id: "jpzd7hm5gfcapbfyt4mqytarku", + model: "stability-ai/stable-diffusion", version: - 'b21cbe271e65c1718f2999b038c18b45e21e4fba961181fbfae9342fc53b9e05', + "b21cbe271e65c1718f2999b038c18b45e21e4fba961181fbfae9342fc53b9e05", urls: { - get: 'https://api.replicate.com/v1/predictions/jpzd7hm5gfcapbfyt4mqytarku', + get: "https://api.replicate.com/v1/predictions/jpzd7hm5gfcapbfyt4mqytarku", cancel: - 'https://api.replicate.com/v1/predictions/jpzd7hm5gfcapbfyt4mqytarku/cancel', + "https://api.replicate.com/v1/predictions/jpzd7hm5gfcapbfyt4mqytarku/cancel", }, - created_at: '2022-04-26T20:00:40.658234Z', - started_at: '2022-04-26T20:00:84.583803Z', - completed_at: '2022-04-26T20:02:27.648305Z', - source: 'web', - status: 'succeeded', + created_at: "2022-04-26T20:00:40.658234Z", + started_at: "2022-04-26T20:00:84.583803Z", + completed_at: "2022-04-26T20:02:27.648305Z", + source: "web", + status: "succeeded", }, ], }); const predictions = await client.predictions.list(); expect(predictions.results.length).toBe(1); - expect(predictions.results[ 0 ].id).toBe('jpzd7hm5gfcapbfyt4mqytarku'); + expect(predictions.results[0].id).toBe("jpzd7hm5gfcapbfyt4mqytarku"); }); - test('Paginates results', async () => { + test("Paginates results", async () => { nock(BASE_URL) - .get('/predictions') + .get("/predictions") .reply(200, { - results: [ { id: 'ufawqhfynnddngldkgtslldrkq' } ], - next: 'https://api.replicate.com/v1/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw', + results: [{ id: "ufawqhfynnddngldkgtslldrkq" }], + next: "https://api.replicate.com/v1/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw", }) .get( - '/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw' + "/predictions?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw" ) .reply(200, { - results: [ { id: 'rrr4z55ocneqzikepnug6xezpe' } ], + results: [{ id: "rrr4z55ocneqzikepnug6xezpe" }], next: null, }); @@ -445,175 +472,176 @@ describe('Replicate client', () => { results.push(...batch); } expect(results).toEqual([ - { id: 'ufawqhfynnddngldkgtslldrkq' }, - { id: 'rrr4z55ocneqzikepnug6xezpe' }, + { id: "ufawqhfynnddngldkgtslldrkq" }, + { id: "rrr4z55ocneqzikepnug6xezpe" }, ]); // Add more tests for error handling, edge cases, etc. }); }); - describe('trainings.create', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("trainings.create", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) .post( - '/models/owner/model/versions/632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532/trainings' + "/models/owner/model/versions/632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532/trainings" ) .reply(200, { - id: 'zz4ibbonubfz7carwiefibzgga', - version: '632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532', - status: 'starting', + id: "zz4ibbonubfz7carwiefibzgga", + version: + "632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532", + status: "starting", input: { - text: '...', + text: "...", }, output: null, error: null, logs: null, started_at: null, - created_at: '2023-03-28T21:47:58.566434Z', + created_at: "2023-03-28T21:47:58.566434Z", completed_at: null, }); const training = await client.trainings.create( - 'owner', - 'model', - '632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532', + "owner", + "model", + "632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532", { - destination: 'new_owner/new_model', + destination: "new_owner/new_model", input: { - text: '...', + text: "...", }, } ); - expect(training.id).toBe('zz4ibbonubfz7carwiefibzgga'); + expect(training.id).toBe("zz4ibbonubfz7carwiefibzgga"); }); - test('Throws an error if webhook is not a valid URL', async () => { + test("Throws an error if webhook is not a valid URL", async () => { await expect( client.trainings.create( - 'owner', - 'model', - '632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532', + "owner", + "model", + "632231d0d49d34d5c4633bd838aee3d81d936e59a886fbf28524702003b4c532", { - destination: 'new_owner/new_model', + destination: "new_owner/new_model", input: { - text: '...', + text: "...", }, - webhook: 'invalid-url', + webhook: "invalid-url", } ) - ).rejects.toThrow('Invalid webhook URL'); + ).rejects.toThrow("Invalid webhook URL"); }); // Add more tests for error handling, edge cases, etc. }); - describe('trainings.get', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("trainings.get", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .get('/trainings/zz4ibbonubfz7carwiefibzgga') + .get("/trainings/zz4ibbonubfz7carwiefibzgga") .reply(200, { - id: 'zz4ibbonubfz7carwiefibzgga', - version: '{version}', - status: 'succeeded', + id: "zz4ibbonubfz7carwiefibzgga", + version: "{version}", + status: "succeeded", input: { - data: '...', - param1: '...', + data: "...", + param1: "...", }, output: { - version: '...', + version: "...", }, error: null, logs: null, webhook_completed: null, started_at: null, - created_at: '2023-03-28T21:47:58.566434Z', + created_at: "2023-03-28T21:47:58.566434Z", completed_at: null, }); - const training = await client.trainings.get('zz4ibbonubfz7carwiefibzgga'); - expect(training.status).toBe('succeeded'); + const training = await client.trainings.get("zz4ibbonubfz7carwiefibzgga"); + expect(training.status).toBe("succeeded"); }); // Add more tests for error handling, edge cases, etc. }); - describe('trainings.cancel', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("trainings.cancel", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .post('/trainings/zz4ibbonubfz7carwiefibzgga/cancel') + .post("/trainings/zz4ibbonubfz7carwiefibzgga/cancel") .reply(200, { - id: 'zz4ibbonubfz7carwiefibzgga', - version: '{version}', - status: 'canceled', + id: "zz4ibbonubfz7carwiefibzgga", + version: "{version}", + status: "canceled", input: { - data: '...', - param1: '...', + data: "...", + param1: "...", }, output: { - version: '...', + version: "...", }, error: null, logs: null, webhook_completed: null, started_at: null, - created_at: '2023-03-28T21:47:58.566434Z', + created_at: "2023-03-28T21:47:58.566434Z", completed_at: null, }); const training = await client.trainings.cancel( - 'zz4ibbonubfz7carwiefibzgga' + "zz4ibbonubfz7carwiefibzgga" ); - expect(training.status).toBe('canceled'); + expect(training.status).toBe("canceled"); }); // Add more tests for error handling, edge cases, etc. }); - describe('trainings.list', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("trainings.list", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .get('/trainings') + .get("/trainings") .reply(200, { - next: 'https://api.replicate.com/v1/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw', + next: "https://api.replicate.com/v1/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw", previous: null, results: [ { - id: 'jpzd7hm5gfcapbfyt4mqytarku', - model: 'stability-ai/sdxl', + id: "jpzd7hm5gfcapbfyt4mqytarku", + model: "stability-ai/sdxl", version: - 'b21cbe271e65c1718f2999b038c18b45e21e4fba961181fbfae9342fc53b9e05', + "b21cbe271e65c1718f2999b038c18b45e21e4fba961181fbfae9342fc53b9e05", urls: { - get: 'https://api.replicate.com/v1/trainings/jpzd7hm5gfcapbfyt4mqytarku', + get: "https://api.replicate.com/v1/trainings/jpzd7hm5gfcapbfyt4mqytarku", cancel: - 'https://api.replicate.com/v1/trainings/jpzd7hm5gfcapbfyt4mqytarku/cancel', + "https://api.replicate.com/v1/trainings/jpzd7hm5gfcapbfyt4mqytarku/cancel", }, - created_at: '2022-04-26T20:00:40.658234Z', - started_at: '2022-04-26T20:00:84.583803Z', - completed_at: '2022-04-26T20:02:27.648305Z', - source: 'web', - status: 'succeeded', + created_at: "2022-04-26T20:00:40.658234Z", + started_at: "2022-04-26T20:00:84.583803Z", + completed_at: "2022-04-26T20:02:27.648305Z", + source: "web", + status: "succeeded", }, ], }); const trainings = await client.trainings.list(); expect(trainings.results.length).toBe(1); - expect(trainings.results[ 0 ].id).toBe('jpzd7hm5gfcapbfyt4mqytarku'); + expect(trainings.results[0].id).toBe("jpzd7hm5gfcapbfyt4mqytarku"); }); - test('Paginates results', async () => { + test("Paginates results", async () => { nock(BASE_URL) - .get('/trainings') + .get("/trainings") .reply(200, { - results: [ { id: 'ufawqhfynnddngldkgtslldrkq' } ], - next: 'https://api.replicate.com/v1/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw', + results: [{ id: "ufawqhfynnddngldkgtslldrkq" }], + next: "https://api.replicate.com/v1/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw", }) .get( - '/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw' + "/trainings?cursor=cD0yMDIyLTAxLTIxKzIzJTNBMTglM0EyNC41MzAzNTclMkIwMCUzQTAw" ) .reply(200, { - results: [ { id: 'rrr4z55ocneqzikepnug6xezpe' } ], + results: [{ id: "rrr4z55ocneqzikepnug6xezpe" }], next: null, }); @@ -622,88 +650,97 @@ describe('Replicate client', () => { results.push(...batch); } expect(results).toEqual([ - { id: 'ufawqhfynnddngldkgtslldrkq' }, - { id: 'rrr4z55ocneqzikepnug6xezpe' }, + { id: "ufawqhfynnddngldkgtslldrkq" }, + { id: "rrr4z55ocneqzikepnug6xezpe" }, ]); // Add more tests for error handling, edge cases, etc. }); }); - describe('deployments.predictions.create', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("deployments.predictions.create", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .post('/deployments/replicate/greeter/predictions') + .post("/deployments/replicate/greeter/predictions") .reply(200, { - id: 'mfrgcyzzme2wkmbwgzrgmntcg', - model: 'replicate/hello-world', + id: "mfrgcyzzme2wkmbwgzrgmntcg", + model: "replicate/hello-world", version: - '5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", urls: { - get: 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq', + get: "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq", cancel: - 'https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel', + "https://api.replicate.com/v1/predictions/ufawqhfynnddngldkgtslldrkq/cancel", }, - created_at: '2022-09-10T09:44:22.165836Z', + created_at: "2022-09-10T09:44:22.165836Z", started_at: null, completed_at: null, - status: 'starting', + status: "starting", input: { - text: 'Alice', + text: "Alice", }, output: null, error: null, logs: null, metrics: {}, }); - const prediction = await client.deployments.predictions.create("replicate", "greeter", { - input: { - text: 'Alice', - }, - webhook: 'http://test.host/webhook', - webhook_events_filter: [ 'output', 'completed' ], - }); - expect(prediction.id).toBe('mfrgcyzzme2wkmbwgzrgmntcg'); + const prediction = await client.deployments.predictions.create( + "replicate", + "greeter", + { + input: { + text: "Alice", + }, + webhook: "http://test.host/webhook", + webhook_events_filter: ["output", "completed"], + } + ); + expect(prediction.id).toBe("mfrgcyzzme2wkmbwgzrgmntcg"); }); // Add more tests for error handling, edge cases, etc. }); - describe('models.predictions.create', () => { - test('Calls the correct API route with the correct payload', async () => { + describe("models.predictions.create", () => { + test("Calls the correct API route with the correct payload", async () => { nock(BASE_URL) - .post('/models/meta/llama-2-70b-chat/predictions') + .post("/models/meta/llama-2-70b-chat/predictions") .reply(200, { id: "heat2o3bzn3ahtr6bjfftvbaci", model: "replicate/lifeboat-70b", version: "d-c6559c5791b50af57b69f4a73f8e021c", input: { - prompt: "Please write a haiku about llamas." + prompt: "Please write a haiku about llamas.", }, logs: "", error: null, status: "starting", created_at: "2023-11-27T13:35:45.99397566Z", urls: { - cancel: "https://api.replicate.com/v1/predictions/heat2o3bzn3ahtr6bjfftvbaci/cancel", - get: "https://api.replicate.com/v1/predictions/heat2o3bzn3ahtr6bjfftvbaci" - } + cancel: + "https://api.replicate.com/v1/predictions/heat2o3bzn3ahtr6bjfftvbaci/cancel", + get: "https://api.replicate.com/v1/predictions/heat2o3bzn3ahtr6bjfftvbaci", + }, }); - const prediction = await client.models.predictions.create("meta", "llama-2-70b-chat", { - input: { - prompt: "Please write a haiku about llamas." - }, - webhook: 'http://test.host/webhook', - webhook_events_filter: [ 'output', 'completed' ], - }); - expect(prediction.id).toBe('heat2o3bzn3ahtr6bjfftvbaci'); + const prediction = await client.models.predictions.create( + "meta", + "llama-2-70b-chat", + { + input: { + prompt: "Please write a haiku about llamas.", + }, + webhook: "http://test.host/webhook", + webhook_events_filter: ["output", "completed"], + } + ); + expect(prediction.id).toBe("heat2o3bzn3ahtr6bjfftvbaci"); }); // Add more tests for error handling, edge cases, etc. }); - describe('hardware.list', () => { - test('Calls the correct API route', async () => { + describe("hardware.list", () => { + test("Calls the correct API route", async () => { nock(BASE_URL) - .get('/hardware') + .get("/hardware") .reply(200, [ { name: "CPU", sku: "cpu" }, { name: "Nvidia T4 GPU", sku: "gpu-t4" }, @@ -713,233 +750,232 @@ describe('Replicate client', () => { const hardware = await client.hardware.list(); expect(hardware.length).toBe(4); - expect(hardware[ 0 ].name).toBe('CPU'); - expect(hardware[ 0 ].sku).toBe('cpu'); + expect(hardware[0].name).toBe("CPU"); + expect(hardware[0].sku).toBe("cpu"); }); // Add more tests for error handling, edge cases, etc. }); - describe('models.create', () => { - test('Calls the correct API route with the correct payload', async () => { - nock(BASE_URL) - .post('/models') - .reply(200, { - owner: 'test-owner', - name: 'test-model', - visibility: 'public', - hardware: 'cpu', - description: 'A test model', - }); + describe("models.create", () => { + test("Calls the correct API route with the correct payload", async () => { + nock(BASE_URL).post("/models").reply(200, { + owner: "test-owner", + name: "test-model", + visibility: "public", + hardware: "cpu", + description: "A test model", + }); - const model = await client.models.create( - 'test-owner', - 'test-model', - { - visibility: 'public', - hardware: 'cpu', - description: 'A test model', - }); + const model = await client.models.create("test-owner", "test-model", { + visibility: "public", + hardware: "cpu", + description: "A test model", + }); - expect(model.owner).toBe('test-owner'); - expect(model.name).toBe('test-model'); - expect(model.visibility).toBe('public'); + expect(model.owner).toBe("test-owner"); + expect(model.name).toBe("test-model"); + expect(model.visibility).toBe("public"); // expect(model.hardware).toBe('cpu'); - expect(model.description).toBe('A test model'); + expect(model.description).toBe("A test model"); }); }); - describe('run', () => { - test('Calls the correct API routes for a version', async () => { - let firstPollingRequest = true; + describe("run", () => { + test("Calls the correct API routes for a version", async () => { + const firstPollingRequest = true; nock(BASE_URL) - .post('/predictions') + .post("/predictions") .reply(201, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'starting', + id: "ufawqhfynnddngldkgtslldrkq", + status: "starting", }) - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .twice() .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }) - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'succeeded', - output: 'Goodbye!', + id: "ufawqhfynnddngldkgtslldrkq", + status: "succeeded", + output: "Goodbye!", }); const progress = jest.fn(); const output = await client.run( - 'owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", { - input: { text: 'Hello, world!' }, - wait: { interval: 1 } + input: { text: "Hello, world!" }, + wait: { interval: 1 }, }, progress ); - expect(output).toBe('Goodbye!'); + expect(output).toBe("Goodbye!"); expect(progress).toHaveBeenNthCalledWith(1, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'starting', + id: "ufawqhfynnddngldkgtslldrkq", + status: "starting", }); expect(progress).toHaveBeenNthCalledWith(2, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }); expect(progress).toHaveBeenNthCalledWith(3, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }); expect(progress).toHaveBeenNthCalledWith(4, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'succeeded', - output: 'Goodbye!', + id: "ufawqhfynnddngldkgtslldrkq", + status: "succeeded", + output: "Goodbye!", }); expect(progress).toHaveBeenCalledTimes(4); }); - test('Calls the correct API routes for a model', async () => { - let firstPollingRequest = true; + test("Calls the correct API routes for a model", async () => { + const firstPollingRequest = true; nock(BASE_URL) - .post('/models/replicate/hello-world/predictions') + .post("/models/replicate/hello-world/predictions") .reply(201, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'starting', + id: "ufawqhfynnddngldkgtslldrkq", + status: "starting", }) - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .twice() .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }) - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'succeeded', - output: 'Goodbye!', + id: "ufawqhfynnddngldkgtslldrkq", + status: "succeeded", + output: "Goodbye!", }); const progress = jest.fn(); const output = await client.run( - 'replicate/hello-world', + "replicate/hello-world", { - input: { text: 'Hello, world!' }, - wait: { interval: 1 } + input: { text: "Hello, world!" }, + wait: { interval: 1 }, }, progress ); - expect(output).toBe('Goodbye!'); + expect(output).toBe("Goodbye!"); expect(progress).toHaveBeenNthCalledWith(1, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'starting', + id: "ufawqhfynnddngldkgtslldrkq", + status: "starting", }); expect(progress).toHaveBeenNthCalledWith(2, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }); expect(progress).toHaveBeenNthCalledWith(3, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }); expect(progress).toHaveBeenNthCalledWith(4, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'succeeded', - output: 'Goodbye!', + id: "ufawqhfynnddngldkgtslldrkq", + status: "succeeded", + output: "Goodbye!", }); expect(progress).toHaveBeenCalledTimes(4); }); - test('Does not throw an error for identifier containing hyphen and full stop', async () => { + test("Does not throw an error for identifier containing hyphen and full stop", async () => { nock(BASE_URL) - .post('/predictions') + .post("/predictions") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }) - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'succeeded', - output: 'foobar', + id: "ufawqhfynnddngldkgtslldrkq", + status: "succeeded", + output: "foobar", }); - await expect(client.run('a/b-1.0:abc123', { input: { text: 'Hello, world!' } })).resolves.not.toThrow(); + await expect( + client.run("a/b-1.0:abc123", { input: { text: "Hello, world!" } }) + ).resolves.not.toThrow(); }); - test('Throws an error for invalid identifiers', async () => { - const options = { input: { text: 'Hello, world!' } } + test("Throws an error for invalid identifiers", async () => { + const options = { input: { text: "Hello, world!" } }; // @ts-expect-error - await expect(client.run('owner:abc123', options)).rejects.toThrow(); + await expect(client.run("owner:abc123", options)).rejects.toThrow(); - await expect(client.run('/model:abc123', options)).rejects.toThrow(); + await expect(client.run("/model:abc123", options)).rejects.toThrow(); // @ts-expect-error - await expect(client.run(':abc123', options)).rejects.toThrow(); + await expect(client.run(":abc123", options)).rejects.toThrow(); }); - test('Throws an error if webhook URL is invalid', async () => { + test("Throws an error if webhook URL is invalid", async () => { await expect(async () => { await client.run( - 'owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', { - input: { - text: 'Alice', - }, - webhook: 'invalid-url', - }); - }).rejects.toThrow('Invalid webhook URL'); + "owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", + { + input: { + text: "Alice", + }, + webhook: "invalid-url", + } + ); + }).rejects.toThrow("Invalid webhook URL"); }); - test('Aborts the operation when abort signal is invoked', async () => { + test("Aborts the operation when abort signal is invoked", async () => { const controller = new AbortController(); const { signal } = controller; const scope = nock(BASE_URL) - .post('/predictions', (body) => { + .post("/predictions", (body) => { controller.abort(); return body; }) .reply(201, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }) .persist() - .get('/predictions/ufawqhfynnddngldkgtslldrkq') + .get("/predictions/ufawqhfynnddngldkgtslldrkq") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'processing', + id: "ufawqhfynnddngldkgtslldrkq", + status: "processing", }) - .post('/predictions/ufawqhfynnddngldkgtslldrkq/cancel') + .post("/predictions/ufawqhfynnddngldkgtslldrkq/cancel") .reply(200, { - id: 'ufawqhfynnddngldkgtslldrkq', - status: 'canceled', - });; + id: "ufawqhfynnddngldkgtslldrkq", + status: "canceled", + }); await client.run( - 'owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa', + "owner/model:5c7d5dc6dd8bf75c1acaa8565735e7986bc5b66206b55cca93cb72c9bf15ccaa", { - input: { text: 'Hello, world!' }, + input: { text: "Hello, world!" }, signal, } - ) + ); expect(signal.aborted).toBe(true); diff --git a/jest.config.js b/jest.config.js index 36d66b5..821539f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,11 +1,14 @@ // eslint-disable-next-line jsdoc/valid-types /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', + preset: "ts-jest", + testEnvironment: "node", transform: { - '^.+\\.ts?$': ['ts-jest', { - tsconfig: 'tsconfig.json' - }], + "^.+\\.ts?$": [ + "ts-jest", + { + tsconfig: "tsconfig.json", + }, + ], }, }; diff --git a/jsconfig.json b/jsconfig.json index 6ea5468..b83b3f3 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,15 +1,15 @@ { - "compilerOptions": { - "checkJs": true, - "module": "ESNext", - "moduleResolution": "Node", - "target": "ES2020", - "resolveJsonModule": true, - "strictNullChecks": true, - "strictFunctionTypes": true - }, - "exclude": [ - "node_modules", - "**/node_modules/*" - ] + "compilerOptions": { + "checkJs": true, + "module": "ESNext", + "moduleResolution": "Node", + "target": "ES2020", + "resolveJsonModule": true, + "strictNullChecks": true, + "strictFunctionTypes": true + }, + "exclude": [ + "node_modules", + "**/node_modules/*" + ] } diff --git a/lib/collections.js b/lib/collections.js index b40d091..9332aaa 100644 --- a/lib/collections.js +++ b/lib/collections.js @@ -6,7 +6,7 @@ */ async function getCollection(collection_slug) { const response = await this.request(`/collections/${collection_slug}`, { - method: 'GET', + method: "GET", }); return response.json(); @@ -18,8 +18,8 @@ async function getCollection(collection_slug) { * @returns {Promise} - Resolves with the collections data */ async function listCollections() { - const response = await this.request('/collections', { - method: 'GET', + const response = await this.request("/collections", { + method: "GET", }); return response.json(); diff --git a/lib/deployments.js b/lib/deployments.js index 4682c9b..6f32cdb 100644 --- a/lib/deployments.js +++ b/lib/deployments.js @@ -18,14 +18,17 @@ async function createPrediction(deployment_owner, deployment_name, options) { // eslint-disable-next-line no-new new URL(data.webhook); } catch (err) { - throw new Error('Invalid webhook URL'); + throw new Error("Invalid webhook URL"); } } - const response = await this.request(`/deployments/${deployment_owner}/${deployment_name}/predictions`, { - method: 'POST', - data: { ...data, stream }, - }); + const response = await this.request( + `/deployments/${deployment_owner}/${deployment_name}/predictions`, + { + method: "POST", + data: { ...data, stream }, + } + ); return response.json(); } @@ -33,5 +36,5 @@ async function createPrediction(deployment_owner, deployment_name, options) { module.exports = { predictions: { create: createPrediction, - } + }, }; diff --git a/lib/error.js b/lib/error.js index 81dbe47..cf05cd1 100644 --- a/lib/error.js +++ b/lib/error.js @@ -12,7 +12,7 @@ class ApiError extends Error { */ constructor(message, request, response) { super(message); - this.name = 'ApiError'; + this.name = "ApiError"; this.request = request; this.response = response; } diff --git a/lib/hardware.js b/lib/hardware.js index 487f3b8..d717548 100644 --- a/lib/hardware.js +++ b/lib/hardware.js @@ -4,8 +4,8 @@ * @returns {Promise} Resolves with the array of hardware */ async function listHardware() { - const response = await this.request('/hardware', { - method: 'GET', + const response = await this.request("/hardware", { + method: "GET", }); return response.json(); diff --git a/lib/identifier.js b/lib/identifier.js index 07e21d1..86e23ee 100644 --- a/lib/identifier.js +++ b/lib/identifier.js @@ -21,9 +21,13 @@ class ModelVersionIdentifier { * @throws {Error} If the reference is invalid. */ static parse(ref) { - const match = ref.match(/^(?[^/]+)\/(?[^/:]+)(:(?.+))?$/); + const match = ref.match( + /^(?[^/]+)\/(?[^/:]+)(:(?.+))?$/ + ); if (!match) { - throw new Error(`Invalid reference to model version: ${ref}. Expected format: owner/name or owner/name:version`); + throw new Error( + `Invalid reference to model version: ${ref}. Expected format: owner/name or owner/name:version` + ); } const { owner, name, version } = match.groups; diff --git a/lib/models.js b/lib/models.js index 12419fc..cb32e9e 100644 --- a/lib/models.js +++ b/lib/models.js @@ -7,7 +7,7 @@ */ async function getModel(model_owner, model_name) { const response = await this.request(`/models/${model_owner}/${model_name}`, { - method: 'GET', + method: "GET", }); return response.json(); @@ -21,9 +21,12 @@ async function getModel(model_owner, model_name) { * @returns {Promise} Resolves with the list of model versions */ async function listModelVersions(model_owner, model_name) { - const response = await this.request(`/models/${model_owner}/${model_name}/versions`, { - method: 'GET', - }); + const response = await this.request( + `/models/${model_owner}/${model_name}/versions`, + { + method: "GET", + } + ); return response.json(); } @@ -37,9 +40,12 @@ async function listModelVersions(model_owner, model_name) { * @returns {Promise} Resolves with the model version data */ async function getModelVersion(model_owner, model_name, version_id) { - const response = await this.request(`/models/${model_owner}/${model_name}/versions/${version_id}`, { - method: 'GET', - }); + const response = await this.request( + `/models/${model_owner}/${model_name}/versions/${version_id}`, + { + method: "GET", + } + ); return response.json(); } @@ -50,8 +56,8 @@ async function getModelVersion(model_owner, model_name, version_id) { * @returns {Promise} Resolves with the model version data */ async function listModels() { - const response = await this.request('/models', { - method: 'GET', + const response = await this.request("/models", { + method: "GET", }); return response.json(); @@ -75,8 +81,8 @@ async function listModels() { async function createModel(model_owner, model_name, options) { const data = { owner: model_owner, name: model_name, ...options }; - const response = await this.request('/models', { - method: 'POST', + const response = await this.request("/models", { + method: "POST", data, }); @@ -98,10 +104,13 @@ async function createModel(model_owner, model_name, options) { async function createPrediction(model_owner, model_name, options) { const { stream, ...data } = options; - const response = await this.request(`/models/${model_owner}/${model_name}/predictions`, { - method: 'POST', - data: { ...data, stream }, - }); + const response = await this.request( + `/models/${model_owner}/${model_name}/predictions`, + { + method: "POST", + data: { ...data, stream }, + } + ); return response.json(); } diff --git a/lib/predictions.js b/lib/predictions.js index 32b18ad..b1f7fe5 100644 --- a/lib/predictions.js +++ b/lib/predictions.js @@ -17,12 +17,12 @@ async function createPrediction(options) { // eslint-disable-next-line no-new new URL(data.webhook); } catch (err) { - throw new Error('Invalid webhook URL'); + throw new Error("Invalid webhook URL"); } } - const response = await this.request('/predictions', { - method: 'POST', + const response = await this.request("/predictions", { + method: "POST", data: { ...data, stream }, }); @@ -37,7 +37,7 @@ async function createPrediction(options) { */ async function getPrediction(prediction_id) { const response = await this.request(`/predictions/${prediction_id}`, { - method: 'GET', + method: "GET", }); return response.json(); @@ -51,7 +51,7 @@ async function getPrediction(prediction_id) { */ async function cancelPrediction(prediction_id) { const response = await this.request(`/predictions/${prediction_id}/cancel`, { - method: 'POST', + method: "POST", }); return response.json(); @@ -63,8 +63,8 @@ async function cancelPrediction(prediction_id) { * @returns {Promise} - Resolves with a page of predictions */ async function listPredictions() { - const response = await this.request('/predictions', { - method: 'GET', + const response = await this.request("/predictions", { + method: "GET", }); return response.json(); diff --git a/lib/trainings.js b/lib/trainings.js index edb037c..6b13dca 100644 --- a/lib/trainings.js +++ b/lib/trainings.js @@ -19,14 +19,17 @@ async function createTraining(model_owner, model_name, version_id, options) { // eslint-disable-next-line no-new new URL(data.webhook); } catch (err) { - throw new Error('Invalid webhook URL'); + throw new Error("Invalid webhook URL"); } } - const response = await this.request(`/models/${model_owner}/${model_name}/versions/${version_id}/trainings`, { - method: 'POST', - data, - }); + const response = await this.request( + `/models/${model_owner}/${model_name}/versions/${version_id}/trainings`, + { + method: "POST", + data, + } + ); return response.json(); } @@ -39,7 +42,7 @@ async function createTraining(model_owner, model_name, version_id, options) { */ async function getTraining(training_id) { const response = await this.request(`/trainings/${training_id}`, { - method: 'GET', + method: "GET", }); return response.json(); @@ -53,7 +56,7 @@ async function getTraining(training_id) { */ async function cancelTraining(training_id) { const response = await this.request(`/trainings/${training_id}/cancel`, { - method: 'POST', + method: "POST", }); return response.json(); @@ -65,8 +68,8 @@ async function cancelTraining(training_id) { * @returns {Promise} - Resolves with a page of trainings */ async function listTrainings() { - const response = await this.request('/trainings', { - method: 'GET', + const response = await this.request("/trainings", { + method: "GET", }); return response.json(); diff --git a/lib/util.js b/lib/util.js index 1b9cf9d..7b12633 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1,4 +1,4 @@ -const ApiError = require('./error'); +const ApiError = require("./error"); /** * Automatically retry a request if it fails with an appropriate status code. @@ -20,7 +20,7 @@ const ApiError = require('./error'); * @throws {ApiError} If the request failed */ async function withAutomaticRetries(request, options = {}) { - const shouldRetry = options.shouldRetry || (() => (false)); + const shouldRetry = options.shouldRetry || (() => false); const maxRetries = options.maxRetries || 5; const interval = options.interval || 500; const jitter = options.jitter || 100; @@ -30,7 +30,7 @@ async function withAutomaticRetries(request, options = {}) { let attempts = 0; do { - let delay = (interval * (2 ** attempts)) + (Math.random() * jitter); + let delay = interval * 2 ** attempts + Math.random() * jitter; /* eslint-disable no-await-in-loop */ try { @@ -40,14 +40,16 @@ async function withAutomaticRetries(request, options = {}) { } } catch (error) { if (error instanceof ApiError) { - const retryAfter = error.response.headers.get('Retry-After'); + const retryAfter = error.response.headers.get("Retry-After"); if (retryAfter) { - if (!Number.isInteger(retryAfter)) { // Retry-After is a date + if (!Number.isInteger(retryAfter)) { + // Retry-After is a date const date = new Date(retryAfter); if (!Number.isNaN(date.getTime())) { delay = date.getTime() - new Date().getTime(); } - } else { // Retry-After is a number of seconds + } else { + // Retry-After is a number of seconds delay = retryAfter * 1000; } } diff --git a/package-lock.json b/package-lock.json index 7d1654e..1c211cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,10 @@ "version": "0.23.0", "license": "Apache-2.0", "devDependencies": { + "@biomejs/biome": "^1.4.1", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^5.56.0", "cross-fetch": "^3.1.5", - "eslint": "^8.36.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^27.2.1", - "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-n": "^15.6.1", - "eslint-plugin-promise": "^6.1.1", "jest": "^29.6.2", "nock": "^13.3.0", "ts-jest": "^29.1.0", @@ -716,18 +710,125 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "node_modules/@biomejs/biome": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.4.1.tgz", + "integrity": "sha512-JccVAwPbhi37pdxbAGmaOBjUTKEwEjWAhl7rKkVVuXHo4MLASXJ5HR8BTgrImi4/7rTBsGz1tgVD1Kwv1CHGRg==", "dev": true, - "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.4.1", + "@biomejs/cli-darwin-x64": "1.4.1", + "@biomejs/cli-linux-arm64": "1.4.1", + "@biomejs/cli-linux-x64": "1.4.1", + "@biomejs/cli-win32-arm64": "1.4.1", + "@biomejs/cli-win32-x64": "1.4.1" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-PZWy2Idndqux38p6AXSDQM2ldRAWi32bvb7bMbTN0ALzpWYMYnxd71ornatumSSJYoNhKmxzDLq+jct7nZJ79w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.4.1.tgz", + "integrity": "sha512-soj3BWhnsM1M2JlzR09cibUzG1owJqetwj/Oo7yg0foijo9lNH9XWXZfJBYDKgW/6Fomn+CC2EcUS+hisQzt9g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.4.1.tgz", + "integrity": "sha512-YIZqfJUg4F+fPsBTXxgD7EU2E5OAYbmYSl/snf4PevwfQCWE/omOFZv+NnIQmjYj9I7ParDgcJvanoA3/kO0JQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.4.1.tgz", + "integrity": "sha512-9YOZw3qBd/KUj63A6Hn2zZgzGb2nbESM0qNmeMXgmqinVKM//uc4OgY5TuKITuGjMSvcVxxd4dX1IzYjV9qvNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.4.1.tgz", + "integrity": "sha512-nWQbvkNKxYn/kCQ0yVF8kCaS3VzaGvtFSmItXiMknU4521LDjJ7tNWH12Gol+pIslrCbd4E1LhJa0a3ThRsBVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.4.1.tgz", + "integrity": "sha512-88fR2CQxQ4YLs2BUDuywWYQpUKgU3A3sTezANFc/4LGKQFFLV2yX+F7QAdZVkMHfA+RD9Xg178HomM/6mnTNPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16" + "node": ">=14.*" } }, "node_modules/@eslint-community/eslint-utils": { @@ -759,6 +860,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -782,6 +884,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", "dev": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -791,6 +894,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, + "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -805,6 +909,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "peer": true, "engines": { "node": ">=12.22" }, @@ -817,7 +922,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -1401,12 +1507,6 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/node": { "version": "18.15.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz", @@ -1634,6 +1734,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1646,6 +1747,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1655,6 +1757,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1730,52 +1833,12 @@ "node": ">= 8" } }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "peer": true }, "node_modules/array-union": { "version": "2.1.0", @@ -1786,54 +1849,6 @@ "node": ">=8" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-jest": { "version": "29.6.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", @@ -2008,40 +2023,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2170,27 +2151,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2255,7 +2221,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -2266,22 +2233,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2317,6 +2268,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -2357,94 +2309,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2459,6 +2323,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2471,6 +2336,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", @@ -2523,349 +2389,65 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "node": ">=8.0.0" } }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, + "peer": true, "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "peer": true, + "engines": { + "node": ">=4.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "node_modules/espree": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, + "peer": true, "dependencies": { - "debug": "^3.2.7" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "27.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", - "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", - "dev": true, - "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.1", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", - "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2889,6 +2471,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -2901,6 +2484,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -2940,6 +2524,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -2997,7 +2582,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/fast-glob": { "version": "3.2.12", @@ -3037,7 +2623,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/fastq": { "version": "1.15.0", @@ -3062,6 +2649,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -3086,6 +2674,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3102,6 +2691,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, + "peer": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -3114,16 +2704,8 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } + "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -3151,33 +2733,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3196,20 +2751,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3231,22 +2772,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3272,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -3284,6 +2810,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -3294,21 +2821,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3329,18 +2841,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3365,15 +2865,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3383,57 +2874,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3463,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3518,95 +2959,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -3619,21 +2977,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3646,177 +2989,62 @@ "node_modules/is-fullwidth-code-point": { "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.12.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { @@ -4460,6 +3688,7 @@ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -4476,6 +3705,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -4483,15 +3713,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4514,13 +3735,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -4563,6 +3786,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4582,6 +3806,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -4608,7 +3833,8 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lru-cache": { "version": "5.1.1", @@ -4698,15 +3924,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4793,73 +4010,6 @@ "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4889,6 +4039,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -4921,6 +4072,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -4945,6 +4097,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -5108,6 +4261,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -5165,6 +4319,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -5211,35 +4366,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5292,6 +4418,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -5320,6 +4447,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -5353,20 +4481,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -5421,20 +4535,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -5475,28 +4575,6 @@ "source-map": "^0.6.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5551,51 +4629,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5680,7 +4713,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/tmpl": { "version": "1.0.5", @@ -5758,39 +4792,6 @@ } } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -5817,6 +4818,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5838,6 +4840,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -5845,20 +4848,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", @@ -5872,21 +4861,6 @@ "node": ">=12.20" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -5918,6 +4892,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -5982,47 +4957,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/word-wrap": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } diff --git a/package.json b/package.json index d1ce61b..3bb36b6 100644 --- a/package.json +++ b/package.json @@ -15,20 +15,15 @@ }, "scripts": { "check": "tsc", - "lint": "eslint .", + "format": "biome format . --write", + "lint": "biome lint .", "test": "jest" }, "devDependencies": { + "@biomejs/biome": "^1.4.1", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^5.56.0", "cross-fetch": "^3.1.5", - "eslint": "^8.36.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^27.2.1", - "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-n": "^15.6.1", - "eslint-plugin-promise": "^6.1.1", "jest": "^29.6.2", "nock": "^13.3.0", "ts-jest": "^29.1.0",