diff --git a/.changeset/brave-islands-search.md b/.changeset/brave-islands-search.md new file mode 100644 index 000000000..7e988d279 --- /dev/null +++ b/.changeset/brave-islands-search.md @@ -0,0 +1,5 @@ +--- +'@openfn/cli': minor +--- + +Support aliases on all project subcommands diff --git a/.changeset/tiny-forks-brake.md b/.changeset/tiny-forks-brake.md new file mode 100644 index 000000000..9d028192e --- /dev/null +++ b/.changeset/tiny-forks-brake.md @@ -0,0 +1,5 @@ +--- +'@openfn/cli': minor +--- + +Auto-load collections adptor when using collections diff --git a/.changeset/wicked-plants-push.md b/.changeset/wicked-plants-push.md new file mode 100644 index 000000000..a2ef97802 --- /dev/null +++ b/.changeset/wicked-plants-push.md @@ -0,0 +1,5 @@ +--- +'@openfn/lightning-mock': minor +--- + +Add basic collections support (GET only) diff --git a/integration-tests/cli/test/execute-workflow.test.ts b/integration-tests/cli/test/execute-workflow.test.ts index 6f7af1fb3..5d5adacbc 100644 --- a/integration-tests/cli/test/execute-workflow.test.ts +++ b/integration-tests/cli/test/execute-workflow.test.ts @@ -1,9 +1,24 @@ import test from 'ava'; import { rm, mkdir } from 'node:fs/promises'; import path from 'node:path'; + +import createLightningServer from '@openfn/lightning-mock'; + import run from '../src/run'; import { getJSON } from '../src/util'; +// set up a lightning mock +let server: any; + +const port = 8968; + +test.before(async () => { + server = await createLightningServer({ port }); + server.collections.createCollection('stuff'); + // Important: the collection value MUST be as string + server.collections.upsert('stuff', 'x', JSON.stringify({ id: 'x' })); +}); + const jobsPath = path.resolve('test/fixtures'); // Note that these tests are STATEFUL @@ -151,7 +166,6 @@ test.serial( `openfn ${jobsPath}/wf-creds.json --credentials ${jobsPath}/creds.json`, async (t) => { const { err, stdout, stderr } = await run(t.title); - console.log({ stdout, stderr }); t.falsy(err); const out = getJSON(); @@ -285,3 +299,16 @@ test.serial( }); } ); + +// collections basic test +test.serial( + `openfn ${jobsPath}/collections.json --endpoint http://localhost:${port} --api-key xyz`, + async (t) => { + const { err } = await run(t.title); + t.falsy(err); + + const out = getJSON(); + + t.deepEqual(out.data, { id: 'x' }); + } +); diff --git a/integration-tests/cli/test/fixtures/collections.json b/integration-tests/cli/test/fixtures/collections.json new file mode 100644 index 000000000..a0a3692f1 --- /dev/null +++ b/integration-tests/cli/test/fixtures/collections.json @@ -0,0 +1,10 @@ +{ + "workflow": { + "steps": [ + { + "adaptor": "common", + "expression": "collections.get('stuff', 'x')" + } + ] + } +} diff --git a/packages/cli/src/collections/command.ts b/packages/cli/src/collections/command.ts index 4d872c1a8..4dd518ad0 100644 --- a/packages/cli/src/collections/command.ts +++ b/packages/cli/src/collections/command.ts @@ -88,14 +88,6 @@ const key = { }, }; -const token = { - name: 'pat', - yargs: { - alias: ['token'], - description: 'Lightning Personal Access Token (PAT)', - }, -}; - const endpoint = { name: 'endpoint', yargs: { @@ -160,7 +152,7 @@ const updatedAfter = { const getOptions = [ collectionName, key, - token, + o.apiKey, endpoint, pageSize, limit, @@ -201,7 +193,7 @@ const dryRun = { const removeOptions = [ collectionName, key, - token, + o.apiKey, endpoint, dryRun, @@ -243,7 +235,7 @@ const setOptions = [ override(key as any, { demand: false, }), - token, + o.apiKey, endpoint, value, items, diff --git a/packages/cli/src/execute/command.ts b/packages/cli/src/execute/command.ts index baa09401b..71cdc65cd 100644 --- a/packages/cli/src/execute/command.ts +++ b/packages/cli/src/execute/command.ts @@ -1,5 +1,5 @@ import yargs from 'yargs'; -import { build, ensure } from '../util/command-builders'; +import { build, ensure, override } from '../util/command-builders'; import * as o from '../options'; import type { Opts } from '../options'; @@ -7,6 +7,7 @@ import type { Opts } from '../options'; export type ExecuteOptions = Required< Pick< Opts, + | 'apiKey' | 'adaptors' | 'autoinstall' | 'baseDir' @@ -14,6 +15,8 @@ export type ExecuteOptions = Required< | 'command' | 'compile' | 'credentials' + | 'collectionsEndpoint' + | 'collectionsVersion' | 'expandAdaptors' | 'end' | 'immutable' @@ -44,10 +47,16 @@ const options = [ o.expandAdaptors, // order is important o.adaptors, + override(o.apiKey, { + description: 'API token for collections', + alias: ['collections-api-key', 'collections-token', 'pat'], + }), o.autoinstall, o.cacheSteps, o.compile, o.credentials, + o.collectionsEndpoint, + o.collectionsVersion, o.end, o.ignoreImports, o.immutable, diff --git a/packages/cli/src/options.ts b/packages/cli/src/options.ts index 901d8940f..0d050644e 100644 --- a/packages/cli/src/options.ts +++ b/packages/cli/src/options.ts @@ -31,6 +31,8 @@ export type Opts = { configPath?: string; confirm?: boolean; credentials?: string; + collectionsEndpoint?: string; + collectionsVersion?: string; describe?: string; end?: string; // workflow end node expandAdaptors?: boolean; // for unit tests really @@ -136,12 +138,17 @@ export const autoinstall: CLIOption = { }, }; -export const apikey: CLIOption = { +export const apiKey: CLIOption = { name: 'apikey', yargs: { - alias: ['key', 'pat', 'token'], + alias: ['pat', 'token', 'api-key'], description: - '[beta only] API Key, Personal Access Token (Pat), or other access token', + 'API Key, Personal Access Token (PAT), or other access token from Lightning', + }, + ensure: (opts: any) => { + if (!opts.apikey) { + opts.apiKey = process.env.OPENFN_API_KEY; + } }, }; @@ -240,6 +247,23 @@ export const configPath: CLIOption = { }, }; +export const collectionsVersion: CLIOption = { + name: 'collections-version', + yargs: { + description: + 'The version of the collections adaptor to use. Defaults to latest. Use OPENFN_COLLECTIONS_VERSION env.', + }, +}; + +export const collectionsEndpoint: CLIOption = { + name: 'collections-endpoint', + yargs: { + alias: ['endpoint'], + description: + 'The Lightning server to use for collections. Will use the project endpoint if available. Use OPENFN_COLLECTIONS_ENDPOINT env.', + }, +}; + export const credentials: CLIOption = { name: 'credentials', yargs: { diff --git a/packages/cli/src/projects/fetch.ts b/packages/cli/src/projects/fetch.ts index a5daa7b38..6358a2602 100644 --- a/packages/cli/src/projects/fetch.ts +++ b/packages/cli/src/projects/fetch.ts @@ -35,7 +35,7 @@ export type FetchOptions = Pick< const options = [ po.alias, - o.apikey, + o.apiKey, o.endpoint, o.log, o.logJson, diff --git a/packages/cli/src/projects/pull.ts b/packages/cli/src/projects/pull.ts index fd0decbdc..12bf8e6d8 100644 --- a/packages/cli/src/projects/pull.ts +++ b/packages/cli/src/projects/pull.ts @@ -30,7 +30,7 @@ const options = [ o2.workspace, // general options - o.apikey, + o.apiKey, o.endpoint, o.log, override(o.path, { diff --git a/packages/cli/src/pull/command.ts b/packages/cli/src/pull/command.ts index 3a7e6cc99..ba6dd6620 100644 --- a/packages/cli/src/pull/command.ts +++ b/packages/cli/src/pull/command.ts @@ -21,7 +21,7 @@ export type PullOptions = Required< >; const options = [ - o.apikey, + o.apiKey, o.beta, o.configPath, o.endpoint, diff --git a/packages/cli/src/util/load-plan.ts b/packages/cli/src/util/load-plan.ts index ff7137f2c..00dba22db 100644 --- a/packages/cli/src/util/load-plan.ts +++ b/packages/cli/src/util/load-plan.ts @@ -331,11 +331,70 @@ const ensureAdaptors = (plan: CLIExecutionPlan) => { }); }; +type ensureCollectionsOptions = { + endpoint?: string; + version?: string; + apiKey?: string; +}; + +const ensureCollections = ( + plan: CLIExecutionPlan, + { + endpoint = 'https://app.openfn.org', + version = 'latest', + apiKey = 'null', + }: ensureCollectionsOptions = {}, + logger?: Logger +) => { + let collectionsFound = false; + + Object.values(plan.workflow.steps) + .filter((step) => (step as any).expression?.match(/(collections\.)/)) + .forEach((step) => { + const job = step as CLIJobNode; + if ( + !job.adaptors?.find((v: string) => + v.startsWith('@openfn/language-collections') + ) + ) { + collectionsFound = true; + job.adaptors ??= []; + job.adaptors.push( + `@openfn/language-collections@${version || 'latest'}` + ); + + job.configuration = Object.assign({}, job.configuration, { + collections_endpoint: `${endpoint}/collections`, + collections_token: apiKey, + }); + } + }); + + if (collectionsFound) { + if (!apiKey || apiKey === 'null') { + logger?.warn( + 'WARNING: collections API was not set. Pass --api-key or OPENFN_API_KEY' + ); + } + logger?.info( + `Configured collections to use endpoint ${endpoint} and API Key ending with ${apiKey?.substring( + apiKey.length - 10 + )}` + ); + } +}; + const loadXPlan = async ( plan: CLIExecutionPlan, options: Pick< Opts, - 'monorepoPath' | 'baseDir' | 'expandAdaptors' | 'globals' + | 'monorepoPath' + | 'baseDir' + | 'expandAdaptors' + | 'globals' + | 'collectionsVersion' + | 'collectionsEndpoint' + | 'apiKey' >, logger: Logger, defaultName: string = '' @@ -348,6 +407,15 @@ const loadXPlan = async ( plan.workflow.name = defaultName; } ensureAdaptors(plan); + ensureCollections( + plan, + { + version: options.collectionsVersion, + apiKey: options.apiKey, + endpoint: options.collectionsEndpoint, + }, + logger + ); // import global functions // if globals is provided via cli argument. it takes precedence diff --git a/packages/cli/test/util/load-plan.test.ts b/packages/cli/test/util/load-plan.test.ts index 190dbb118..6e50dde63 100644 --- a/packages/cli/test/util/load-plan.test.ts +++ b/packages/cli/test/util/load-plan.test.ts @@ -4,7 +4,11 @@ import { createMockLogger } from '@openfn/logger'; import type { Job } from '@openfn/lexicon'; import loadPlan from '../../src/util/load-plan'; -import { Opts } from '../../src/options'; +import { + collectionsEndpoint, + collectionsVersion, + Opts, +} from '../../src/options'; const logger = createMockLogger(undefined, { level: 'debug' }); @@ -28,6 +32,7 @@ const createPlan = (steps: Partial[] = []) => ({ test.beforeEach(() => { mock({ 'test/job.js': 'x', + 'test/collections.js': 'collections.get()', 'test/wf-old.json': JSON.stringify({ start: 'a', jobs: [{ id: 'a', expression: 'x()' }], @@ -114,6 +119,50 @@ test.serial('expression: set a start on the plan', async (t) => { t.is(plan.options.start, 'x'); }); +test.serial('expression: load the collections adaptor', async (t) => { + const opts = { + expressionPath: 'test/collections.js', + } as Partial; + + const plan = await loadPlan(opts as Opts, logger); + + t.deepEqual(plan.workflow.steps[0].adaptors, [ + '@openfn/language-collections@latest', + ]); +}); + +test.serial( + 'expression: load the collections adaptor with another', + async (t) => { + const opts = { + expressionPath: 'test/collections.js', + adaptors: ['@openfn/language-common@latest'], + } as Partial; + + const plan = await loadPlan(opts as Opts, logger); + + t.deepEqual(plan.workflow.steps[0].adaptors, [ + '@openfn/language-common@latest', + '@openfn/language-collections@latest', + ]); + } +); +test.serial( + 'expression: load the collections adaptor with a specific version', + async (t) => { + const opts = { + expressionPath: 'test/collections.js', + collectionsVersion: '1.1.1', + } as Partial; + + const plan = await loadPlan(opts as Opts, logger); + + t.deepEqual(plan.workflow.steps[0].adaptors, [ + '@openfn/language-collections@1.1.1', + ]); + } +); + test.serial('xplan: load a plan from workflow path', async (t) => { const opts = { workflowPath: 'test/wf.json', @@ -343,3 +392,40 @@ test.serial('xplan: support multiple adaptors', async (t) => { // @ts-ignore t.is(step.adaptor, undefined); }); + +test.serial('xplan: append collections', async (t) => { + const opts = { + workflowPath: 'test/wf.json', + collectionsVersion: '1.1.1', + collectionsEndpoint: 'https://localhost:4000/', + apiKey: 'abc', + }; + + const plan = createPlan([ + { + id: 'a', + expression: 'collections.get()', + adaptors: ['@openfn/language-common@1.0.0'], + }, + ]); + + mock({ + 'test/wf.json': JSON.stringify(plan), + }); + + const result = await loadPlan(opts, logger); + t.truthy(result); + + const step = result.workflow.steps[0] as Job; + t.deepEqual(step.adaptors, [ + '@openfn/language-common@1.0.0', + '@openfn/language-collections@1.1.1', + ]); + // @ts-ignore + t.is(step.adaptor, undefined); + + t.deepEqual(step.configuration, { + collections_endpoint: `${opts.collectionsEndpoint}/collections`, + collections_token: opts.apiKey, + }); +}); diff --git a/packages/lightning-mock/package.json b/packages/lightning-mock/package.json index 997fee8f8..b3ca3a38a 100644 --- a/packages/lightning-mock/package.json +++ b/packages/lightning-mock/package.json @@ -18,6 +18,7 @@ "dependencies": { "@koa/router": "^12.0.2", "@openfn/engine-multi": "workspace:*", + "@openfn/language-collections": "0.8.0", "@openfn/lexicon": "workspace:^", "@openfn/logger": "workspace:*", "@openfn/runtime": "workspace:*", diff --git a/packages/lightning-mock/src/api-rest.ts b/packages/lightning-mock/src/api-rest.ts index 4411d8d8a..19fe283b7 100644 --- a/packages/lightning-mock/src/api-rest.ts +++ b/packages/lightning-mock/src/api-rest.ts @@ -84,7 +84,7 @@ workflows: `; export default ( - _app: DevServer, + app: DevServer, state: ServerState, _logger: Logger, _api: any @@ -115,5 +115,33 @@ export default ( ctx.response.status = 200; }); + // list with query + router.get('/collections/:name', (ctx) => { + const { query, ...opts } = ctx.query; + try { + ctx.body = app.collections.fetch(ctx.params.name, query, opts); + } catch (e: any) { + if ((e.message = 'COLLECTION_NOT_FOUND')) { + ctx.status = 404; + } + } + }); + + // get by key + router.get('/collections/:name/:key', (ctx) => { + const { name, key } = ctx.params; + try { + const result = app.collections.byKey(name, key); + ctx.body = { + key, + value: result, + }; + } catch (e: any) { + if ((e.message = 'COLLECTION_NOT_FOUND')) { + ctx.status = 404; + } + } + }); + return router.routes() as unknown as Koa.Middleware; }; diff --git a/packages/lightning-mock/src/server.ts b/packages/lightning-mock/src/server.ts index 2706282f7..22b6568a7 100644 --- a/packages/lightning-mock/src/server.ts +++ b/packages/lightning-mock/src/server.ts @@ -7,6 +7,7 @@ import createLogger, { LogLevel, Logger, } from '@openfn/logger'; +import { collections } from '@openfn/language-collections'; import type { StepId } from '@openfn/lexicon'; import type { LightningPlan, @@ -53,6 +54,9 @@ export type ServerState = { options: LightningOptions; projects: Record; + + /** Mock collections API (imported from the adaptor) */ + collections: any; }; export type LightningOptions = { @@ -76,6 +80,7 @@ const createLightningServer = (options: LightningOptions = {}) => { const runPrivateKey = options.runPrivateKey ? fromBase64(options.runPrivateKey) : undefined; + const state = { credentials: {}, runs: {}, @@ -98,6 +103,8 @@ const createLightningServer = (options: LightningOptions = {}) => { app.state = state; + app.collections = collections.createMockAPI(); + const port = options.port || 8888; const server = app.listen(port); logger.info('Listening on ', port); diff --git a/packages/lightning-mock/src/types.ts b/packages/lightning-mock/src/types.ts index cf81abec9..389ed7c2d 100644 --- a/packages/lightning-mock/src/types.ts +++ b/packages/lightning-mock/src/types.ts @@ -37,4 +37,7 @@ export type DevServer = Koa & { reset(): void; startRun(id: string): any; waitForResult(runId: string): Promise; + + /** Collections API (from the adaptor) */ + collections: any; }; diff --git a/packages/lightning-mock/test/rest.test.ts b/packages/lightning-mock/test/rest.test.ts index 421d2e08b..cbe7da23c 100644 --- a/packages/lightning-mock/test/rest.test.ts +++ b/packages/lightning-mock/test/rest.test.ts @@ -51,3 +51,29 @@ test.serial('should deploy a project and fetch it back', async (t) => { t.is(proj.id, 'abc'); t.is(proj.name, 'my project'); }); + +test.serial('should fetch many items from a collection', async (t) => { + server.collections.createCollection('stuff'); + server.collections.upsert('stuff', 'x', { id: 'x' }); + + const response = await fetch(`${endpoint}/collections/stuff?query=*`); + const { items } = await response.json(); + t.is(items.length, 1); + t.deepEqual(items[0], { key: 'x', value: { id: 'x' } }); +}); + +test.serial('should fetch a single item from a collection', async (t) => { + server.collections.createCollection('stuff'); + server.collections.upsert('stuff', 'x', { id: 'x' }); + + const response = await fetch(`${endpoint}/collections/stuff/x`); + const result = await response.json(); + t.deepEqual(result, { key: 'x', value: { id: 'x' } }); +}); + +test.serial("should return 404 if a collection isn't found", async (t) => { + const response = await fetch(`${endpoint}/collections/nope/*`); + t.is(response.status, 404); +}); + +test.todo("should return 403 if a collection isn't authorized"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0400224f7..34a8e6953 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -479,7 +479,17 @@ importers: specifier: ^5.9.2 version: 5.9.2 - packages/engine-multi/tmp/repo: {} + packages/engine-multi/tmp/a/b/c: + dependencies: + ava: + specifier: ^6.4.1 + version: 6.4.1(encoding@0.1.13)(rollup@3.29.5) + + packages/engine-multi/tmp/repo: + dependencies: + ava: + specifier: ^6.4.1 + version: 6.4.1(encoding@0.1.13)(rollup@3.29.5) packages/lexicon: dependencies: @@ -499,6 +509,9 @@ importers: '@openfn/engine-multi': specifier: workspace:* version: link:../engine-multi + '@openfn/language-collections': + specifier: 0.8.0 + version: 0.8.0 '@openfn/lexicon': specifier: workspace:^ version: link:../lexicon @@ -1452,6 +1465,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1491,6 +1508,11 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@napi-rs/wasm-runtime@1.0.5': resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} @@ -1521,6 +1543,9 @@ packages: '@openfn/language-collections@0.6.2': resolution: {integrity: sha512-EyXuXvYGBmBXgF95snuxWCd+HgZsT57ghqzDUnhYC+qaUNe9p0aIlFdfA2tTokce04KWI8hc7HKnvm0yPd5H7A==} + '@openfn/language-collections@0.8.0': + resolution: {integrity: sha512-iTCNkKZDnWBE5b8Ca3zZJ7BlZRIxDPZM2BKBbWwsNqarDzQpDbANF5F63nTBTDgUYPsrzb4jeGWUG3I0Ej9cNQ==} + '@openfn/language-common@2.0.0-rc3': resolution: {integrity: sha512-7kwhBnCd1idyTB3MD9dXmUqROAhoaUIkz2AGDKuv9vn/cbZh7egEv9/PzKkRcDJYFV9qyyS+cVT3Xbgsg2ii5g==} bundledDependencies: [] @@ -1531,6 +1556,9 @@ packages: '@openfn/language-common@2.1.1': resolution: {integrity: sha512-qIUPjdx+AIM3LW3nXhFcfnhGlgaK5np8utQuzaOSb9FYJiR5hxMFfTl1o0CPkVtUdZ/UfcTFL66cNPuEbGWabA==} + '@openfn/language-common@3.2.1': + resolution: {integrity: sha512-SOTBmmLvtO1kkWw3imyviFpd5ZW8GOirql4mNCv23BthoRyiOC+o2RBzpCeNBL8cVJtWwS+51PEyIlG+UMRBsQ==} + '@openfn/language-http@6.4.3': resolution: {integrity: sha512-8ihgIYId+ewMuNU9hbe5JWEWvaJInDrIEiy4EyO7tbzu5t/f1kO18JIzQWm6r7dcHiMfcG2QaXe6O3br1xOrDA==} @@ -1834,6 +1862,15 @@ packages: peerDependencies: '@opentelemetry/api': ^1.8 + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@sentry/core@9.46.0': resolution: {integrity: sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==} engines: {node: '>=18'} @@ -1864,6 +1901,10 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 '@opentelemetry/semantic-conventions': ^1.34.0 + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + '@slack/logger@3.0.0': resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} @@ -2006,6 +2047,9 @@ packages: '@types/cookies@0.9.1': resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/express-serve-static-core@5.0.7': resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} @@ -2170,6 +2214,15 @@ packages: peerDependencies: typescript: '*' + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} + hasBin: true + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2277,6 +2330,9 @@ packages: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2300,6 +2356,16 @@ packages: '@ava/typescript': optional: true + ava@6.4.1: + resolution: {integrity: sha512-vxmPbi1gZx9zhAjHBgw81w/iEDKcrokeRk/fqDTyA2DQygZ0o+dUGRHFOtX8RA5N0heGJTTsIk7+xYxitDb61Q==} + engines: {node: ^18.18 || ^20.8 || ^22 || ^23 || >=24} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + awilix@10.0.2: resolution: {integrity: sha512-hFatb7eZFdtiWjjmGRSm/K/uxZpmcBlM+YoeMB3VpOPXk3xa6+7zctg3LRbUzoimom5bwGrePF0jXReO6b4zNQ==} engines: {node: '>=14.0.0'} @@ -2332,6 +2398,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -2412,6 +2481,10 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + cbor@10.0.11: + resolution: {integrity: sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==} + engines: {node: '>=20'} + cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} @@ -2452,6 +2525,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chunkd@2.0.1: resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} @@ -2459,6 +2536,10 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + ci-parallel-vars@1.0.1: resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} @@ -2489,6 +2570,10 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -2551,6 +2636,10 @@ packages: resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -2699,6 +2788,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -2759,6 +2852,9 @@ packages: resolution: {integrity: sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==} engines: {node: '>=14.16'} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3005,6 +3101,9 @@ packages: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -3073,6 +3172,13 @@ packages: resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} engines: {node: '>=14'} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3085,6 +3191,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3156,6 +3266,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3200,6 +3314,10 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3304,6 +3422,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -3444,6 +3566,10 @@ packages: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -3652,6 +3778,10 @@ packages: resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} engines: {node: '>=12.20'} + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -3691,6 +3821,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -3742,6 +3876,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -3805,6 +3943,10 @@ packages: encoding: optional: true + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + nodemon@3.0.1: resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} engines: {node: '>=10'} @@ -3814,6 +3956,11 @@ packages: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3928,6 +4075,10 @@ packages: resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} engines: {node: '>=12'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} @@ -3948,6 +4099,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-config@5.0.0: + resolution: {integrity: sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==} + engines: {node: '>=18'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3969,6 +4124,10 @@ packages: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} @@ -4025,6 +4184,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} @@ -4052,6 +4215,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4154,6 +4321,10 @@ packages: resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} engines: {node: '>=14.16'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4397,6 +4568,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -4482,6 +4657,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4541,6 +4720,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} @@ -4722,6 +4905,14 @@ packages: resolution: {integrity: sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==} engines: {node: '>=20.18.1'} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4810,6 +5001,10 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@6.0.0: + resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} + engines: {node: ^18.17.0 || >=20.5.0} + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -4833,6 +5028,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -5421,6 +5620,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5474,6 +5677,19 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.3(encoding@0.1.13)': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.5.2 + transitivePeerDependencies: + - encoding + - supports-color + '@napi-rs/wasm-runtime@1.0.5': dependencies: '@emnapi/core': 1.5.0 @@ -5515,6 +5731,12 @@ snapshots: stream-json: 1.9.1 undici: 5.29.0 + '@openfn/language-collections@0.8.0': + dependencies: + '@openfn/language-common': 3.2.1 + stream-json: 1.9.1 + undici: 5.29.0 + '@openfn/language-common@2.0.0-rc3': {} '@openfn/language-common@2.0.1': @@ -5539,6 +5761,17 @@ snapshots: lodash: 4.17.21 undici: 5.29.0 + '@openfn/language-common@3.2.1': + dependencies: + ajv: 8.17.1 + csv-parse: 5.6.0 + csvtojson: 2.0.10 + date-fns: 2.30.0 + http-status-codes: 2.3.0 + jsonpath-plus: 10.3.0 + lodash: 4.17.21 + undici: 7.16.0 + '@openfn/language-http@6.4.3': dependencies: '@openfn/language-common': 2.0.1 @@ -5856,6 +6089,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@rollup/pluginutils@5.3.0(rollup@3.29.5)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 3.29.5 + '@sentry/core@9.46.0': {} '@sentry/node-core@9.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': @@ -5920,6 +6161,8 @@ snapshots: '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 9.46.0 + '@sindresorhus/merge-streams@2.3.0': {} + '@slack/logger@3.0.0': dependencies: '@types/node': 24.5.2 @@ -6059,6 +6302,8 @@ snapshots: '@types/keygrip': 1.0.6 '@types/node': 18.19.127 + '@types/estree@1.0.8': {} + '@types/express-serve-static-core@5.0.7': dependencies: '@types/node': 18.19.127 @@ -6258,6 +6503,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@3.29.5)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3(encoding@0.1.13) + '@rollup/pluginutils': 5.3.0(rollup@3.29.5) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + abbrev@3.0.1: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -6347,6 +6613,8 @@ snapshots: dependencies: tslib: 2.8.1 + async-sema@3.1.1: {} + asynckit@0.4.0: {} ava@5.1.0: @@ -6447,6 +6715,53 @@ snapshots: transitivePeerDependencies: - supports-color + ava@6.4.1(encoding@0.1.13)(rollup@3.29.5): + dependencies: + '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@3.29.5) + acorn: 8.15.0 + acorn-walk: 8.3.4 + ansi-styles: 6.2.3 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.2.0 + cbor: 10.0.11 + chalk: 5.6.2 + chunkd: 2.0.1 + ci-info: 4.3.1 + ci-parallel-vars: 1.0.1 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.4.3 + emittery: 1.2.0 + figures: 6.1.0 + globby: 14.1.0 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + memoize: 10.2.0 + ms: 2.1.3 + p-map: 7.0.4 + package-config: 5.0.0 + picomatch: 4.0.3 + plur: 5.1.0 + pretty-ms: 9.3.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.2 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 6.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + awilix@10.0.2: dependencies: camel-case: 4.1.2 @@ -6474,6 +6789,10 @@ snapshots: binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -6582,6 +6901,10 @@ snapshots: camelcase-css@2.0.1: {} + cbor@10.0.11: + dependencies: + nofilter: 3.1.0 + cbor@8.1.0: dependencies: nofilter: 3.1.0 @@ -6638,10 +6961,14 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chunkd@2.0.1: {} ci-info@3.9.0: {} + ci-info@4.3.1: {} + ci-parallel-vars@1.0.1: {} cjs-module-lexer@1.4.3: {} @@ -6665,6 +6992,11 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cli-width@4.1.0: {} cliui@8.0.1: @@ -6726,6 +7058,8 @@ snapshots: semver: 7.7.2 well-known-symbols: 2.0.0 + consola@3.4.2: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -6851,6 +7185,8 @@ snapshots: detect-indent@6.1.0: {} + detect-libc@2.1.2: {} + didyoumean@1.2.2: {} diff@4.0.2: {} @@ -6910,6 +7246,8 @@ snapshots: emittery@1.2.0: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -7159,6 +7497,8 @@ snapshots: estraverse@4.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} etag@1.8.1: {} @@ -7262,6 +7602,12 @@ snapshots: escape-string-regexp: 5.0.0 is-unicode-supported: 1.3.0 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7280,6 +7626,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-up-simple@1.0.1: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -7349,6 +7697,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7425,6 +7775,15 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -7531,6 +7890,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -7634,6 +7995,8 @@ snapshots: is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} + is-utf8@0.2.1: {} is-windows@1.0.2: {} @@ -7866,6 +8229,10 @@ snapshots: map-age-cleaner: 0.1.3 mimic-fn: 4.0.0 + memoize@10.2.0: + dependencies: + mimic-function: 5.0.1 + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -7891,6 +8258,8 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + mini-svg-data-uri@1.4.4: {} minimatch@10.0.3: @@ -7942,6 +8311,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp@1.0.4: {} mock-fs@5.5.0: {} @@ -7983,6 +8356,8 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-gyp-build@4.8.4: {} + nodemon@3.0.1: dependencies: chokidar: 3.6.0 @@ -7998,6 +8373,10 @@ snapshots: nofilter@3.1.0: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@3.0.0: {} npm-package-arg@11.0.3: @@ -8139,6 +8518,8 @@ snapshots: dependencies: aggregate-error: 4.0.1 + p-map@7.0.4: {} + p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 @@ -8157,6 +8538,11 @@ snapshots: p-try@2.2.0: {} + package-config@5.0.0: + dependencies: + find-up-simple: 1.0.1 + load-json-file: 7.0.1 + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.11: @@ -8178,6 +8564,8 @@ snapshots: parse-ms@3.0.0: {} + parse-ms@4.0.0: {} + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -8226,6 +8614,8 @@ snapshots: path-type@4.0.0: {} + path-type@6.0.0: {} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 @@ -8252,6 +8642,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -8347,6 +8739,10 @@ snapshots: dependencies: parse-ms: 3.0.0 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + proc-log@4.2.0: {} process-nextick-args@2.0.1: {} @@ -8617,6 +9013,8 @@ snapshots: slash@4.0.0: {} + slash@5.1.0: {} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.3 @@ -8705,6 +9103,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -8800,6 +9204,14 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + temp-dir@3.0.0: {} term-size@2.2.1: {} @@ -9062,6 +9474,10 @@ snapshots: undici@7.12.0: {} + undici@7.16.0: {} + + unicorn-magic@0.3.0: {} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -9140,6 +9556,11 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + write-file-atomic@6.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@8.18.3: {} xtend@4.0.2: {} @@ -9148,6 +9569,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.8.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f749802d7..55e6aa971 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,15 +1,11 @@ -minimumReleaseAge: 4320 # 3 days packages: - # exclude the integration test repos - '!integration-tests/worker/dummy-repo/**' - '!integration-tests/worker/tmp/**' - '!integration-tests/cli/tmp/**' - '!integration-tests/cli/repo/**' - - # all packages in subdirs of packages/ and components/ - - 'packages/**' - - 'examples/**' - - 'integration-tests/**' - - # exclude packages that are inside test directories + - packages/** + - examples/** + - integration-tests/** - '!**/test/**' + +minimumReleaseAge: 1440