"
+ let who = 'unknown';
+ if ( actor.type instanceof UserActorType ) {
+ who = actor.type.user.username;
+ }
+ if ( actor.type instanceof AppUnderUserActorType ) {
+ who = actor.type.app.name
+ + ' on behalf of '
+ + actor.type.user.username;
+ }
+
+ res.send(`Hello, ${who}!`);
+});
+
+// Extensions can listen to events and manipulate Puter's behavior
+extension.on('core.email.validate', event => {
+ if ( event.email.includes('evil') ) {
+ event.allow = false;
+ }
+});
+```
+
+### Scope of `extension` and `use`
+
+It is important to know that the `extension` global is temporary and does not
+exist after your extension is loaded. If you wish to access the extension
+object within a callback you will need to first bind it to a variable in
+your extension's scope.
+
+```javascript
+const ext = extension;
+extension.on('some-event', () => {
+ // This would throw an error
+ // extension.something();
+
+ // This works
+ ext.example();
+})
+```
+
+The same is true for `use`. Calls to `use` should happen at the top of
+the file, just like imports in ES6.
+
+## Database Access
+
+A database access object is provided to the extension via `extension.db`.
+You **must** scope `extension` to another variable (`ext` in this example)
+in order to access `db` from callbacks.
+
+```javascript
+const ext = extension;
+
+extension.get('/user-count', { noauth: true, mw: [] }, (req, res) => {
+ const [count] = await ext.db.read(
+ 'SELECT COUNT(*) as c FROM `user`'
+ );
+});
+```
+
+The database access object has the following methods:
+- `read(query, params)` - read from the database using a prepared statement. If read-replicas are enabled, this will use a replica.
+- `write(query, params)` - write to the database using a prepared statement. If read-replicas are enabled, this will write to the primary.
+- `pread(query, params)` - read from the database using a prepared statement. If read-replicas are enabled, this will read from the primary.
+- `requireRead(query, params)` - read from the database using a prepared statement. If read-replicas are enabled, this will try reading from the replica first. If there are no results, a second attempt will be made on the primary.
+
+## Events
+
+See [events.md](./events.md)
+
+## Definitions
+
+See [definitions.md](./definitions.md)
diff --git a/doc/contributors/extensions/definitions.md b/doc/contributors/extensions/definitions.md
new file mode 100644
index 0000000000..94e7ab160e
--- /dev/null
+++ b/doc/contributors/extensions/definitions.md
@@ -0,0 +1,14 @@
+## Definitions
+
+### `core.config` - Configuration
+
+Puter's configuration object. This includes values from `config.json` or their
+defaults, and computed values like `origin` and `api_origin`.
+
+```javascript
+const config = use('core.config');
+
+extension.get('/get-origin', { noauth: true }, (req, res) => {
+ res.send(config.origin);
+})
+```
\ No newline at end of file
diff --git a/doc/contributors/extensions/events.json.js b/doc/contributors/extensions/events.json.js
new file mode 100644
index 0000000000..502016800b
--- /dev/null
+++ b/doc/contributors/extensions/events.json.js
@@ -0,0 +1,816 @@
+export default [
+ {
+ properties: {
+ completionId: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'completionId',
+ notes: [],
+ },
+ allow: {
+ type: 'boolean',
+ mutability: 'mutable',
+ summary: 'whether the operation is allowed',
+ notes: [],
+ },
+ intended_service: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'intended service',
+ notes: [],
+ },
+ parameters: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'parameters',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'ai.prompt.complete',
+ description: `
+ This event is emitted for ai prompt complete operations.
+ `,
+ properties: {
+ intended_service: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'intended service',
+ notes: [],
+ },
+ parameters: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'parameters',
+ notes: [],
+ },
+ result: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'result',
+ notes: [],
+ },
+ model_used: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'model used',
+ notes: [],
+ },
+ service_used: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'service used',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'ai.prompt.cost-calculated',
+ description: `
+ This event is emitted for ai prompt cost calculated operations.
+ `,
+ },
+ {
+ id: 'ai.prompt.validate',
+ description: `
+ This event is emitted when a validate is being validated.
+ The event can be used to block certain validates from being validated.
+ `,
+ properties: {
+ completionId: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'completionId',
+ notes: [],
+ },
+ allow: {
+ type: 'boolean',
+ mutability: 'mutable',
+ summary: 'whether the operation is allowed',
+ notes: [
+ 'If set to false, the ai will be considered invalid.',
+ ],
+ },
+ intended_service: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'intended service',
+ notes: [],
+ },
+ parameters: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'parameters',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'app.new-icon',
+ description: `
+ This event is emitted for app new icon operations.
+ `,
+ properties: {
+ data_url: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'data url',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'app.rename',
+ description: `
+ This event is emitted for app rename operations.
+ `,
+ properties: {
+ data_url: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'data url',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'apps.invalidate',
+ description: `
+ This event is emitted when a invalidate is being validated.
+ The event can be used to block certain invalidates from being validated.
+ `,
+ properties: {
+ apps: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'apps',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'captcha.check',
+ description: `
+ This event is emitted for captcha check operations.
+ `,
+ properties: {
+ required: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'required',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'core.email.validate',
+ description: `
+ This event is emitted when an email is being validated.
+ The event can be used to block certain emails from being validated.
+ `,
+ properties: {
+ email: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'the email being validated',
+ notes: [
+ 'The email may have already been cleaned.',
+ ],
+ },
+ allow: {
+ type: 'boolean',
+ mutability: 'mutable',
+ summary: 'whether the email is allowed',
+ notes: [
+ 'If set to false, the email will be considered invalid.',
+ ],
+ },
+ },
+ },
+ {
+ id: 'core.fs.create.directory',
+ description: `
+ This event is emitted when a directory is created.
+ `,
+ properties: {
+ node: {
+ type: 'FSNodeContext',
+ mutability: 'no-effect',
+ summary: 'the directory that was created',
+ },
+ context: {
+ type: 'Context',
+ mutability: 'no-effect',
+ summary: 'current context',
+ },
+ },
+ },
+ {
+ id: 'core.request.measured',
+ description: `
+ This event is emitted when a requests incoming and outgoing bytes
+ have been measured.
+ `,
+ example: {
+ language: 'javascript',
+ code: /*javascript*/`
+ extension.on('core.request.measured', data => {
+ const measurements = data.measurements;
+ // measurements = { sz_incoming: integer, sz_outgoing: integer }
+
+ const actor = data.actor; // instance of Actor
+
+ console.log('\x1B[36;1m === MEASUREMENT ===\x1B[0m\n', {
+ actor: data.actor.uid,
+ measurements: data.measurements
+ });
+ });
+ `,
+ },
+ },
+ {
+ id: 'credit.check-available',
+ description: `
+ This event is emitted for credit check available operations.
+ `,
+ properties: {
+ available: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'available',
+ notes: [],
+ },
+ cost_uuid: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'cost uuid',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'credit.funding-update',
+ description: `
+ This event is emitted when a funding-update is updated.
+ `,
+ properties: {
+ available: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'available',
+ notes: [],
+ },
+ cost_uuid: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'cost uuid',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'credit.record-cost',
+ description: `
+ This event is emitted for credit record cost operations.
+ `,
+ properties: {
+ available: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'available',
+ notes: [],
+ },
+ cost_uuid: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'cost uuid',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'driver.create-call-context',
+ description: `
+ This event is emitted when a create-call-context is created.
+ `,
+ properties: {
+ usages: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'usages',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'email.validate',
+ description: `
+ This event is emitted when a validate is being validated.
+ The event can be used to block certain validates from being validated.
+ `,
+ properties: {
+ allow: {
+ type: 'boolean',
+ mutability: 'mutable',
+ summary: 'whether the operation is allowed',
+ notes: [
+ 'If set to false, the email will be considered invalid.',
+ ],
+ },
+ email: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'email',
+ notes: [
+ 'The email may have already been cleaned.',
+ ],
+ },
+ },
+ },
+ {
+ id: 'fs.create.directory',
+ description: `
+ This event is emitted when a directory is created.
+ `,
+ },
+ {
+ id: 'fs.create.file',
+ description: `
+ This event is emitted when a file is created.
+ `,
+ properties: {
+ context: {
+ type: 'Context',
+ mutability: 'no-effect',
+ summary: 'current context',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'fs.create.shortcut',
+ description: `
+ This event is emitted when a shortcut is created.
+ `,
+ },
+ {
+ id: 'fs.create.symlink',
+ description: `
+ This event is emitted when a symlink is created.
+ `,
+ },
+ {
+ id: 'fs.move.file',
+ description: `
+ This event is emitted for fs move file operations.
+ `,
+ properties: {
+ moved: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'moved',
+ notes: [],
+ },
+ old_path: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'path to the affected resource',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'fs.pending.file',
+ description: `
+ This event is emitted for fs pending file operations.
+ `,
+ },
+ {
+ id: 'fs.storage.progress.copy',
+ description: `
+ This event reports progress of a copy operation.
+ `,
+ properties: {
+ context: {
+ type: 'Context',
+ mutability: 'no-effect',
+ summary: 'current context',
+ notes: [],
+ },
+ meta: {
+ type: 'object',
+ mutability: 'no-effect',
+ summary: 'additional metadata for the operation',
+ notes: [],
+ },
+ item_path: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'path to the affected resource',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'fs.storage.upload-progress',
+ description: `
+ This event reports progress of a upload-progress operation.
+ `,
+ },
+ {
+ id: 'fs.write.file',
+ description: `
+ This event is emitted when a file is updated.
+ `,
+ properties: {
+ context: {
+ type: 'Context',
+ mutability: 'no-effect',
+ summary: 'current context',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'ip.validate',
+ description: `
+ This event is emitted when a validate is being validated.
+ The event can be used to block certain validates from being validated.
+ `,
+ properties: {
+ res: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'res',
+ notes: [],
+ },
+ end_: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'end ',
+ notes: [],
+ },
+ end: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'end',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.fs.write-hash',
+ description: `
+ This event is emitted when a write-hash is updated.
+ `,
+ properties: {
+ uuid: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'uuid',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.item.added',
+ description: `
+ This event is emitted for outer gui item added operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.item.moved',
+ description: `
+ This event is emitted for outer gui item moved operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.item.pending',
+ description: `
+ This event is emitted for outer gui item pending operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.item.updated',
+ description: `
+ This event is emitted when a updated is updated.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.notif.ack',
+ description: `
+ This event is emitted for outer gui notif ack operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.notif.message',
+ description: `
+ This event is emitted for outer gui notif message operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ notification: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'notification',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.notif.persisted',
+ description: `
+ This event is emitted for outer gui notif persisted operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.notif.unreads',
+ description: `
+ This event is emitted for outer gui notif unreads operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.submission.done',
+ description: `
+ This event is emitted for outer gui submission done operations.
+ `,
+ properties: {
+ response: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'response',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'outer.gui.usage.update',
+ description: `
+ This event is emitted when a update is updated.
+ `,
+ },
+ {
+ id: 'outer.thread.notify-subscribers',
+ description: `
+ This event is emitted for outer thread notify subscribers operations.
+ `,
+ properties: {
+ uid: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'uid',
+ notes: [],
+ },
+ action: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'action',
+ notes: [],
+ },
+ data: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'data',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'puter.signup',
+ description: `
+ This event is emitted for puter signup operations.
+ `,
+ properties: {
+ ip: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'ip',
+ notes: [],
+ },
+ user_agent: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'user agent',
+ notes: [],
+ },
+ body: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'body',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'request.measured',
+ description: `
+ This event is emitted for request measured operations.
+ `,
+ properties: {
+ req: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'req',
+ notes: [],
+ },
+ res: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'res',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'request.will-be-handled',
+ description: `
+ This event is emitted for request will be handled operations.
+ `,
+ properties: {
+ res: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'res',
+ notes: [],
+ },
+ end_: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'end ',
+ notes: [],
+ },
+ end: {
+ type: 'any',
+ mutability: 'mutable',
+ summary: 'end',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'template-service.hello',
+ description: `
+ This event is emitted for template-service hello operations.
+ `,
+ },
+ {
+ id: 'usages.query',
+ description: `
+ This event is emitted for usages query operations.
+ `,
+ properties: {
+ usages: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'usages',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'user.email-changed',
+ description: `
+ This event is emitted for user email changed operations.
+ `,
+ properties: {
+ new_email: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'new email',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'user.email-confirmed',
+ description: `
+ This event is emitted for user email confirmed operations.
+ `,
+ properties: {
+ email: {
+ type: 'any',
+ mutability: 'no-effect',
+ summary: 'email',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'user.save_account',
+ description: `
+ This event is emitted for user save_account operations.
+ `,
+ properties: {
+ user: {
+ type: 'User',
+ mutability: 'no-effect',
+ summary: 'user associated with the operation',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'web.socket.connected',
+ description: `
+ This event is emitted for web socket connected operations.
+ `,
+ properties: {
+ user: {
+ type: 'User',
+ mutability: 'mutable',
+ summary: 'user associated with the operation',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'web.socket.user-connected',
+ description: `
+ This event is emitted for web socket user connected operations.
+ `,
+ properties: {
+ user: {
+ type: 'User',
+ mutability: 'mutable',
+ summary: 'user associated with the operation',
+ notes: [],
+ },
+ },
+ },
+ {
+ id: 'wisp.get-policy',
+ description: `
+ This event is emitted for wisp get policy operations.
+ `,
+ properties: {
+ policy: {
+ type: 'Policy',
+ mutability: 'mutable',
+ summary: 'policy information for the operation',
+ notes: [],
+ },
+ },
+ },
+];
diff --git a/doc/contributors/extensions/events.md b/doc/contributors/extensions/events.md
new file mode 100644
index 0000000000..40c1cbd701
--- /dev/null
+++ b/doc/contributors/extensions/events.md
@@ -0,0 +1,761 @@
+#### Property `completionId`
+
+completionId
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `allow`
+
+whether the operation is allowed
+- **Type**: boolean
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `intended_service`
+
+intended service
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `parameters`
+
+parameters
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `ai.prompt.complete`
+
+This event is emitted for ai prompt complete operations.
+
+#### Property `intended_service`
+
+intended service
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `parameters`
+
+parameters
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `result`
+
+result
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `model_used`
+
+model used
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `service_used`
+
+service used
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `ai.prompt.cost-calculated`
+
+This event is emitted for ai prompt cost calculated operations.
+
+
+### `ai.prompt.validate`
+
+This event is emitted when a validate is being validated.
+The event can be used to block certain validates from being validated.
+
+#### Property `completionId`
+
+completionId
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `allow`
+
+whether the operation is allowed
+- **Type**: boolean
+- **Mutability**: mutable
+- **Notes**:
+ - If set to false, the ai will be considered invalid.
+
+#### Property `intended_service`
+
+intended service
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `parameters`
+
+parameters
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `app.new-icon`
+
+This event is emitted for app new icon operations.
+
+#### Property `data_url`
+
+data url
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `app.rename`
+
+This event is emitted for app rename operations.
+
+#### Property `data_url`
+
+data url
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `apps.invalidate`
+
+This event is emitted when a invalidate is being validated.
+The event can be used to block certain invalidates from being validated.
+
+#### Property `apps`
+
+apps
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `captcha.check`
+
+This event is emitted for captcha check operations.
+
+#### Property `required`
+
+required
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `core.email.validate`
+
+This event is emitted when an email is being validated.
+The event can be used to block certain emails from being validated.
+
+#### Property `email`
+
+the email being validated
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+ - The email may have already been cleaned.
+
+#### Property `allow`
+
+whether the email is allowed
+- **Type**: boolean
+- **Mutability**: mutable
+- **Notes**:
+ - If set to false, the email will be considered invalid.
+
+
+### `core.fs.create.directory`
+
+This event is emitted when a directory is created.
+
+#### Property `node`
+
+the directory that was created
+- **Type**: FSNodeContext
+- **Mutability**: no-effect
+
+#### Property `context`
+
+current context
+- **Type**: Context
+- **Mutability**: no-effect
+
+
+### `core.request.measured`
+
+This event is emitted when a requests incoming and outgoing bytes
+have been measured.
+
+#### Example
+
+```javascript
+extension.on('core.request.measured', data => {
+ const measurements = data.measurements;
+ // measurements = { sz_incoming: integer, sz_outgoing: integer }
+
+ const actor = data.actor; // instance of Actor
+
+ console.log('[36;1m === MEASUREMENT ===[0m
+', {
+ actor: data.actor.uid,
+ measurements: data.measurements
+ });
+});
+```
+
+### `credit.check-available`
+
+This event is emitted for credit check available operations.
+
+#### Property `available`
+
+available
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `cost_uuid`
+
+cost uuid
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `credit.funding-update`
+
+This event is emitted when a funding-update is updated.
+
+#### Property `available`
+
+available
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `cost_uuid`
+
+cost uuid
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `credit.record-cost`
+
+This event is emitted for credit record cost operations.
+
+#### Property `available`
+
+available
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `cost_uuid`
+
+cost uuid
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `driver.create-call-context`
+
+This event is emitted when a create-call-context is created.
+
+#### Property `usages`
+
+usages
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `email.validate`
+
+This event is emitted when a validate is being validated.
+The event can be used to block certain validates from being validated.
+
+#### Property `allow`
+
+whether the operation is allowed
+- **Type**: boolean
+- **Mutability**: mutable
+- **Notes**:
+ - If set to false, the email will be considered invalid.
+
+#### Property `email`
+
+email
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+ - The email may have already been cleaned.
+
+
+### `fs.create.directory`
+
+This event is emitted when a directory is created.
+
+
+### `fs.create.file`
+
+This event is emitted when a file is created.
+
+#### Property `context`
+
+current context
+- **Type**: Context
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `fs.create.shortcut`
+
+This event is emitted when a shortcut is created.
+
+
+### `fs.create.symlink`
+
+This event is emitted when a symlink is created.
+
+
+### `fs.move.file`
+
+This event is emitted for fs move file operations.
+
+#### Property `moved`
+
+moved
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `old_path`
+
+path to the affected resource
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `fs.pending.file`
+
+This event is emitted for fs pending file operations.
+
+
+### `fs.storage.progress.copy`
+
+This event reports progress of a copy operation.
+
+#### Property `context`
+
+current context
+- **Type**: Context
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `meta`
+
+additional metadata for the operation
+- **Type**: object
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `item_path`
+
+path to the affected resource
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `fs.storage.upload-progress`
+
+This event reports progress of a upload-progress operation.
+
+
+### `fs.write.file`
+
+This event is emitted when a file is updated.
+
+#### Property `context`
+
+current context
+- **Type**: Context
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `ip.validate`
+
+This event is emitted when a validate is being validated.
+The event can be used to block certain validates from being validated.
+
+#### Property `res`
+
+res
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `end_`
+
+end
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `end`
+
+end
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `outer.fs.write-hash`
+
+This event is emitted when a write-hash is updated.
+
+#### Property `uuid`
+
+uuid
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.item.added`
+
+This event is emitted for outer gui item added operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.item.moved`
+
+This event is emitted for outer gui item moved operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.item.pending`
+
+This event is emitted for outer gui item pending operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.item.updated`
+
+This event is emitted when a updated is updated.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.notif.ack`
+
+This event is emitted for outer gui notif ack operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.notif.message`
+
+This event is emitted for outer gui notif message operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `notification`
+
+notification
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.notif.persisted`
+
+This event is emitted for outer gui notif persisted operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.notif.unreads`
+
+This event is emitted for outer gui notif unreads operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.submission.done`
+
+This event is emitted for outer gui submission done operations.
+
+#### Property `response`
+
+response
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `outer.gui.usage.update`
+
+This event is emitted when a update is updated.
+
+
+### `outer.thread.notify-subscribers`
+
+This event is emitted for outer thread notify subscribers operations.
+
+#### Property `uid`
+
+uid
+- **Type**: string
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `action`
+
+action
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `data`
+
+data
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `puter.signup`
+
+This event is emitted for puter signup operations.
+
+#### Property `ip`
+
+ip
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `user_agent`
+
+user agent
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `body`
+
+body
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `request.measured`
+
+This event is emitted for request measured operations.
+
+#### Property `req`
+
+req
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+#### Property `res`
+
+res
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `request.will-be-handled`
+
+This event is emitted for request will be handled operations.
+
+#### Property `res`
+
+res
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `end_`
+
+end
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+#### Property `end`
+
+end
+- **Type**: any
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `sns`
+
+This event is emitted for sns operations.
+
+#### Property `message`
+
+message
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `template-service.hello`
+
+This event is emitted for template-service hello operations.
+
+
+### `usages.query`
+
+This event is emitted for usages query operations.
+
+#### Property `usages`
+
+usages
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `user.email-changed`
+
+This event is emitted for user email changed operations.
+
+#### Property `new_email`
+
+new email
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `user.email-confirmed`
+
+This event is emitted for user email confirmed operations.
+
+#### Property `email`
+
+email
+- **Type**: any
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `user.save_account`
+
+This event is emitted for user save_account operations.
+
+#### Property `user`
+
+user associated with the operation
+- **Type**: User
+- **Mutability**: no-effect
+- **Notes**:
+
+
+### `web.socket.connected`
+
+This event is emitted for web socket connected operations.
+
+#### Property `user`
+
+user associated with the operation
+- **Type**: User
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `web.socket.user-connected`
+
+This event is emitted for web socket user connected operations.
+
+#### Property `user`
+
+user associated with the operation
+- **Type**: User
+- **Mutability**: mutable
+- **Notes**:
+
+
+### `wisp.get-policy`
+
+This event is emitted for wisp get policy operations.
+
+#### Property `policy`
+
+policy information for the operation
+- **Type**: Policy
+- **Mutability**: mutable
+- **Notes**:
+
+
diff --git a/doc/contributors/extensions/gen.js b/doc/contributors/extensions/gen.js
new file mode 100644
index 0000000000..d68f5e027d
--- /dev/null
+++ b/doc/contributors/extensions/gen.js
@@ -0,0 +1,38 @@
+import dedent from 'dedent';
+import events from './events.json.js';
+
+const mdlib = {};
+mdlib.h = (out, n, str) => {
+ out(`${'#'.repeat(n)} ${str}\n\n`);
+};
+
+const N_START = 3;
+
+const out = str => process.stdout.write(str);
+for ( const event of events ) {
+ mdlib.h(out, N_START, `\`${event.id}\``);
+ out(`${dedent(event.description) }\n\n`);
+
+ for ( const k in event.properties ) {
+ const prop = event.properties[k];
+ mdlib.h(out, N_START + 1, `Property \`${k}\``);
+ out(`${prop.summary }\n`);
+ out(`- **Type**: ${prop.type}\n`);
+ out(`- **Mutability**: ${prop.mutability}\n`);
+ if ( prop.notes ) {
+ out('- **Notes**:\n');
+ for ( const note of prop.notes ) {
+ out(` - ${note}\n`);
+ }
+ }
+ out('\n');
+ }
+
+ if ( event.example ) {
+ mdlib.h(out, N_START + 1, 'Example');
+ out(`\`\`\`${event.example.language}\n${dedent(event.example.code)}\n\`\`\`\n`);
+ }
+
+ out('\n');
+
+}
diff --git a/doc/contributors/extensions/manual_overrides.json.js b/doc/contributors/extensions/manual_overrides.json.js
new file mode 100644
index 0000000000..fedfca263c
--- /dev/null
+++ b/doc/contributors/extensions/manual_overrides.json.js
@@ -0,0 +1,68 @@
+export default [
+ {
+ id: 'core.email.validate',
+ description: `
+ This event is emitted when an email is being validated.
+ The event can be used to block certain emails from being validated.
+ `,
+ properties: {
+ email: {
+ type: 'string',
+ mutability: 'no-effect',
+ summary: 'the email being validated',
+ notes: [
+ 'The email may have already been cleaned.',
+ ],
+ },
+ allow: {
+ type: 'boolean',
+ mutability: 'mutable',
+ summary: 'whether the email is allowed',
+ notes: [
+ 'If set to false, the email will be considered invalid.',
+ ],
+ },
+ },
+ },
+ {
+ id: 'core.request.measured',
+ description: `
+ This event is emitted when a requests incoming and outgoing bytes
+ have been measured.
+ `,
+ example: {
+ language: 'javascript',
+ code: /*javascript*/`
+ extension.on('core.request.measured', data => {
+ const measurements = data.measurements;
+ // measurements = { sz_incoming: integer, sz_outgoing: integer }
+
+ const actor = data.actor; // instance of Actor
+
+ console.log('\\x1B[36;1m === MEASUREMENT ===\\x1B[0m\\n', {
+ actor: data.actor.uid,
+ measurements: data.measurements
+ });
+ });
+ `,
+ },
+ },
+ {
+ id: 'core.fs.create.directory',
+ description: `
+ This event is emitted when a directory is created.
+ `,
+ properties: {
+ node: {
+ type: 'FSNodeContext',
+ mutability: 'no-effect',
+ summary: 'the directory that was created',
+ },
+ context: {
+ type: 'Context',
+ mutability: 'no-effect',
+ summary: 'current context',
+ },
+ },
+ },
+];
\ No newline at end of file
diff --git a/doc/contributors/image.png b/doc/contributors/image.png
new file mode 100644
index 0000000000..2643d3e1cf
Binary files /dev/null and b/doc/contributors/image.png differ
diff --git a/doc/contributors/index.md b/doc/contributors/index.md
deleted file mode 100644
index 34d976f025..0000000000
--- a/doc/contributors/index.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Contributing to Puter
-
-## Essential / General Knowledge
-
-### Repository Dichotomy
-
-- Puter's GUI is at the root; `/src` is the GUI
-- Puter's backend is a workspace npm package;
- it resides in `packages/backend(/src)`
-
-The above may seem counter-intuitive; backend and frontend are siblings, right?
-Consider this: by a different intuition, the backend is at a "deeper" level
-of function; this directory structure better adheres to soon-to-be contributors
-sifting around through the files to discover "what's what".
-
-The directory `volatile` exists _for your convenience_ to simplify running
-Puter for development. When Puter is run
-run with the backend with this repository as its working directory, it
-will use `volatile/config` and `volatile/runtime` instead of
-`/etc/puter` and `/var/puter`.
-
-## See Next
-
-- [Backend Documentation](../../packages/backend/doc/contributors/index.md)
-
diff --git a/doc/contributors/structure.md b/doc/contributors/structure.md
new file mode 100644
index 0000000000..5e1444397f
--- /dev/null
+++ b/doc/contributors/structure.md
@@ -0,0 +1,64 @@
+# Repository Structure and Tooling
+
+Puter has many of its parts in a single [monorepo](https://en.wikipedia.org/wiki/Monorepo),
+rather than a single repository for each cohesive part.
+We feel this makes it easier for new contributors to develop Puter since you don't
+need to figure out how to tie the parts together or how to work with Git submodules.
+It also makes it easier for us to maintain project-wide conventions and tooling.
+
+Some tools, like [puter-cli](https://github.com/HeyPuter/puter-cli), exist in separate
+repositories. The `puter-cli` tool is used externally and can communicate with Puter's
+API on our production (puter.com) instance or your own instance of Puter, so there's
+not really any advantage to putting it in the monorepo.
+
+## Top-Level directories
+
+### The `doc` directory
+
+The top-level `doc` directory contains the file you're reading right now.
+Its scope is documentation for using and contributing to Puter in general,
+and linking to more specific documentation in other places.
+
+All `doc` directories will have a `README.md` which should be considered as
+the index file for the documentation. All documentation under a `doc`
+directory should be accessible via a path of links starting from `README.md`.
+
+### The `src` directory
+
+Every directory under `/tools` is [an npm "workspaces" module](https://docs.npmjs.com/cli/v8/using-npm/workspaces). Every direct child of this directory (generally) has a `package.json` and a `src` directory.
+
+Some of these modules are core pieces of Puter:
+- **Puter's backend** is [`/src/backend`](/src/backend)
+ - See [key locations in backend documentation](/src/backend/doc/contributors/structure.md)
+- **Puter's GUI** is [`/src/gui`](/src/gui)
+
+Some of these modules are apps:
+- **Puter's Terminal**: [`/src/terminal`](/src/terminal)
+- **Puter's Shell**: [`/src/phoenix`](/src/phoenix)
+
+Some of these modules are libraries:
+- **common javascript**: [`/src/putility`](/src/putility)
+- **runtime import mechanism**: [`/src/useapi`](/src/useapi)
+- **Puter's "puter.js" browser SDK**: [`/src/puter-js`](/src/puter-js)
+
+### The `volatile` directory
+
+When you're running Puter with development instructions (i.e. `npm start`),
+Puter's configuration directory will be `volatile/config` and Puter's
+runtime directory will be `volatile/runtime`, instead of the standard
+`/etc/puter` and `/var/puter` directories in production installations.
+
+We should probably rename this directory, actually, but it would inconvenience
+a lot of people right now if we did.
+
+### The `tools` directory
+
+Every directory under `/tools` is [an npm "workspaces" module](https://docs.npmjs.com/cli/v8/using-npm/workspaces).
+
+This is where `run-selfhosted.js` is. That's the entrypoint for `npm start`.
+
+These tools are underdocumented and may not behave well if they're not executed
+from the correct working directory (which is different for different tools).
+Consider this a work-in-progress. If you want to use or contribute to anything
+under this directory, for now you should
+[tag @KernelDeimos on the community Discord](https://discord.gg/PQcx7Teh8u).
diff --git a/doc/contributors/vscode.md b/doc/contributors/vscode.md
new file mode 100644
index 0000000000..12cd44d636
--- /dev/null
+++ b/doc/contributors/vscode.md
@@ -0,0 +1,2 @@
+### `vscode`
+- `es6-string-html`
diff --git a/doc/devlog.md b/doc/devlog.md
new file mode 100644
index 0000000000..3fc8377325
--- /dev/null
+++ b/doc/devlog.md
@@ -0,0 +1,103 @@
+## 2024-10-16
+
+### Considerations for Mountpoints Feature
+
+- `_storage_upload` takes paramter `uuid` instead of `path`
+ - S3 bucket strategy needs the UUID
+ - If we do hashes, 10MB chunks should be fine
+ - we're already able to smooth out bursty traffic using the
+ EWA algorithm
+- Use of `systemFSEntryService`
+ - Is that normalized? Does everything go through this interface?
+- Storage interface has methods like `post_insert`
+ - as far as I can tell this doesn't pose any issue
+-
+
+### Brainstorming Migration Strategies
+
+#### Interface boundary at HL<->LL filesystem methods
+
+-- **tags:** brainstorming
+
+From the perspectice of a trait-oriented implementation,
+which is not how LL/HL filesystem operations are currently implemented,
+the LL-class operations are implemented in separate traits.
+
+The composite trait containing all of these traits would be the trait
+that represents a filesystem implementation itself.
+
+Other filesystem interfaces that I've seen, such as FUSE and 9p,
+all usually have a monolithic interface - that is to say, an interface
+which includes all of the filesystem operations, rather than several
+interfaces each implementing a single filesystem operaiton.
+
+Something about the fact that the LL-class operations are in separate
+classes makes it difficult to reason about how to move.
+Is it simply that multiple files in a directory is just more
+annoying to think about? Maybe, but there must be something more.
+
+Perhaps it's that there are several references. Each implementation
+(that is, implemenation of a single filesystem operation) could have
+any number of different references across any number of different files.
+This would not be the case with a monolithic interface.
+
+I think the best of both worlds would be to have an interface representing
+the entire filesystem and, in one place, link of of the individual
+operation implementations to compose a filesystem implementation
+
+### Filesystem Brainstorming
+
+Puter's backend uses a service architecture. Each service is an instance
+of a class extending "Service". A service can listen to events of the
+backend's lifecycle, interact with other services, and interact with
+external interfaces such as APIs and databases.
+
+Puter's current filesystem, let's call it PuterFSv1, exists as the result
+of multiple services working together. We have LocalDiskStorageService
+which mimics an S3 bucket on a local system, and we have
+DatabaseFSEntryService which manages information about files, directories,
+and their relationships within the database, and therefore depends on
+DatabaseAccessService.
+
+It is now time to introduce a MountpointService. This will allow another
+service or a user's configuration to assign an instance of a filesystem
+implementation (such as PuterFSv1) to a specific path.
+
+The trouble here is that PuterFSv1 is composed of services, and the nature
+of a service is such that it exists for the lifecycle of the application.
+The class for a particular service can be re-used and registered with
+multiple names (creating multiple services with the same implementation
+but perhaps different configuration), but that's only a clean scenario when
+there is just one service. PuterFSv1, on the other hand, is like an
+imaginary service composed of other services.
+
+The following possibilities then should be discussed:
+- CompositeService base class for a service that is composed of
+ more than one service.
+- Refactor filesystem to not use service architecture.
+- Each filesystem service can manage state and configuration
+ for multiple mountpoints
+ (I don't like this idea; it feels messy. I wonder what software
+ principles this violates)
+
+We can take advantage of traits/interfaces here.
+PuterFSv1 depends on two interfaces:
+- An S3-like data storage implementation
+- An fsentry storage implementation
+
+Counterintuitively from what I first thought, "Refactor the filesystem"
+actually looks like the best solution, and it doens't even look like it
+will be that difficult. In fact, it'll likely make the filesystem easier
+to maintain and more robust as a result.
+
+Additionally, we can introduce PuterFSv2, which will introduce storing
+data in chunks identified by their hashes, and associated hashes with
+fsentries.
+
+PuterFSService will be a new service which registers 'PuterFSv1' with
+FilesystemService.
+
+An instance of a filesystem needs to be separate from a mountpoint.
+For example, PuterFSv1 will usually have only one instance but it may
+be mounted several different times. `/some-user` on Puter's VFS could
+be a mountpoint for `/some-user` in the instance of PuterFSv1.
diff --git a/doc/devmeta/track-comments.md b/doc/devmeta/track-comments.md
new file mode 100644
index 0000000000..260d7f3330
--- /dev/null
+++ b/doc/devmeta/track-comments.md
@@ -0,0 +1,62 @@
+# Track Comments
+
+Comments beginning with `// track:`. See
+[comment_prefixes.md](../contributors/comment_prefixes.md)
+
+## Track Comment Registry
+
+- `track: type check`:
+ A condition that's used to check the type of an imput.
+- `track: adapt`
+ A value can by adapted from another type at this line.
+- `track: bounds check`:
+ A condition that's used to check the bounds of an array
+ or other list-like entity.
+- `track: ruleset`
+ A series of conditions that early-return or `continue`
+- `track: object description in comment`
+ A comment above the creation of some object which
+ could potentially have a `description` property.
+ This is especially relevant if the object is stored
+ in some kind of registry where multiple objects
+ could be listed in the console.
+- `track: slice a prefix`
+ A common pattern where a prefix string is "sliced off"
+ of another string to obtain a significant value, such
+ as an indentifier.
+- `track: actor type`
+ The sub-type of an Actor object is checked.
+- `track: scoping iife`
+ An immediately-invoked function expression specifically
+ used to reduce scope clutter.
+- `track: good candidate for sequence`
+ Some code involves a series of similar steps,
+ or there's a common behavior that should happen
+ in between. The Sequence class is good for this so
+ it might be a worthy migration.
+- `track: opposite condition of sibling`
+ A sibling class, function, method, or other construct of
+ source code has a boolean expression which always evaluates
+ to the opposite of the one below this track comment.
+- `track: null check before processing`
+ An object could be undefined or null, additional processing
+ occurs after a null check, and the unprocessed object is not
+ relevant to the rest of the code. If the code for obtaining
+ the object and processing it is moved to a function outside,
+ then the null check should result in a early return of null;
+ this code with the track comment may have additional logic
+ for the null/undefined case.
+- `track: manual safe object`
+ This code manually creates a new "client-safe" version of
+ some object that's in scope. This could be either to pass
+ onto the browser or to pass to something like the
+ notification service.
+- `track: common operations on multiple items`
+ A patterm which emerges when multiple variables have
+ common operations done upon them in sequence.
+ It may be applicable to write an iterator in the
+ future, or something will come up that require
+ these to be handled with a modular approach instead.
+- `track: checkpoint`
+ A location where some statement about the state of the
+ software must hold true.
diff --git a/doc/docmeta.md b/doc/docmeta.md
new file mode 100644
index 0000000000..65f11767cb
--- /dev/null
+++ b/doc/docmeta.md
@@ -0,0 +1,45 @@
+# Meta Documentation
+
+Guidelines for documentation.
+
+## How documentation is organized
+
+This documentation exists in the Puter repository.
+You may be reading this on the GitHub wiki instead, which we generate
+from the repository docs. These docs are always under a directory
+named `doc/`.
+
+From [./contributors/structure.md](./contributors/structure.md):
+> The top-level `doc` directory contains the file you're reading right now.
+> Its scope is documentation for using and contributing to Puter in general,
+> and linking to more specific documentation in other places.
+>
+> All `doc` directories will have a `README.md` which should be considered as
+> the index file for the documentation. All documentation under a `doc`
+> directory should be accessible via a path of links starting from `README.md`.
+
+### Documentation Structure
+
+The top-level `doc` directory contains the following subdirectories:
+
+- `api/` - API documentation for Puter services
+- `contributors/` - Documentation for contributors to the Puter project
+- `devmeta/` - Meta documentation for developers
+- `i18n/` - Internationalization documentation
+- `planning/` - Project planning documentation
+- `self-hosters/` - Documentation for self-hosting Puter
+- `uncategorized/` - Miscellaneous documentation
+
+As well as some files:
+
+- `README.md` - Documentation overview optimized for humans.
+- `AI.md` - Documentation overview optimized for AI/LLM agents.
+
+Module-specific documentation follows a similar structure, with each module having its own `doc` directory. For contributor-specific documentation within a module, use a `contributors` subdirectory within the module's `doc` directory.
+
+## Docs Styleguide
+
+### "is" and "is not"
+
+- When "A is B", bold "is": "A **is** B" (`A **is** B`)
+- When "A is not B", bold "not": "A is **not** B" (`A is **not** B`)
diff --git a/doc/i18n/README.ar.md b/doc/i18n/README.ar.md
new file mode 100644
index 0000000000..58ae373821
--- /dev/null
+++ b/doc/i18n/README.ar.md
@@ -0,0 +1,129 @@
+
+
+نظام تشغيل الإنترنت! مجاني ومفتوح المصدر وقابل للاستضافة الذاتية.
+
+
+
+
+
+ « عرض توضيحي مباشر »
+
+
+ Puter.com
+ ·
+ مجموعة أدوات التطوير
+ ·
+ ديسكورد
+ ·
+ ريديت
+ ·
+ إكس (تويتر)
+
+
+
+
+
+
+## بيوتر
+
+
+
بيوتر هو نظام تشغيل إنترنت متقدم ومفتوح المصدر، مصمم ليكون غنيًا بالميزات وسريعًا بشكل استثنائي وقابلًا للتوسع بدرجة كبيرة. يمكن استخدام بيوتر كـ:
+
+
+ سحابة شخصية تعطي الأولوية للخصوصية لحفظ جميع ملفاتك وتطبيقاتك وألعابك في مكان آمن واحد، يمكن الوصول إليه من أي مكان وفي أي وقت.
+ منصة لبناء ونشر المواقع الإلكترونية وتطبيقات الويب والألعاب
+ بديل لـ Dropbox وGoogle Drive وOneDrive وغيرها، مع واجهة جديدة وميزات قوية.
+ بيئة سطح مكتب عن بُعد للخوادم ومحطات العمل.
+ مشروع ومجتمع ودود ومفتوح المصدر للتعلم عن تطوير الويب والحوسبة السحابية والأنظمة الموزعة والكثير غير ذلك!
+
+
+
+
+
+## البدء
+
+### 💻 التطوير المحلي
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+سيؤدي هذا إلى تشغيل Puter على http://puter.localhost:4100 (أو المنفذ التالي المتاح).
+
+
+
+### 🐳 دوكر
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 دوكر كومبوز
+
+#### لينكس/ماك
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### ويندوز
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+
+### ☁️ موقع Puter.com
+
+متاح Puter كخدمة مستضافة على[**puter.com**](https://puter.com)الموقع
+
+
+
+## متطلبات النظام
+
+- **Operating Systems:** لينكس، ماك، ويندوز
+- **RAM** ٢ جيجابايت كحد أدنى (يوصى بـ ٤ جيجابايت)
+- **Disk Space:** ١ جيجابايت مساحة حرة
+- **Node.js:** الإصدار ١٦+ (يوصى بالإصدار ٢٢+)
+- **npm:** أحدث إصدار مستقر
+
+
+
+## الدعم
+
+تواصل مع المشرفين والمجتمع من خلال هذه القنوات:
+
+- تقرير عن خطأ أو طلب ميزة؟ الرجاء [فتح مشكلة](https://github.com/HeyPuter/puter/issues/new/choose)
+
+- دسكورد: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- إكس (تويتر): [x.com/HeyPuter](https://x.com/HeyPuter)
+- ريديت: [/reddit.com/r/puter](https://www.reddit.com/r/puter/)
+- ماستودون: [mastodon.social/@puter](https://mastodon.social/@puter)
+- مشاكل أمنية؟ [security@puter.com](mailto:security@puter.com)
+- البريد الإلكتروني للمشرفين [hi@puter.com](mailto:hi@puter.com)
+
+نحن دائمًا سعداء لمساعدتك في أي أسئلة قد تكون لديك. لا تتردد في السؤال!
+
+
+
+## الترخيص
+
+هذا المستودع، بما في ذلك جميع محتوياته ومشاريعه الفرعية ووحداته ومكوناته، مرخص تحت [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) ما لم ينص على خلاف ذلك صراحةً. قد تخضع المكتبات الخارجية المدرجة في هذا المستودع لتراخيصها الخاصة.
+
+
diff --git a/doc/i18n/README.bn.md b/doc/i18n/README.bn.md
new file mode 100644
index 0000000000..149f0eccec
--- /dev/null
+++ b/doc/i18n/README.bn.md
@@ -0,0 +1,124 @@
+
+
+ইন্টারনেট ওএস! ফ্রি, ওপেন-সোর্স, এবং সেল্ফ-হোস্টেবল।
+
+
+
+
+
+
+ « লাইভ ডেমো »
+
+
+ Puter.com
+ ·
+ এসডিকে
+ ·
+ ডিসকর্ড
+ ·
+ রেডিট
+ ·
+ X (টুইটার)
+
+
+
+
+
+
+## Puter
+
+Puter একটি উন্নত, ওপেন-সোর্স ইন্টারনেট অপারেটিং সিস্টেম যা বৈশিষ্ট্যপূর্ণ, অত্যন্ত দ্রুত এবং উচ্চ মাত্রায় সম্প্রসারণযোগ্য। Puter ব্যবহার করা যেতে পারে:
+
+- একটি প্রাইভেসি-প্রথম পার্সোনাল ক্লাউড হিসাবে যা আপনার সমস্ত ফাইল, অ্যাপস এবং গেমসকে এক জায়গায় নিরাপদে রাখে, যেকোনো সময় যেকোনো স্থান থেকে অ্যাক্সেসযোগ্য।
+- ওয়েবসাইট, ওয়েব অ্যাপ এবং গেম তৈরি ও প্রকাশ করার একটি প্ল্যাটফর্ম হিসাবে।
+- ড্রপবক্স, গুগল ড্রাইভ, ওয়ানড্রাইভ ইত্যাদির বিকল্প হিসাবে একটি নতুন ইন্টারফেস এবং শক্তিশালী বৈশিষ্ট্য সহ।
+- সার্ভার এবং ওয়ার্কস্টেশনের জন্য একটি রিমোট ডেস্কটপ এনভায়রনমেন্ট হিসাবে।
+- ওয়েব ডেভেলপমেন্ট, ক্লাউড কম্পিউটিং, ডিস্ট্রিবিউটেড সিস্টেম এবং আরও অনেক কিছু শিখতে একটি বন্ধুত্বপূর্ণ, ওপেন-সোর্স প্রকল্প এবং কমিউনিটি হিসাবে!
+
+
+
+## শুরু করার জন্য
+
+## 💻 লোকাল ডেভেলপমেন্ট
+
+```bash
+Copy code
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+এটি Puter কে http://puter.localhost:4100 (অথবা পরবর্তী উপলব্ধ পোর্টে) চালু করবে।
+
+
+
+## 🐳 ডকার
+
+```bash
+Copy code
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+## 🐙 ডকার কম্পোজ
+
+## লিনাক্স/ম্যাকওএস
+
+```bash
+Copy code
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+## উইন্ডোজ
+
+```powershell
+Copy code
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+## ☁️ Puter.com
+Puter [**puter.com**](https://puter.com) এ হোস্টেড সার্ভিস হিসেবে উপলব্ধ।
+
+
+
+## সিস্টেম রিকোয়ারমেন্টস
+
+- **অপারেটিং সিস্টেম:** লিনাক্স, ম্যাকওএস, উইন্ডোজ
+- **র্যাম:** ২জিবি ন্যূনতম (৪জিবি প্রস্তাবিত)
+- **ডিস্ক স্পেস:** ১জিবি ফ্রি স্পেস
+- **Node.js:** সংস্করণ ১৬+ (সংস্করণ ২২+ প্রস্তাবিত)
+- **npm:** সর্বশেষ স্থিতিশীল সংস্করণ
+
+
+
+## সাপোর্ট
+
+মেইনটেইনার এবং কমিউনিটির সাথে এই চ্যানেলগুলির মাধ্যমে সংযোগ করুন:
+
+- বাগ রিপোর্ট বা ফিচার রিকোয়েস্ট? অনুগ্রহ করে একটি ইস্যু খুলুন।
+- ডিসকর্ড: discord.com/invite/PQcx7Teh8u
+- X (টুইটার): x.com/HeyPuter
+- রেডিট: reddit.com/r/puter/
+- মাস্টডন: mastodon.social/@puter
+- সিকিউরিটি ইস্যু? security@puter.com
+- মেইনটেইনারদের ইমেইল করুন hi@puter.com এ
+
+আপনার যেকোনো প্রশ্নের জন্য আমরা সবসময় সাহায্য করতে প্রস্তুত। জিজ্ঞাসা করতে দ্বিধা করবেন না!
+
+
+
+## লাইসেন্স
+
+এই রিপোজিটরি, এর সমস্ত বিষয়বস্তু, সাব-প্রকল্প, মডিউল, এবং কম্পোনেন্ট সহ [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) লাইসেন্সের অধীনে লাইসেন্সকৃত, যদি অন্যথায় স্পষ্টভাবে উল্লেখ না করা হয়। এই রিপোজিটরিতে অন্তর্ভুক্ত তৃতীয় পক্ষের লাইব্রেরিগুলি তাদের নিজস্ব লাইসেন্সের অধীনে হতে পারে।
+
+
diff --git a/doc/i18n/README.da.md b/doc/i18n/README.da.md
new file mode 100644
index 0000000000..0739dc00a8
--- /dev/null
+++ b/doc/i18n/README.da.md
@@ -0,0 +1,127 @@
+
+
+Internet OS'et! Gratis, Open-Source og kan selvhostes.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter er et avanceret, open-source internetoperativsystem designet til at være funktionsrigt, exceptionelt hurtigt og meget udvideligt. Puter kan bruges som:
+
+- En privatlivsfokuseret personlig sky til at opbevare alle dine filer, apps og spil på ét sikkert sted, tilgængeligt hvor som helst og når som helst.
+- En platform til at bygge og publicere hjemmesider, webapplikationer og spil.
+- Et alternativ til Dropbox, Google Drive, OneDrive osv. med et friskt interface og kraftfulde funktioner.
+- Et fjernskrivebordsmiljø for servere og arbejdsstationer.
+- Et venligt, open-source projekt og fællesskab til at lære om webudvikling, cloud computing, distribuerede systemer og meget mere!
+
+
+
+## Kom godt i gang
+
+
+### 💻 Lokal Udvikling
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Dette vil starte Puter på http://puter.localhost:4100 (eller den næste tilgængelige port).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter er tilgængelig som en hosted tjeneste på [**puter.com**](https://puter.com).
+
+
+
+## Systemkrav
+
+- **Operativsystemer:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB anbefales)
+- **Diskplads:** 1GB fri plads
+- **Node.js:** Version 16+ (Version 22+ anbefales)
+- **npm:** Seneste stabile version
+
+
+
+## Support
+
+Kom i kontakt med vedligeholderne og fællesskabet gennem disse kanaler:
+
+- Bugrapport eller funktionønske? Åbn [venligst en sag](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Sikkerhedsspørgsmål? [security@puter.com](mailto:security@puter.com)
+- Send email til vedligeholdere på [hi@puter.com](mailto:hi@puter.com)
+
+Vi er altid glade for at hjælpe dig med eventuelle spørgsmål, du måtte have. Tøv ikke med at spørge!
+
+
+
+
+## Licens
+
+Dette repository, inklusive alt dets indhold, underprojekter, moduler og komponenter, er licenseret under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), medmindre andet er udtrykkeligt angivet. Tredjepartsbiblioteker inkluderet i dette repository kan være underlagt deres egne licenser.
+
+
diff --git a/doc/i18n/README.de.md b/doc/i18n/README.de.md
new file mode 100644
index 0000000000..437f3383dc
--- /dev/null
+++ b/doc/i18n/README.de.md
@@ -0,0 +1,127 @@
+
+
+Das Internet-Betriebssystem! Kostenlos, Open-Source und selbst hostbar.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter ist ein fortschrittliches, Open-Source-Internet-Betriebssystem, das funktionsreich, außergewöhnlich schnell und hochgradig erweiterbar konzipiert wurde. Puter kann verwendet werden als:
+
+- Eine datenschutzfreundliche persönliche Cloud, um alle Ihre Dateien, Apps und Spiele an einem sicheren Ort aufzubewahren, jederzeit und überall zugänglich.
+- Eine Plattform zum Erstellen und Veröffentlichen von Websites, Webanwendungen und Spielen.
+- Eine Alternative zu Dropbox, Google Drive, OneDrive usw. mit einer frischen Benutzeroberfläche und leistungsstarken Funktionen.
+- Eine Remote-Desktop-Umgebung für Server und Workstations.
+- Ein freundliches, Open-Source-Projekt und eine Community, um mehr über Webentwicklung, Cloud Computing, verteilte Systeme und vieles mehr zu lernen!
+
+
+
+## Erste Schritte
+
+
+### 💻 Lokale Entwicklung
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Dies startet Puter unter http://puter.localhost:4100 (oder dem nächsten verfügbaren Port).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter ist als gehosteter Dienst unter [**puter.com**](https://puter.com) verfügbar.
+
+
+
+## Systemanforderungen
+
+- **Betriebssysteme:** Linux, macOS, Windows
+- **RAM:** Mindestens 2GB (4GB empfohlen)
+- **Festplattenspeicher:** 1GB freier Speicherplatz
+- **Node.js:** Version 16+ (Version 22+ empfohlen)
+- **npm:** Neueste stabile Version
+
+
+
+## Unterstützung
+
+Verbinden Sie sich mit den Maintainern und der Community über diese Kanäle:
+
+- Fehlerbericht oder Funktionsanfrage? Bitte [öffnen Sie ein Issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Sicherheitsprobleme? [security@puter.com](mailto:security@puter.com)
+- E-Mail an die Maintainer: [hi@puter.com](mailto:hi@puter.com)
+
+Wir helfen Ihnen gerne bei allen Fragen, die Sie haben könnten. Zögern Sie nicht zu fragen!
+
+
+
+
+## Lizenz
+
+Dieses Repository, einschließlich aller Inhalte, Unterprojekte, Module und Komponenten, ist unter [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) lizenziert, sofern nicht ausdrücklich anders angegeben. In diesem Repository enthaltene Bibliotheken von Drittanbietern können ihren eigenen Lizenzen unterliegen.
+
+
diff --git a/doc/i18n/README.en.md b/doc/i18n/README.en.md
new file mode 100644
index 0000000000..98d15aa9f5
--- /dev/null
+++ b/doc/i18n/README.en.md
@@ -0,0 +1,127 @@
+
+
+The Internet OS! Free, Open-Source, and Self-Hostable.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter is an advanced, open-source internet operating system designed to be feature-rich, exceptionally fast, and highly extensible. Puter can be used as:
+
+- A privacy-first personal cloud to keep all your files, apps, and games in one secure place, accessible from anywhere at any time.
+- A platform for building and publishing websites, web apps, and games.
+- An alternative to Dropbox, Google Drive, OneDrive, etc. with a fresh interface and powerful features.
+- A remote desktop environment for servers and workstations.
+- A friendly, open-source project and community to learn about web development, cloud computing, distributed systems, and much more!
+
+
+
+## Getting Started
+
+
+### 💻 Local Development
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+This will launch Puter at http://puter.localhost:4100 (or the next available port).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter is available as a hosted service at [**puter.com**](https://puter.com).
+
+
+
+## System Requirements
+
+- **Operating Systems:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB recommended)
+- **Disk Space:** 1GB free space
+- **Node.js:** Version 16+ (Version 22+ recommended)
+- **npm:** Latest stable version
+
+
+
+## Support
+
+Connect with the maintainers and community through these channels:
+
+- Bug report or feature request? Please [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Security issues? [security@puter.com](mailto:security@puter.com)
+- Email maintainers at [hi@puter.com](mailto:hi@puter.com)
+
+We are always happy to help you with any questions you may have. Don't hesitate to ask!
+
+
+
+
+## License
+
+This repository, including all its contents, sub-projects, modules, and components, is licensed under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) unless explicitly stated otherwise. Third-party libraries included in this repository may be subject to their own licenses.
+
+
diff --git a/doc/i18n/README.es.md b/doc/i18n/README.es.md
new file mode 100644
index 0000000000..ffb7880192
--- /dev/null
+++ b/doc/i18n/README.es.md
@@ -0,0 +1,171 @@
+
+
+El Sistema Operativo de Internet! Gratis, de Código abierto, y Autohospedable.
+
+
+ « DEMO EN VIVO »
+
+
+ Puter.com
+ ·
+ App Store
+ ·
+ Developers
+ ·
+ CLI
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter es un sistema operativo en internet avanzado y de código abierto, diseñado para ser rico en funcionalidades, excepcionalmente rápido y altamente extensible. Puter puede ser usado como:
+
+- Una nube personal privada para almacenar todos tus archivos, aplicaciones y juegos en un lugar seguro, accesible y desde cualquier lugar en cualquier momento.
+- Una plataforma para construir y publicar páginas web, aplicativos sobre la web y juegos.
+- Una alternativa a Dropbox, Google Drive, OneDrive, etc. con una interfaz fresca y llena de funcionalidades.
+- Un entorno de escritorio remoto para servidores y estaciones de trabajo.
+- Un proyecto y comunidad abiertas y amigables para aprender sobre desarrollo web, computación en la nube, sistemas distribuidos y mucho más!
+
+
+
+## Primeros Pasos
+
+
+### 💻 Desarrollo Local
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
+
+Si esto no funciona, consulta [First Run Issues](./doc/self-hosters/first-run-issues.md) para obtener pasos de solución de problemas.
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
+
+
+
+### 🚀 Auto-Hospedaje
+
+Para guías detalladas sobre cómo auto-hospedar Puter, incluyendo opciones de configuración y mejores prácticas, consulta nuestra [Documentación de Auto-Hospedaje](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md).
+
+### ☁️ Puter.com
+
+Puter está disponible como servicio alojado en [**puter.com**](https://puter.com).
+
+
+
+## Requerimientos del sistema
+
+- **Sistemas operativos:** Linux, macOS, Windows
+- **RAM:** 2GB mínimo (4GB recomendados)
+- **Almacenamiento:** 1GB de espacio libre
+- **Node.js:** Versión 16+ (Versión 23+ recomendada)
+- **npm:** Última version estable
+
+
+
+## Soporte
+
+Conéctate con los mantenedores y la comunidad a través de estos canales:
+
+- Reporte de bug o solicitud de funcionalidad? Por favor [abrir un issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Problemas de seguridad? [security@puter.com](mailto:security@puter.com)
+- Envia un email a los mantenedores en [hi@puter.com](mailto:hi@puter.com)
+
+Estamos siempre felices de ayudar con cualquier pregunta que puedas tener. No dudes en preguntar!
+
+
+
+
+## Licencia
+
+Este repositorio, incluyendo todo su contenido, sub-proyectos, modulos y componentes, esta licenciado bajo [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) a menos que se indique explícitamente lo contrario. Librerías de terceros incluidos en este repositorio pueden estar sujetas a sus propias licencias.
+
+
+
+## Traducciones
+
+- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
+- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
+- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
+- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
+- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
+- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
+- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
+- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
+- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
+- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
+- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
+- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
+- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
+- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
+- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
+- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
+- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
+- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
+- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
+- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
+- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
+- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
+- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
+- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
+- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
+- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
+- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
+- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
\ No newline at end of file
diff --git a/doc/i18n/README.fa.md b/doc/i18n/README.fa.md
new file mode 100644
index 0000000000..ab2b9b7371
--- /dev/null
+++ b/doc/i18n/README.fa.md
@@ -0,0 +1,133 @@
+
+
+سیستمعامل اینترنت! رایگان، متنباز، و قابل میزبانی شخصی.
+
+
+
+
+
+ « نسخه نمایشی زنده »
+
+
+ Puter.com
+ ·
+ مستندات توسعهدهندگان
+ ·
+ دیسکورد
+ ·
+ ردیت
+ ·
+ ایکس (توییتر)
+
+
+
+
+
+
+## پیوتر
+
+
+
پیوتر یک سیستم عامل تحت وب پیشرفتهی متنباز است که به منظور ایجاد ویژگیهای متنوع، سرعت بسیار بالا، و مقیاسپذیری طراحی شده است. از پیوتر میتوان بهعنوان:
+
+
+ یک فضای ابری شخصی که بر حریم خصوصی تمرکز دارد و تمام فایلها، برنامهها، و بازیهای شما را در یک مکان امن ذخیره میکند، قابل دسترسی از هر جا و در هر زمان.
+ پلتفرمی برای ساخت و انتشار وبسایتها، اپلیکیشنهای وب، و بازیها.
+ جایگزینی برای Dropbox، Google Drive، OneDrive، و سایر موارد، با یک رابط کاربری مدرن و قابلیتهای قدرتمند.
+ یک محیط دسکتاپ از راه دور برای سرورها و ایستگاههای کاری.
+ یک پروژه و جامعهی متنباز دوستانه برای یادگیری توسعه وب، رایانش ابری، سیستمهای توزیعشده، و موارد دیگر نام برد!
+
+
+
+
+
+## نحوهی استفاده
+
+### 💻 توسعهی محلی
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+این کار پیوتر را در http://puter.localhost:4100 (یا پورت در دسترس بعدی) اجرا میکند.
+
+
+
+### 🐳 داکر
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 داکر کامپوز
+
+
+#### لینوکس/مک
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### ویندوز
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ وبگاه Puter.com
+
+پیوتر بهعنوان یک سرویس میزبانیشده در وبگاه [**puter.com**](https://puter.com) موجود است.
+
+
+## پیشنیازهای سیستم
+
+- **سیستمعاملها:** لینوکس، مک، ویندوز
+- **RAM** حداقل ۲ گیگابایت (پیشنهاد: ۴ گیگابایت)
+- **فضای دیسک:** ۱ گیگابایت فضای خالی
+- **Node.js:** نسخه ۱۶+ (پیشنهاد: نسخه ۲۲+)
+- **npm:** آخرین نسخه پایدار
+
+
+
+## پشتیبانی
+
+با مدیران و انجمن از طریق این کانالها در تماس باشید:
+
+- گزارش اشکال یا درخواست ویژگی؟ لطفاً [Isuue باز کنید](https://github.com/HeyPuter/puter/issues/new/choose)
+
+- دیسکورد: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+
+- ایکس (توییتر): [x.com/HeyPuter](https://x.com/HeyPuter)
+
+- ردیت: [/reddit.com/r/puter](https://www.reddit.com/r/puter/)
+
+- ماستودون: [mastodon.social/@puter](https://mastodon.social/@puter)
+
+- مشکلات امنیتی؟ [security@puter.com](mailto:security@puter.com)
+
+- ایمیل مدیران: [hi@puter.com](mailto:hi@puter.com)
+
+
+ما همیشه از پاسخگویی به سوالات شما خرسند هستیم. در سوال پرسیدن درنگ نکنید!
+
+## گواهی
+
+این مخزن، شامل تمام محتویات، پروژههای فرعی، ماژولها و اجزای آن، تحت مجوز [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) است مگر آنکه خلاف آن بهطور صریح ذکر شده باشد. کتابخانههای خارجی ممکن است گواهیهای جداگانه داشته باشند.
+
+
diff --git a/doc/i18n/README.fi.md b/doc/i18n/README.fi.md
new file mode 100644
index 0000000000..7dac5028da
--- /dev/null
+++ b/doc/i18n/README.fi.md
@@ -0,0 +1,126 @@
+
+Internetin käyttöjärjestelmä! Ilmainen, avoimen lähdekoodin ja itse isännöitävä.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter on kehittynyt, avoimen lähdekoodin internetin käyttöjärjestelmä, joka on suunniteltu olemaan ominaisuuksiltaan rikas, poikkeuksellisen nopea ja erittäin laajennettava. Puteria voidaan käyttää:
+
+- Yksityisyyttä kunnioittavana henkilökohtaisena pilvenä, johon voit tallentaa kaikki tiedostosi, sovelluksesi ja pelisi turvallisesti yhdessä paikassa, josta ne ovat saatavilla missä tahansa ja milloin tahansa.
+- Alustana verkkosivustojen, web-sovellusten ja pelien rakentamiseen ja julkaisemiseen.
+- Vaihtoehtona Dropboxille, Google Drivelle, OneDrivelle jne. tuoreella käyttöliittymällä ja tehokkailla ominaisuuksilla.
+- Etätyöpöytäympäristönä palvelimille ja työasemille.
+- Ystävällisenä, avoimen lähdekoodin projektina ja yhteisönä, jossa voit oppia verkkokehityksestä, pilvipalveluista, hajautetuista järjestelmistä ja paljon muusta!
+
+
+
+## Aloittaminen
+
+
+### 💻 Paikallinen kehitys
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Tämä käynnistää Puterin osoitteessa http://puter.localhost:4100 (tai seuraavassa vapaassa portissa).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter on saatavilla isännöitynä palveluna osoitteessa [**puter.com**](https://puter.com).
+
+
+
+## Järjestelmävaatimukset
+
+- **Käyttöjärjestelmät:** Linux, macOS, Windows
+- **RAM:** Vähintään 2GB (Suositeltu 4GB)
+- **Levytila:** 1GB vapaata tilaa
+- **Node.js:** Versio 16+ (Suositeltu versio 22+)
+- **npm:** Uusin vakaa versio
+
+
+
+## Tuki
+
+Ota yhteyttä ylläpitäjiin ja yhteisöön näiden kanavien kautta:
+
+- Onko sinulla virheraportti tai ominaisuuspyyntö? Ole hyvä ja [avaa uusi issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Turvallisuusongelmat? [security@puter.com](mailto:security@puter.com)
+- Ota yhteyttä ylläpitäjiin sähköpostitse osoitteessa [hi@puter.com](mailto:hi@puter.com)
+
+Olemme aina valmiita auttamaan sinua kaikissa kysymyksissäsi. Älä epäröi kysyä!
+
+
+
+
+## Lisenssi
+
+Tämä repository, mukaan lukien kaikki sen sisältö, aliprojektit, moduulit ja komponentit, on lisensoitu [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt)-lisenssillä, ellei toisin mainita. Tämän repositoryn mukana tulevat kolmannen osapuolen kirjastot voivat olla omien lisenssiensä alaisia.
+
+
diff --git a/doc/i18n/README.fr.md b/doc/i18n/README.fr.md
new file mode 100644
index 0000000000..3e56a275d2
--- /dev/null
+++ b/doc/i18n/README.fr.md
@@ -0,0 +1,125 @@
+
+
+L'OS Internet ! Gratuit, open-source et auto-hébergeable.
+
+
+
+
+
+ « DÉMO EN DIRECT »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter est un système d'exploitation internet avancé, open-source, conçu pour être riche en fonctionnalités, extrêmement rapide et hautement extensible. Puter peut être utilisé comme :
+
+- Un cloud personnel axé sur la confidentialité pour garder tous vos fichiers, applications et jeux en un seul endroit sécurisé, accessible de partout à tout moment.
+- Une plateforme pour créer et publier des sites web, des applications web et des jeux.
+- Une alternative à Dropbox, Google Drive, OneDrive, etc. avec une interface renouvelée et des fonctionnalités puissantes.
+- Un environnement de bureau à distance pour serveurs et stations de travail.
+- Un projet et une communauté open-source accueillants pour apprendre le développement web, l'informatique en nuage, les systèmes distribués, et bien plus encore !
+
+
+
+## Démarrage
+
+
+### 💻 Développement Local
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Cela lancera Puter à http://puter.localhost:4100 (ou au port disponible suivant).
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter est disponible en tant que service hébergé sur [**puter.com**](https://puter.com).
+
+
+
+## Configuration système requise
+- **Systèmes d'exploitation:** Linux, macOS, Windows
+- **RAM:** Minimum 2 Go (4 Go recommandés)
+- **Espace disque:** 1 Go d'espace libre
+- **Node.js:** Version 16+ (Version 22+ recommandée)
+- **npm:** Dernière version stable
+
+
+
+## Support
+
+Connectez-vous avec les mainteneurs et la communauté via ces canaux :
+
+- Un bug ou une demande de fonctionnalité ? Veuillez [ouvrir une issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Problèmes de sécurité ? [security@puter.com](mailto:security@puter.com)
+- Email des mainteneurs à [hi@puter.com](mailto:hi@puter.com)
+
+Nous sommes toujours heureux de vous aider avec toutes les questions que vous pourriez avoir. N'hésitez pas à nous demander !
+
+
+
+
+## License
+
+Ce dépôt, y compris tout son contenu, sous-projets, modules et composants, est licencié sous [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) sauf indication contraire explicite. Les bibliothèques tierces incluses dans ce dépôt peuvent être soumises à leurs propres licences.
+
+
+
diff --git a/doc/i18n/README.he.md b/doc/i18n/README.he.md
new file mode 100644
index 0000000000..7577cacbb3
--- /dev/null
+++ b/doc/i18n/README.he.md
@@ -0,0 +1,130 @@
+
+
+מערכת ההפעלה של האינטרנט! חינמית, קוד פתוח וניתנת לאחסון עצמאי.
+
+
+
+
+
+ « הדגמה לייב »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+
+
+ מערכת ההפעלה Puter הינה ספרית קוד פתוח, מתקדמת, עשירה בתכנים, מהירה במיוחד וניתנת להרחבה.
+ אפשר להישתמש ב Puter כ:
+
+ ענן אישי עם פרטיות מקסימלית, לשמירת הקבצים, האפליקציות והמשחקים שלך במקום מאובטח אחד, נגיש מכל מקום ובכל זמן.
+ פלטפורמה לבניית ופרסום אתרים, אפליקציות ומשחקים.
+ אלטרנטיבה ל-Dropbox, Google Drive, OneDrive וכו' עם ממשק מרענן ותכנים חזקים.
+ סביבה לעבודה מרחוק לשרתים ותחנות עבודה.
+ פרוייקט ידידותי, קוד פתוח וקהילה ללמידה על פיתוח אינטרנט, פיתוח בענן, מערכות מבוזרות ועוד הרבה!
+
+
+
+
+## בוא נתחיל
+
+### 💻 פיתוח מקומי (Localhost)
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+פקודה זו תפעיל את Puter בכתובת http://puter.localhost:4100 (או בפורט הפנוי הבא).
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+
+### ☁️ Puter.com
+
+מערכת ההפעלה Puter זמינה כשירות אחסון ב- [**puter.com**](https://puter.com).
+
+
+
+## דרישות מערכת
+
+- **מערכות הפעלה:** Linux, macOS, Windows
+- **RAM:** לפחות 2GB, מומלץ 4GB
+- **מקום פנוי בדיסק:** 1GB
+- **Node.js:** גרסה 16+ (מומלץ גרסה 22+)
+- **npm:** הגרסה היציבה האחרונה
+
+
+
+## תמיכה
+
+צור קשר עם המפתחים והקהילה דרך הערוצים הבאים:
+
+- דיווח על באג או בקשה לתוכן? אנא [פתח פניה](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter](https://www.reddit.com/r/puter.)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- בעיות אבטחה? [security@puter.com](mailto:security@puter.com)
+- שלח אימייל למפתחים ב [hi@puter.com](mailto:hi@puter.com)
+
+אנחנו תמיד שמחים לעזור עם כל שאלה שיש. אל תהסס לשאול!
+
+
+
+## רישיון
+
+ספריה זו, כולל כל התכנים שלה, תתי הפרויקטים, המודולים והרכיבים שלה, מורשית תחת [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) אלא אם נאמר אחרת במפורש. לספריות צד שלישי הכלולות בספרייה זו עשויות להיות רישיונות משלהן.
+
+
diff --git a/doc/i18n/README.hi.md b/doc/i18n/README.hi.md
new file mode 100644
index 0000000000..ff9f4c4aa8
--- /dev/null
+++ b/doc/i18n/README.hi.md
@@ -0,0 +1,182 @@
+
+
+इंटरनेट ओएस! फ्री, ओपन-सोर्स, और सेल्फ-होस्टेबल।
+
+
+ « लाइव डेमो »
+
+
+ Puter.com
+ ·
+ ऐप स्टोर
+ ·
+ डेवलपर्स
+ ·
+ CLI
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X
+
+
+
+
+
+
+## Puter क्या है?
+
+Puter एक एडवांस्ड, ओपन-सोर्स इंटरनेट ऑपरेटिंग सिस्टम है जिसे फीचर-रिच, तेज़ और एक्सटेंडेबल बनाने के लिए डिज़ाइन किया गया है। Puter का उपयोग आप निम्नलिखित चीजों के लिए कर सकते हैं:
+
+- एक प्राइवेसी-फर्स्ट पर्सनल क्लाउड, जो आपकी सभी फाइलों, ऐप्स और गेम्स को एक सेफ जगह पर रखता है, जिसे आप कहीं से भी कभी भी एक्सेस कर सकते हैं।
+- वेबसाइट्स, वेब ऐप्स और गेम्स बनाने और पब्लिश करने का एक प्लेटफ़ॉर्म।
+- Dropbox, Google Drive, OneDrive आदि का एक शानदार और पावरफुल इंटरफ़ेस वाला विकल्प।
+- सर्वर और वर्कस्टेशन के लिए एक रिमोट डेस्कटॉप एनवायरनमेंट।
+- एक फ्रेंडली ओपन-सोर्स प्रोजेक्ट और कम्युनिटी, जहां आप वेब डेवलपमेंट, क्लाउड कंप्यूटिंग, डिस्ट्रीब्यूटेड सिस्टम्स और बहुत कुछ सीख सकते हैं।
+
+
+
+## शुरुआत कैसे करें?
+
+### 💻 लोकल डेवलपमेंट
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+✨ यह Puter को
+ http://puter.localhost:4100 (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
+
+
+अगर यह काम नहीं करता, तो [First Run Issues](./doc/self-hosters/first-run-issues.md) देखें।
+
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+✨ यह Puter को
+ http://puter.localhost:4100 (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+✨ यह http://puter.localhost:4100
+ (या अगले उपलब्ध पोर्ट) पर उपलब्ध होगा।
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+✨ यह Puter को
+ http://puter.localhost:4100 (or the next available port). (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
+
+
+
+### 🚀 सेल्फ-होस्टिंग
+
+सेल्फ-होस्टिंग के लिए विस्तृत गाइड, कॉन्फ़िगरेशन ऑप्शन्स और बेस्ट प्रैक्टिसेज जानने के लिए हमारी [Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md) देखें।
+
+
+
+### ☁️ Puter.com
+
+Puter [**puter.com**](https://puter.com) पर एक होस्टेड सर्विस के रूप में भी उपलब्ध है।
+
+
+
+## सिस्टम आवश्यकताएँ
+
+* **ऑपरेटिंग सिस्टम्स:** Linux, macOS, Windows
+* **RAM:** कम से कम 2GB (4GB रिकमेंडेड)
+* **डिस्क स्पेस:** 1GB फ्री स्पेस
+* **Node.js:** वर्जन 16+ (वर्जन 23+ रिकमेंडेड)
+* **npm:** लेटेस्ट स्टेबल वर्जन
+
+
+
+## सपोर्ट
+
+नीचे दिए गए माध्यमों से आप मेंटेनर्स और कम्युनिटी से जुड़ सकते हैं:
+
+* बग रिपोर्ट या फीचर रिक्वेस्ट? [यहाँ issue खोलें](https://github.com/HeyPuter/puter/issues/new/choose)।
+* Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+* X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+* Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+* Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+* सिक्योरिटी इशूज़? [security@puter.com](mailto:security@puter.com)
+* ईमेल करें: [hi@puter.com](mailto:hi@puter.com)
+
+आपके किसी भी सवाल में मदद करने के लिए हम हमेशा तैयार हैं!
+
+
+
+## लाइसेंस
+
+यह रिपॉज़िटरी और इसके सभी कंटेंट्स [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) लाइसेंस के अंतर्गत आते हैं जब तक कि कुछ और स्पष्ट रूप से ना लिखा हो। इसमें शामिल थर्ड-पार्टी लाइब्रेरीज़ अपने-अपने लाइसेंस के अधीन हो सकती हैं।
+
+
+
+## अनुवाद
+
+Puter के डॉक्यूमेंटेशन कई भाषाओं में उपलब्ध हैं, जिनमें शामिल हैं:
+
+- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
+- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
+- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
+- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
+- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
+- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
+- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
+- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
+- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
+- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
+- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
+- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
+- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
+- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
+- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
+- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
+- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
+- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
+- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
+- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
+- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
+- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
+- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
+- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
+- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
+- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
+- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
+- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+
diff --git a/doc/i18n/README.hu.md b/doc/i18n/README.hu.md
new file mode 100644
index 0000000000..da30fb5318
--- /dev/null
+++ b/doc/i18n/README.hu.md
@@ -0,0 +1,128 @@
+
+
+Az internetes oprendszer! Ingyenes, nyílt-forráskódú, saját szerveren futtatható.
+
+
+
+
+
+ « ÉLŐ DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+A Puter egy fejlett, nyílt forráskódú internetes operációs rendszer, amelyet úgy terveztek, hogy funkciókban gazdag, kivételesen gyors és nagymértékben bővíthető legyen. A Puter a következőképpen használható:
+
+- Egy adatvédelmet előtérbe helyező személyes felhő, amely minden fájlt, alkalmazást és játékot egy biztonságos helyen tart. Bárhonnan és bármikor elérhető.
+- Egy platform weboldalak, web-appok, és játékok készítéséhez/közzétételéhez.
+- A Dropbox, Google Drive, OneDrive (stb.) alternatívája megújult felülettel és hatékony funkciókkal.
+- Egy távoli desktop-környezet szervereknek és workstation-öknek.
+- Egy barátságos, nyílt forráskódú projekt és közösség, amely a webfejlesztéssel, a felhőalapú számítástechnikával, elosztott rendszerekkel és sok más érdekes témával foglalkozik!
+
+
+
+## Első lépések
+
+
+### 💻 Helyi (lokális) fejlesztés
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Ezzel a http://puter.localhost:4100 -on futtatjuk Putert. (vagy a legközelebbi elérhető porton).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+A Puter elérhető hostolt szolgáltatásként a [**puter.com**](https://puter.com) címen.
+
+
+
+## Rendszerkövetelmények
+
+- **Operációs rendszerek:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB ajánlott)
+- **Tárhely:** 1GB szabad tárhely
+- **Node.js:** 16+ (22+ verzió ajánlott)
+- **npm:** legújabb stabil verzió
+
+
+
+## Támogatás
+
+Lépj kapcsolatba a fejlesztőkkel és a közösséggel az alábbi platformokon:
+
+- Észrevételeid/javaslataid vannak? Az [alábbi linken](https://github.com/HeyPuter/puter/issues/new/choose) megoszthatod velünk.
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Biztonsági hibák? [security@puter.com](mailto:security@puter.com)
+- A fejlesztőket a [hi@puter.com](mailto:hi@puter.com) email címen érheted el.
+
+
+Mindig örömmel segítünk bármilyen felmerülő kérdésben. Bátran kérdezz tőlünk!
+
+
+
+
+## License
+
+
+Ez a repo, beleértve annak minden tartalmát, alprojektjeit, moduljait és komponenseit, az [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) licenc alatt áll, hacsak másképp nem rendelkeznek róla. A repoban szereplő harmadik fél által fejlesztett könyvtárak saját licencfeltételek alá eshetnek.
+
+
diff --git a/doc/i18n/README.hy.md b/doc/i18n/README.hy.md
new file mode 100644
index 0000000000..e10931e3bc
--- /dev/null
+++ b/doc/i18n/README.hy.md
@@ -0,0 +1,127 @@
+
+
+Ինտերնետ ՕՀ! Անվճար, բաց կոդով և ինքնահոսթ հնարավորությամբ։
+
+
+
+
+
+ « Օնլայն դեմո »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter-ը առաջադեմ, բաց կոդով ինտերնետային օպերացիոն համակարգ է, որը նախագծված է լինել ֆունկցիոնալ հարուստ, բացառիկ արագ և բարձր ընդլայնելի։ Puter-ը կարող է օգտագործվել հետևյալ կերպ․
+
+- Անձնական ամպային համակարգ՝ առաջնային գաղտնիությամբ, որը թույլ է տալիս պահել ձեր բոլոր ֆայլերը, հավելվածները և խաղերը մեկ անվտանգ վայրում, որը հասանելի է ցանկացած վայրից և ցանկացած ժամանակ։
+- Պլատֆորմ կայքերի, վեբ հավելվածների և խաղերի ստեղծման և հրապարակման համար։
+- Dropbox, Google Drive, OneDrive և այլ ծառայությունների այլընտրանք՝ նոր ինտերֆեյսով և հզոր գործառույթներով։
+- Հեռավոր աշխատասեղանի միջավայր սերվերների և աշխատանքային կայանների համար։
+- Պարզ, բաց կոդով նախագիծ և համայնք՝ վեբ ծրագրավորման, ամպային հաշվարկների, բաշխված համակարգերի և այլ թեմաների մասին սովորելու համար։
+
+
+
+## Սկսել
+
+
+### 💻 Լոկալ ծրագրավորում
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Սա կգործակի Puter-ը հետևյալ հասցեով՝ http://puter.localhost:4100 (կամ հաջորդ հասանելի պորտով)։
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter-ը հասանելի է որպես հյուրընկալվող ծառայություն [**puter.com**](https://puter.com).
+
+
+
+## System Requirements
+
+- **Օպերացիոն համակարգ:** Linux, macOS, Windows
+- **Օպերատիվ հիշողություն:** 2GB նվազագույնը (4GB խորհուրդ է տրվում)
+- **Համակարգչի հիշողություն:** 1GB ազատ տարածություն
+- **Node.js:** Տարբերակ 16+ (Տարբերակ 22+ խորհուրդ է տրվում)
+- **npm:** Վերջին կայուն տարբերակը
+
+
+
+## Աջակցություն
+
+Կապվեք համակարգողների և համայնքի հետ այս կայքերի միջոցով՝
+
+- Սխալների կամ գործառույթի հարցում՝ (https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Անվտանգության խնդիրներ՝ [security@puter.com](mailto:security@puter.com)
+- Email maintainers at [hi@puter.com](mailto:hi@puter.com)
+
+Մենք միշտ ուրախ ենք օգնել ձեզ ցանկացած հարցում։ Մի կաշկանդվեք հարցնել։
+
+
+
+
+## Լիցենզիա
+
+Այս պահոցարանը, ներառյալ բոլոր իր բովանդակությունը, ենթա-պրոյեկտները, մոդուլները և բաղադրիչները, լիցենզավորվում են [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) լիցենզիայի տակ, եթե այլ կերպ հստակ նշված չէ։ Այս պահոցարանում ներառված երրորդ կողմի գրադարանները կարող են ենթարկվել իրենց սեփական լիցենզիաներին։
+
+
diff --git a/doc/i18n/README.id.md b/doc/i18n/README.id.md
new file mode 100644
index 0000000000..50057b206b
--- /dev/null
+++ b/doc/i18n/README.id.md
@@ -0,0 +1,127 @@
+
+
+Sistem Operasi Internet! Gratis, Sumber Terbuka, dan Dapat Dihosting Sendiri.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter adalah sistem operasi internet canggih, open-source, yang dirancang untuk menjadi kaya fitur, sangat cepat, dan sangat dapat diperluas. Puter dapat digunakan sebagai:
+
+- Cloud pribadi yang mengutamakan privasi untuk menyimpan semua file, aplikasi, dan permainan Anda di satu tempat yang aman, yang dapat diakses dari mana saja kapan saja.
+- Platform untuk membangun dan mempublikasikan situs web, aplikasi web, dan permainan.
+- Alternatif untuk Dropbox, Google Drive, OneDrive, dll. Dengan antarmuka baru dan fitur-fitur canggih.
+- Lingkungan desktop jarak jauh untuk server dan workstation.
+- Proyek dan komunitas open-source yang ramah untuk belajar tentang pengembangan web, komputasi gemawan (cloud), sistem terdistribusi, dan banyak lagi!
+
+
+
+## Memulai
+
+
+### 💻 Pengembangan Lokal
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Ini akan menjalankan Puter di http://puter.localhost:4100 (atau di port berikutnya yang tersedia)
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter tersedia sebagai layanan yang telah dihosting di [**puter.com**](https://puter.com).
+
+
+
+## Persyaratan Sistem
+
+- **Sistem Operasi:** Linux, macOS, Windows
+- **RAM:** 2GB minimal (rekomendasi 4GB)
+- **Penyimpanan:** 1GB ruang tersedia
+- **Node.js:** Version 16+ (rekomendasi versi 22+)
+- **npm:** Versi stabil termutakhir
+
+
+
+## Dukuangan
+
+Terhubung dengan maintainer dan komunitas melalui saluran-saluran berikut:
+
+- Laporan bug atau permintaan fitur? Silakan [buat issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Isu keamanan? [security@puter.com](mailto:security@puter.com)
+- Email maintainers di [hi@puter.com](mailto:hi@puter.com)
+
+Kami selalu senang membantu Anda dengan pertanyaan apa pun yang Anda miliki. Jangan ragu untuk bertanya!
+
+
+
+
+## Lisensi
+
+Repositori ini, termasuk semua isinya, sub-proyek, modul, dan komponen, dilisensikan di bawah [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) kecuali dinyatakan sebaliknya secara eksplisit. Perpustakaan pihak ketiga yang termasuk dalam repositori ini mungkin tunduk pada lisensinya sendiri.
+
+
diff --git a/doc/i18n/README.it.md b/doc/i18n/README.it.md
new file mode 100644
index 0000000000..966575cb77
--- /dev/null
+++ b/doc/i18n/README.it.md
@@ -0,0 +1,128 @@
+
+
+Il sistema operativo di Internet! Gratuito, Open-Source e Auto-Hostabile.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter è un sistema operativo di Internet avanzato e open-source, progettato per essere ricco di funzionalità, eccezionalmente veloce e altamente estensibile. Puter può essere utilizzato come:
+
+- Un cloud personale che tiene conto della privacy per conservare tutti i file, le app e i giochi in un luogo sicuro, accessibile da qualsiasi luogo e in qualsiasi momento.
+- Una piattaforma per creare e pubblicare siti web, app e giochi.
+- Un'alternativa a Dropbox, Google Drive, OneDrive, ecc. con un'interfaccia nuova e funzioni potenti.
+- Un ambiente desktop remoto per server e workstation.
+- Un progetto e una comunità open-source amichevole per imparare lo sviluppo web, il cloud computing, i sistemi distribuiti e molto altro ancora!
+
+
+
+## Getting Started
+
+
+### 💻 Local Development
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+In questo modo Puter verrà avviato all'indirizzo http://puter.localhost:4100 (o alla prossima porta disponibile).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter è disponibile come servizio in hosting su [**puter.com**](https://puter.com).
+
+
+
+## Requisiti di Sistema
+
+- **Sistema Operativo:** Linux, macOS, Windows
+- **RAM:** 2GB minimi (4GB raccomandati)
+- **Spazio su Disco:** 1GB liberi
+- **Node.js:** Versione 16+ (Versione 22+ raccomandati)
+- **npm:** Ultima versione stabile
+
+
+
+## Supporto
+
+Collegatevi con i maintainers e la comunità attraverso questi canali:
+
+- Segnalazione di bug o richiesta di funzionalità? Perfavore [aprire una issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Problemi di sicurezza? [security@puter.com](mailto:security@puter.com)
+- Email maintainers a [hi@puter.com](mailto:hi@puter.com)
+
+Siamo sempre felici di aiutarvi con qualsiasi domanda. Non esitate a chiedere!
+
+
+
+
+## Licenza
+
+Questo repository, compresi tutti i suoi contenuti, sottoprogetti, moduli e componenti, è concesso in licenza [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), a meno che non sia esplicitamente indicato diversamente. Le librerie di terze parti incluse in questo repository possono essere soggette alle loro licenze.
+
+
+
diff --git a/doc/i18n/README.jp.md b/doc/i18n/README.jp.md
new file mode 100644
index 0000000000..b26d848820
--- /dev/null
+++ b/doc/i18n/README.jp.md
@@ -0,0 +1,123 @@
+
+
+
+インターネットOS!無料、オープンソース、セルフホスト可能。
+
+
+
+
+
+ « ライブデモ »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puterは、機能豊富で非常に高速、そして高い拡張性を持つ、先進的なオープンソースのインターネットオペレーティングシステムです。Puterは以下の用途に利用できます:
+
+- プライバシーを最優先するパーソナルクラウドとして、あなたのファイル、アプリ、ゲームを一か所で安全に管理し、どこからでもアクセス可能に。
+- ウェブサイト、ウェブアプリ、ゲームの作成と公開のためのプラットフォーム。
+- Dropbox、Google Drive、OneDriveなどの代替として、新しいインターフェースと強力な機能を提供。
+- サーバーやワークステーションのためのリモートデスクトップ環境。
+- ウェブ開発、クラウドコンピューティング、分散システムなどを学ぶための、フレンドリーでオープンなコミュニティとプロジェクト。
+
+
+
+## はじめに
+
+
+### 💻 ローカル開発
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+これでPuterが http://puter.localhost:4100 (または次に利用可能なポート)で起動します。
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puterは[**puter.com**](https://puter.com)でホストサービスとして利用可能です。
+
+
+
+## システム要件
+
+- **オペレーティングシステム:** Linux, macOS, Windows
+- **RAM:** 最小2GB(推奨4GB)
+- **ディスクスペース:** 1GBの空き容量
+- **Node.js:** バージョン16以上(推奨バージョン22以上)
+- **npm:** 最新の安定バージョン
+
+
+
+## サポート
+
+メンテナーやコミュニティと以下のチャンネルを通じてつながりましょう:
+
+- バグ報告や機能リクエストがありますか? [issueを開く](https://github.com/HeyPuter/puter/issues/new/choose) してください。
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- セキュリティの問題? [security@puter.com](mailto:security@puter.com)
+- メンテナーへのメールは [hi@puter.com](mailto:hi@puter.com) まで
+
+質問があれば、いつでもお気軽にお問い合わせください!
+
+
+
+## ライセンス
+
+このリポジトリ、ならびにそのすべてのコンテンツ、サブプロジェクト、モジュール、コンポーネントは、[AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt)の下でライセンスされています。明示的に異なるライセンスが示されている場合を除きます。このリポジトリに含まれるサードパーティのライブラリは、それぞれのライセンスが適用される場合があります。
+
+
diff --git a/doc/i18n/README.ko.md b/doc/i18n/README.ko.md
new file mode 100644
index 0000000000..841b0a0785
--- /dev/null
+++ b/doc/i18n/README.ko.md
@@ -0,0 +1,127 @@
+
+
+Puter: 인터넷 OS! 무료이고 오픈소스이며 자체 호스팅이 가능합니다.
+
+
+
+
+
+ « 시연 영상 »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter는 오픈소스 인터넷 운영 체제로, 매우 빠르고 확장성이 뛰어나며 새로운 인터페이스와 다양한 기능을 갖추고 있습니다. Puter는 다음과 같이 사용될 수 있습니다:
+
+- 모든 파일, 앱, 게임을 한 곳에 안전하게 보관하고 언제 어디서나 접근할 수 있는 프라이버시 중심의 개인 클라우드로 사용할 수 있습니다.
+- 웹사이트, 웹 앱, 게임을 구축하고 배포하는 플랫폼으로 활용할 수 있습니다.
+- Dropbox, Google Drive, OneDrive 등의 대안으로 사용할 수 있으며 보다 발전된 기능과 인터페이스를 제공합니다.
+- 서버와 워크스테이션을 위한 원격 데스크톱 환경으로 활용할 수 있습니다.
+- 웹 개발, 클라우드 컴퓨팅, 분산 시스템 등에 대해 배울 수 있는 친근한 오픈소스 프로젝트이자 커뮤니티입니다!
+
+
+
+## 시작하기
+
+
+### 💻 로컬 환경 개발
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+위처럼 실행할 시 Puter는 http://puter.localhost:4100 (또는 사용 가능한 다음 포트)에서 실행됩니다.
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter는 [**puter.com**](https://puter.com)에서 호스팅 서비스로 이용할 수 있습니다.
+
+
+
+## 시스템 요구사항
+
+- **Operating Systems:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB recommended)
+- **Disk Space:** 1GB free space
+- **Node.js:** Version 16+ (Version 22+ recommended)
+- **npm:** Latest stable version
+
+
+
+## 지원
+
+다음 채널을 통해 관리자 및 커뮤니티와 소통하세요:
+
+- 버그 신고나 기능 요청이 있으신가요? [이슈를 열어주세요.](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- 보안 관련 문제는 [security@puter.com](mailto:security@puter.com) 으로 연락주세요.
+- 관리자에게 이메일 보내기: [hi@puter.com](mailto:hi@puter.com)
+
+어떤 질문이든 기꺼이 도와드리겠습니다. 언제든 물어보세요!
+
+
+
+
+## 라이선스
+
+이 저장소는 모든 내용, 하위 프로젝트, 모듈 및 구성 요소를 포함하여 명시적으로 달리 명시되지 않는 한 [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) 라이선스 하에 제공됩니다. 이 저장소에 포함된 제3자 라이브러리는 해당 라이브러리의 고유 라이선스를 따를 수 있습니다.
+
+
diff --git a/doc/i18n/README.ml.md b/doc/i18n/README.ml.md
new file mode 100644
index 0000000000..bbb6270ca3
--- /dev/null
+++ b/doc/i18n/README.ml.md
@@ -0,0 +1,128 @@
+
+
+ഇന്റർനെറ്റ് ഓപ്പറേറ്റിംഗ് സിസ്റ്റം! സൗജന്യവും, ഓപ്പൺ സോഴ്സും സ്വയം ഹോസ്റ്റ് ചെയ്യാൻ പറ്റുന്നതും
+
+
+
+
+
+ « ലൈവ് ഡെമോ »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## പ്യൂട്ടർ (Puter)
+
+ഫീച്ചറുകളാൽ സമ്പുഷ്ടവും അസാധാരണമാംവിധം വേഗതയേറിയതും,വളരെ വിപുലീകരിക്കാവുന്നതുമായ ഒരു നൂതന, ഓപ്പൺ സോഴ്സ് ഇന്റർനെറ്റ് ഓപ്പറേറ്റിംഗ് സിസ്റ്റമാണ് പ്യൂട്ടർ. പ്യൂട്ടർ ഇനിപ്പറയുന്ന രീതിയിൽ ഉപയോഗിക്കാം:
+
+- നിങ്ങളുടെ എല്ലാ ഫയലുകളും ആപ്പുകളും ഗെയിമുകളും ഒരു സുരക്ഷിത സ്ഥലത്ത് സൂക്ഷിക്കുന്നതിനുള്ള, സ്വകാര്യതയ്ക്ക് മുൻഗണന കൊടുക്കുന്ന ആദ്യത്തെ വ്യക്തിഗത ക്ലൗഡ്, എവിടെ നിന്നും എപ്പോൾ വേണമെങ്കിലും ആക്സസ് ചെയ്യാൻ കഴിയും.
+- വെബ്സൈറ്റുകൾ, വെബ് ആപ്പുകൾ, ഗെയിമുകൾ എന്നിവ നിർമ്മിക്കുന്നതിനും പ്രസിദ്ധീകരിക്കുന്നതിനുമുള്ള ഒരു പ്ലാറ്റ്ഫോം.
+- പുതിയ ഇന്റർഫേസും, ശക്തമായ ഫീച്ചറുകളും അടങ്ങിയ, ഡ്രോപ്പ്ബോക്സ്, ഗൂഗിൾ ഡ്രൈവ്, വൺഡ്രൈവ് മുതലായവയ്ക്കുള്ള ബദൽ.
+- സെർവറുകൾക്കും വർക്ക്സ്റ്റേഷനുകൾക്കും, ഒരു വിദൂര ഡെസ്ക്ടോപ്പ് പരിസ്ഥിതി.
+- വെബ് ഡെവലപ്മെന്റ്, ക്ലൗഡ് കംപ്യൂട്ടിംഗ്, ഡിസ്ട്രിബ്യൂട്ടഡ് സിസ്റ്റങ്ങൾ എന്നിവയെ കുറിച്ചും, അതിലേറെ കാര്യങ്ങളെ കുറിച്ചും അറിയാനുള്ള സൗഹൃദപരവും ഓപ്പൺ സോഴ്സുമായ പ്രോജക്റ്റും കമ്മ്യൂണിറ്റിയും!
+
+
+
+## തുടങ്ങാനായി
+
+
+### 💻 ലോക്കൽ ഡെവലപ്മെന്റ്
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+
+ഇത് http://puter.localhost:4100 (അല്ലെങ്കിൽ അടുത്ത ലഭ്യമായ പോർട്ടിൽ) എന്നതിൽ Puter സമാരംഭിക്കും
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+പ്യൂട്ടർ [**puter.com**](https://puter.com) എന്നതിൽ ഹോസ്റ്റ് ചെയ്ത സേവനമായി ലഭ്യമാണ്.
+
+
+
+## സിസ്റ്റത്തിന്റെ ആവശ്യകതകൾ
+
+- **ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങൾ:** ലിനക്സ്, മാക്ക് ഒഎസ്, വിൻഡോസ്
+- **RAM:** 2GB കുറഞ്ഞത് (4GB ശുപാർശ ചെയ്യുന്നു)
+- **ഡിസ്ക് സ്പേസ്:** 1GB ഒഴിഞ്ഞ ഇടം
+- **Node.js:** Version 16+ (Version 22+ ശുപാർശ ചെയ്യുന്നു)
+- **npm:** ഏറ്റവും പുതിയ സ്ഥിരതയുള്ള പതിപ്പ്
+
+
+
+## പിന്തുണ
+
+ഈ ചാനലുകളിലൂടെ പരിപാലിക്കുന്നവരുമായും കമ്മ്യൂണിറ്റിയുമായും ബന്ധപ്പെടുക:
+
+- ബഗ്ഗ് റിപ്പോർട്ടോ, ഫീച്ചർ റിക്ക്വസ്റ്റോ ഉണ്ടോ? ദയവുചെയ്ത് [ഒരു ഇഷ്യൂ തുടങ്ങുക](https://github.com/HeyPuter/puter/issues/new/choose).
+- ഡിസ്കോർഡ്: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- എക്സ് (ട്വിറ്റർ): [x.com/HeyPuter](https://x.com/HeyPuter)
+- റെഡ്ഡിറ്റ്: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- മാസ്റ്റഡൺ: [mastodon.social/@puter](https://mastodon.social/@puter)
+- സുരക്ഷാ പ്രശ്നങ്ങളുണ്ടോ? [security@puter.com](mailto:security@puter.com)
+- ഇമെയിൽ മെയിന്റൈനർമാർ: [hi@puter.com](mailto:hi@puter.com)
+
+നിങ്ങൾക്ക് ഉണ്ടായേക്കാവുന്ന ഏത് ചോദ്യങ്ങളിലും നിങ്ങളെ സഹായിക്കുന്നതിൽ ഞങ്ങൾക്ക് എപ്പോഴും സന്തോഷമുണ്ട്. ചോദിക്കാൻ മടിക്കേണ്ട!
+
+
+
+
+## ലൈസൻസ്
+
+ഈ ശേഖരം, അതിന്റെ എല്ലാ ഉള്ളടക്കങ്ങളും, ഉപപദ്ധതികളും, മൊഡ്യൂളുകളും, ഘടകങ്ങളും ഉൾപ്പെടെ, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) എന്നതിന് കീഴിൽ ലൈസൻസുള്ളതാണ്. ഈ ശേഖരത്തിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന മൂന്നാം കക്ഷി ലൈബ്രറികൾ അവരുടെ സ്വന്തം ലൈസൻസുകൾക്ക് വിധേയമായിരിക്കാം.
+
+
diff --git a/doc/i18n/README.my.md b/doc/i18n/README.my.md
new file mode 100644
index 0000000000..769ab0902c
--- /dev/null
+++ b/doc/i18n/README.my.md
@@ -0,0 +1,127 @@
+
+
+Sistem Operasi Internet! Percuma, Sumber Terbuka, dan Boleh Dihoskan Sendiri.
+
+
+
+
+
+ « DEMO SECARA LANGSUNG »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter ialah sistem operasi internet sumber terbuka yang maju dan direka untuk kaya dengan ciri kefungsian, kepantasan luar biasa dan kebolehluasan yang tinggi. Puter boleh digunakan sebagai:
+
+- Storan awan peribadi yang mendahulukan privasi untuk menyimpan semua fail, aplikasi dan permainan anda di satu tempat yang selamat dan boleh diakses dari mana sahaja pada bila-bila masa.
+- Platform untuk membina dan menerbitkan laman web, aplikasi web dan permainan.
+- Alternatif kepada Dropbox, Google Drive, OneDrive, dan lain-lain dengan antara muka yang baharu dan ciri kefungsian berkuasa tinggi.
+- Persekitaran desktop awan untuk server dan stesen kerja.
+- Projek dan komuniti sumber terbuka yang mesra untuk mempelajari pembangunan laman web, pengkomputeran awan, sistem teragih, dan banyak lagi!
+
+
+
+## Mulakan
+
+
+### 💻 Pembangunan Lokal
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Ini akan melancarkan Puter di http://puter.localhost:4100 (atau port seterusnya yang tersedia).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter tersedia sebagai perkhidmatan terhos di [**puter.com**](https://puter.com).
+
+
+
+## Keperluan Sistem
+
+- **Sistem Operasi:** Linux, macOS, Windows
+- **RAM:** Minimum 2GB (sebaiknya 4GB)
+- **Ruang Storan:** 1GB ruang kosong
+- **Node.js:** Versi 16+ (sebaiknya Versi 22+)
+- **npm:** Versi stabil yang terkini
+
+
+
+## Sokongan
+
+Berhubung dengan penyelenggara dan komuniti melalui saluran berikut:
+
+- Laporan pepijat atau permintaan ciri? Sila [buka isu baharu](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Isu keselamatan? [security@puter.com](mailto:security@puter.com)
+- Emel penyelenggara melalui [hi@puter.com](mailto:hi@puter.com)
+
+Kami sentiasa gembira untuk membantu anda dengan apa-apa soalan. Jangan takut untuk bertanya!
+
+
+
+
+## Lesen
+
+Repositori ini, termasuklah kandungannya, subprojek, modul dan komponen, dilesenkan di bawah [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) melainkan dinyatakan sebaliknya. *Library* pihak ketiga yang terkandung dalam repositori ini tertakluk kepada lesen mereka sendiri.
+
+
diff --git a/doc/i18n/README.nl.md b/doc/i18n/README.nl.md
new file mode 100644
index 0000000000..5002624c39
--- /dev/null
+++ b/doc/i18n/README.nl.md
@@ -0,0 +1,127 @@
+
+
+Het Internet OS! Gratis, Open-Source en Zelf te Hosten.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter is een geavanceerd, open-source internetbesturingssysteem ontworpen om functierijk, uitzonderlijk snel en zeer uitbreidbaar te zijn. Puter kan worden gebruikt als:
+
+- Een privacy-gerichte persoonlijke cloud om al je bestanden, apps en games op één veilige plek te bewaren, overal en altijd toegankelijk.
+- Een platform voor het bouwen en publiceren van websites, web-apps en games.
+- Een alternatief voor Dropbox, Google Drive, OneDrive, etc. met een frisse interface en krachtige functies.
+- Een externe desktopomgeving voor servers en werkstations.
+- Een vriendelijk, open-source project en gemeenschap om te leren over webontwikkeling, cloud computing, gedistribueerde systemen en veel meer!
+
+
+
+## Aan de slag
+
+
+### 💻 Lokale Ontwikkeling
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Dit zal Puter starten op http://puter.localhost:4100 (of de eerstvolgende beschikbare poort).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter is beschikbaar als een gehoste service op [**puter.com**](https://puter.com).
+
+
+
+## Systeemvereisten
+
+- **Besturingssystemen:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB aanbevolen)
+- **Schijfruimte:** 1GB vrije ruimte
+- **Node.js:** Versie 16+ (Versie 22+ aanbevolen)
+- **npm:** Laatste stabiele versie
+
+
+
+## Ondersteuning
+
+Verbind met de onderhouders en de gemeenschap via deze kanalen:
+
+- Bug rapport of functieverzoek? [Open een issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Beveiligingsproblemen? [security@puter.com](mailto:security@puter.com)
+- E-mail onderhouders op [hi@puter.com](mailto:hi@puter.com)
+
+We helpen je graag met al je vragen. Aarzel niet om te vragen!
+
+
+
+
+## Licentie
+
+Deze repository, inclusief alle inhoud, subprojecten, modules en componenten, is gelicentieerd onder [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) tenzij expliciet anders vermeld. Bibliotheken van derden die in deze repository zijn opgenomen, kunnen onderworpen zijn aan hun eigen licenties.
+
+
\ No newline at end of file
diff --git a/doc/i18n/README.od.md b/doc/i18n/README.od.md
new file mode 100644
index 0000000000..0107952d3a
--- /dev/null
+++ b/doc/i18n/README.od.md
@@ -0,0 +1,148 @@
+
+
+ଇଣ୍ଟରନେଟ OS! ନିଶୁଳ୍କ, ଖୋଲା-ମୂଳ (Open-Source), ଏବଂ ସ୍ୱୟଂ-ହୋଷ୍ଟ କରିପାରିବା।
+
+
+ « LIVE ଡେମୋ »
+
+
+ Puter.com
+ ·
+ App Store
+ ·
+ Developers
+ ·
+ CLI
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X
+
+
+
+
+
+
+## Puter
+
+Puter ହେଉଛି ଗୋଟିଏ ଉନ୍ନତ, ଖୋଲା-ମୂଳ ଇଣ୍ଟରନେଟ ଅପରେଟିଂ ସିଷ୍ଟମ, ଯାହାକି ବିଶେଷତାସମୃଦ୍ଧ, ଶୀଘ୍ର ଏବଂ ଏକ୍ସଟେନ୍ସିବଲ ଭାବେ ଡିଜାଇନ୍ କରାଯାଇଛି। Puter କୁ ନିମ୍ନ ପ୍ରକାରେ ବ୍ୟବହାର କରିପାରିବେ:
+
+- ଗୋଟିଏ ପ୍ରାଇଭେସି-ପ୍ରଥମ (privacy-first) ପର୍ସନାଲ କ୍ଲାଉଡ୍ ଭାବେ — ଯେଉଁଠାରେ ଆପଣଙ୍କ ସମସ୍ତ ଫାଇଲ୍, ଆପ୍ସ ଏବଂ ଗେମ୍ସ ଗୋଟିଏ ସୁରକ୍ଷିତ ସ୍ଥାନରେ ରହିବ, ଯାହାକୁ କେଉଁଠୁ ସମୟରେ ଆକ୍ସେସ୍ କରିପାରିବେ।
+- ୱେବସାଇଟ୍, ୱେବ ଆପ୍ସ, ଏବଂ ଗେମ୍ ତିଆରି ଏବଂ ପ୍ରକାଶ ପାଇଁ ଗୋଟିଏ ପ୍ଲାଟଫର୍ମ।
+- Dropbox, Google Drive, OneDrive ଇତ୍ୟାଦିଙ୍କ ବିକଳ୍ପ ଭାବେ — ଏକ ସୁନ୍ଦର ଇଣ୍ଟରଫେସ୍ ଏବଂ ଶକ୍ତିଶାଳୀ ବୈଶିଷ୍ଟ ସହିତ।
+- ସର୍ଭର ଏବଂ ଓର୍କସ୍ଟେସନ୍ ପାଇଁ ଗୋଟିଏ ରିମୋଟ୍ ଡେସ୍କଟପ୍ ଇନ୍ଭାୟରମେଣ୍ଟ।
+- ୱେବ୍ ଡିଭେଲପମେଣ୍ଟ, କ୍ଲାଉଡ୍ କମ୍ପ୍ୟୁଟିଙ୍ଗ, ବିତରିତ ସିଷ୍ଟମ (distributed systems) ଇତ୍ୟାଦି ଶିଖିବା ପାଇଁ ଗୋଟିଏ ସହଜ-ମନୋଭାବୀ ଖୋଲା-ମୂଳ ସମୁଦାୟ।
+
+
+
+## ପ୍ରାରମ୍ଭ (Getting Started)
+
+### 💻 Local Development
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
+ http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍)
+
+ଯଦି ଏହା କାମ କରୁନାହିଁ, ତେବେ [First Run Issues](./doc/self-hosters/first-run-issues.md) କୁ ଦେଖନ୍ତୁ।
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
+ http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍)
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+**→** ଏହା ଉପଲବ୍ଧ ହେବ:
+ http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍)
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
+ http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍)
+
+
+
+### 🚀 Self-Hosting
+
+Self-Hosting ପାଇଁ ବିସ୍ତୃତ ଗାଇଡ୍, କନଫିଗୁରେସନ୍ ଅପ୍ସନ୍ ଏବଂ ବେଷ୍ଟ-ପ୍ରାକ୍ଟିସ୍ ପାଇଁ ଏଠାରେ ଯାଆନ୍ତୁ:
+[Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md)
+
+
+
+### ☁️ Puter.com
+
+Puter ହୋଷ୍ଟେଡ୍ ସର୍ଭିସ୍ ଭାବେ ଉପଲବ୍ଧ ଅଛି: [**puter.com**](https://puter.com)
+
+
+
+## ସିଷ୍ଟମ ଆବଶ୍ୟକତା (System Requirements)
+
+- **Operating Systems:** Linux, macOS, Windows
+- **RAM:** ଅନ୍ୟୁନ 2GB (ପରାମର୍ଶ 4GB)
+- **Disk Space:** 1GB ଖାଲି ସ୍ଥାନ
+- **Node.js:** ସଂସ୍କରଣ 20.19.5+ (ପରାମର୍ଶ 23+)
+- **npm:** ନବୀନତମ ସ୍ଥିର ସଂସ୍କରଣ
+
+
+
+## ସହଯୋଗ (Support)
+
+ମେଣ୍ଟେନର୍ ଏବଂ ସମୁଦାୟ ସହିତ ଯୋଡ଼ିବା ପାଇଁ:
+
+- Bug report କିମ୍ବା ନୂଆ feature ବାବଦରେ? [open an issue](https://github.com/HeyPuter/puter/issues/new/choose)
+- Discord: https://discord.com/invite/PQcx7Teh8u
+- X (Twitter): https://x.com/HeyPuter
+- Reddit: https://www.reddit.com/r/puter/
+- Mastodon: https://mastodon.social/@puter
+- Security issues? [security@puter.com](mailto:security@puter.com)
+- Maintainer Email: [hi@puter.com](mailto:hi@puter.com)
+
+ଆମେ ସମସ୍ତେ ସହାୟତା ପାଇଁ ସଦା ପ୍ରସ୍ତୁତ।
+
+
+
+## ଲାଇସେନ୍ସ (License)
+
+ଏହି ରିପୋଜିଟୋରୀ, ସମସ୍ତ ସବ୍-ପ୍ରୋଜେକ୍ଟ, ମୋଡ୍ୟୁଲ୍ ଏବଂ କମ୍ପୋନେଣ୍ଟ ସହିତ **AGPL-3.0** ଲାଇସେନ୍ସ ଅଧୀନରେ ରହିଛି।
+ତୃତୀୟ ପକ୍ଷ ଲାଇବ୍ରେରି ନିଜସ୍ୱ ଲାଇସେନ୍ସ ଅଧୀନରେ ଥାଇପାରେ।
+
+
+
+## ଅନ୍ୟ README ଲିଙ୍କ୍ (Links to Other READMEs)
+
+### Backend
+- [PuterAI Module](./src/backend/doc/modules/puterai/README.md)
+- [Metering Service](./src/backend/src/services/MeteringService/README.md)
+- [Extensions Development Guide](./extensions/README.md)
diff --git a/doc/i18n/README.pa.md b/doc/i18n/README.pa.md
new file mode 100644
index 0000000000..0f29c8c146
--- /dev/null
+++ b/doc/i18n/README.pa.md
@@ -0,0 +1,182 @@
+
+
+ਇੰਟਰਨੇਟ ਓਐਸ! ਮੁਫ਼ਤ, ਖੁੱਲ੍ਹੇ ਸਰੋਤ ਵਾਲਾ, ਅਤੇ ਆਪ ਸਵੈ-ਹੋਸਟ ਕਰ ਸਕਦੇ ਹੋ।
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ ਐਪ ਸਟੋਰ
+ ·
+ ਡਿਵੈਲਪਰ
+ ·
+ CLI
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X
+
+
+
+
+
+
+## Puter
+
+Puter ਇੱਕ ਵਿਕਸਤ, ਖੁੱਲ੍ਹਾ-ਸਰੋਤ ਇੰਟਰਨੇਟ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਹੈ ਜੋ ਫੀਚਰ-ਭਰਪੂਰ, ਬਹੁਤ ਤੇਜ਼, ਅਤੇ ਵਧੀਆ ਤਰੀਕੇ ਨਾਲ ਵਧਾਏ ਜਾਣ ਵਾਲਾ ਬਣਾਇਆ ਗਿਆ ਹੈ। Puter ਇਸ ਤਰ੍ਹਾਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ:
+
+- ਇੱਕ ਪਰਾਈਵੇਸੀ-ਪਹਿਲਾਂ ਨਿੱਜੀ ਕਲਾਊਡ ਵਜੋਂ ਜਿੱਥੇ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਫਾਈਲਾਂ, ਐਪਸ, ਅਤੇ ਗੇਮਜ਼ ਇੱਕ ਸੁਰੱਖਿਅਤ ਜਗ੍ਹਾ 'ਤੇ, ਕਿਸੇ ਵੀ ਸਮੇਂ-ਕਿਤੇ ਵੀ ਤੋਂ ਪਹੁੰਚਯੋਗ।
+- ਵੈਬਸਾਈਟਾਂ, ਵੈਬ ਐਪਸ, ਅਤੇ ਗੇਮ ਬਣਾਉਣ ਅਤੇ ਪ੍ਰਕਾਸ਼ਿਤ ਕਰਨ ਲਈ ਇੱਕ ਪਲੇਟਫਾਰਮ।
+- Dropbox, Google Drive, OneDrive ਆਦਿ ਦਾ ਇੱਕ ਆਧੁਨਿਕ ਵਿਕਲਪ, ਨਵੀਂ ਇੰਟਰਫੇਸ ਅਤੇ ਸ਼ਕਤੀਸ਼ਾਲੀ ਫੀਚਰਾਂ ਨਾਲ।
+- ਸਰਵਰਾਂ ਅਤੇ ਵਰਕਸਟੇਸ਼ਨਾਂ ਲਈ ਰਿਮੋਟ ਡੈਸਕਟਾਪ Environment।
+- ਵੈਬ ਡਿਵੈਲਪਮੈਂਟ, ਕਲਾਊਡ ਕੰਪਿਊਟਿੰਗ, ਡਿਸਟ੍ਰੀਬਿਊਟਡ ਸਿਸਟਮ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਸਿੱਖਣ ਲਈ ਇੱਕ ਮਿੱਤਰਤਾਪੂ, ਖੁੱਲ੍ਹੇ-ਸਰੋਤ ਵਾਲਾ ਪ੍ਰੋਜੈਕਟ ਅਤੇ ਸਮੂਹ!
+
+
+
+## Getting Started
+
+### 💻 Local Development
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
+ http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ).
+
+ਜੇ ਇਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਤਾੰ [First Run Issues](./doc/self-hosters/first-run-issues.md) ਵੇਖੋ
+ਟ੍ਰਬਲਸ਼ੂਟਿੰਗ ਲਈ।
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
+ http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ).
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+**→** ਇਹ ਇਸ ਪਤੇ 'ਤੇ ਉਪਲਬਧ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ
+ http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ).
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
+ http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ).
+
+
+
+### 🚀 Self-Hosting
+
+Puter ਨੂੰ ਖੁਦ ਹੋਸਟ ਕਰਨ ਲਈ, ਕਨਫਿਗੁਰੇਸ਼ਨ ਵਿਕਲਪ ਅਤੇ ਬਿਹਤਰੀਨ ਕਾਇਦੇ, ਸਾਰੇ ਵਿਸਥਾਰ ਲਈ ਸਾਡੇ [Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md) ਵੇਖੋ।
+
+
+
+### ☁️ Puter.com
+
+Puter [**puter.com**](https://puter.com) 'ਤੇ ਇੱਕ ਹੋਸਟ ਕੀਤੀ ਸੇਵਾ ਵਜੋਂ ਉਪਲਬਧ ਹੈ।
+
+
+
+## System Requirements
+
+- **Operating Systems:** Linux, macOS, Windows
+- **RAM:** ਘੱਟੋ-ਘੱਟ 2GB (4GB ਸਿਫ਼ਾਰਸ਼ੀ)
+- **Disk Space:** 1GB ਖਾਲੀ ਜਗ੍ਹਾ
+- **Node.js:** Version 24+
+- **npm:** ਨਵੀਨਤਮ ਸਥਿਰ ਵਰਜਨ
+
+
+
+## Support
+
+ਮੈਂਟੇਨਰਾਂ ਅਤੇ ਕਮਿਊਨਿਟੀ ਨਾਲ ਇੱਥੇ ਸੰਪਰਕ ਕਰੋ:
+
+- ਬੱਗ ਜਾਂ ਫੀਚਰ ਰਿਕਵੇਸਟ? ਕਿਰਪਾ ਕਰਕੇ [issue ਖੋਲ੍ਹੋ](https://github.com/HeyPuter/puter/issues/new/choose)।
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- ਸੁਰੱਖਿਆ ਮਸਲੇ? [security@puter.com](mailto:security@puter.com)
+- ਮੇਂਟੇਨਰਾਂ ਨੂੰ ਈਮੇਲ ਕਰੋ [hi@puter.com](mailto:hi@puter.com)
+
+ਅਸੀਂ ਹਮੇਸ਼ਾ ਤੁਹਾਡੀਆਂ ਕਿਸੇ ਵੀ ਪ੍ਰਸ਼ਨਾਂ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ ਤਿਆਰ ਹਾਂ। ਬੇਝਿਝਕ ਪੁੱਛੋ!
+
+
+
+## License
+
+ਇਹ ਰਿਪੋਜ਼ਟਰੀ, ਆਪਣੇ ਸਾਰੇ ਸਮੱਗਰੀ, ਸਬ-ਪ੍ਰੋਜੈਕਟ, ਮੋਡੀਊਲ, ਅਤੇ ਕੰਪੋਨੈਂਟ ਸਮੇਤ, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) ਅਧੀਨ ਲਾਇਸੈਂਸਡ ਹੈ ਜੇ ਤਕ ਹੋਰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਨਹੀਂ ਕਿਹਾ ਗਿਆ। ਤੀਜੀ ਪੱਖ ਦੀਆਂ ਲਾਇਬ੍ਰੇਰੀਆਂ ਆਪਣੇ ਲਾਇਸੈਂਸਾਂ ਅਨੁਸਾਰ ਹੋ ਸਕਦੀਆਂ ਹਨ।
+
+
+
+## Translations
+
+- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
+- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
+- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
+- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
+- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
+- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
+- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
+- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
+- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
+- [German / Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
+- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
+- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
+- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
+- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
+- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
+- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
+- [Malay / Bahasa Malaysia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.my.md)
+- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
+- [Punjabi / ਪੰਜਾਬੀ](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pa.md)
+- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
+- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
+- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
+- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
+- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
+- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
+- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
+- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
+- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
+- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
+- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+
+## Links to Other READMEs
+### Backend
+- [PuterAI Module](./src/backend/doc/modules/puterai/README.md)
+- [Metering Service](./src/backend/src/services/MeteringService/README.md)
+- [Extensions Development Guide](./extensions/README.md)
diff --git a/doc/i18n/README.pl.md b/doc/i18n/README.pl.md
new file mode 100644
index 0000000000..35ea1134e9
--- /dev/null
+++ b/doc/i18n/README.pl.md
@@ -0,0 +1,119 @@
+
+ System Operacyjny Internet! Darmowy, Open-Source i Możliwy do Samodzielnego Hostowania.
+
+
+
+
+ « DEMO NA ŻYWO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+## Puter
+
+Puter to zaawansowany, open-source'owy internetowy system operacyjny, zaprojektowany tak, aby był bogaty w funkcje, wyjątkowo szybki i wysoce rozszerzalny. Puter może być używany jako:
+
+- Prywatna chmura osobista do przechowywania wszystkich plików, aplikacji i gier w jednym bezpiecznym miejscu, dostępnym z dowolnego miejsca o dowolnej porze.
+- Platforma do budowania i publikowania stron internetowych, aplikacji webowych i gier.
+- Alternatywa dla Dropbox, Google Drive, OneDrive itp. ze świeżym interfejsem i potężnymi funkcjami.
+- Zdalne środowisko pulpitu dla serwerów i stacji roboczych.
+- Przyjazny, open-source'owy projekt i społeczność do nauki o tworzeniu stron internetowych, chmurze obliczeniowej, systemach rozproszonych i wielu innych!
+
+
+
+## Rozpoczęcie pracy
+## 💻 Lokalne środowisko developerskie
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+To uruchomi Puter na http://puter.localhost:4100 (lub na następnym dostępnym porcie).
+
+
+
+## 🐳 Docker
+
+```bash
+Copy code
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+## 🐙 Docker Compose
+## Linux/macOS
+
+```bash
+Copy code
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+## Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+## ☁️ Puter.com
+Puter jest dostępny jako usługa hostowana na [**puter.com**](https://puter.com).
+
+
+
+## Wymagania systemowe
+
+- **Systemy operacyjne:** Linux, macOS, Windows
+- **RAM:** Minimum 2GB (zalecane 4GB)
+- **Przestrzeń dyskowa:** 1GB wolnego miejsca
+- **Node.js:** Wersja 16+ (zalecana wersja 22+)
+- **npm:** Najnowsza stabilna wersja
+
+
+
+## Wsparcie
+
+Skontaktuj się z opiekunami i społecznością przez te kanały:
+
+- Raport o błędzie lub prośba o funkcję? Proszę otworzyć zgłoszenie.
+- Discord: discord.com/invite/PQcx7Teh8u
+- X (Twitter): x.com/HeyPuter
+- Reddit: reddit.com/r/puter/
+- Mastodon: mastodon.social/@puter
+- Problemy z bezpieczeństwem? security@puter.com
+- Email do opiekunów: hi@puter.com
+
+Zawsze chętnie pomożemy Ci z wszelkimi pytaniami, jakie możesz mieć. Nie wahaj się pytać!
+
+
+## Licencja
+
+To repozytorium, w tym cała jego zawartość, podprojekty, moduły i komponenty, jest licencjonowane na podstawie [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), chyba że wyraźnie zaznaczono inaczej. Biblioteki stron trzecich zawarte w tym repozytorium mogą podlegać własnym licencjom.
+
+
+
+
+
+
+
diff --git a/doc/i18n/README.pt.md b/doc/i18n/README.pt.md
new file mode 100644
index 0000000000..78bf9d5f9a
--- /dev/null
+++ b/doc/i18n/README.pt.md
@@ -0,0 +1,173 @@
+
+
+O Sistema Operacional da Internet! Gratuito, de Código Aberto e Auto-Hospedável.
+
+
+ « DEMONSTRAÇÃO AO VIVO »
+
+
+ Puter.com
+ ·
+ App Store
+ ·
+ Developers
+ ·
+ CLI
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter é um sistema operacional de internet avançado e de código aberto, projetado para ser rico em recursos, excepcionalmente rápido e altamente extensível. Puter pode ser usado como:
+
+- Um serviço de nuvem pessoal com foco na privacidade para manter todos os seus arquivos, aplicativos e jogos em um local seguro, acessível de qualquer lugar e a qualquer hora.
+- Uma plataforma para construir e publicar websites, aplicativos web e jogos.
+- Uma alternativa ao Dropbox, Google Drive, OneDrive, etc., com uma interface renovada e recursos poderosos.
+- Um ambiente de desktop remoto para servidores e estações de trabalho.
+- Um projeto e comunidade de código aberto e amigável para aprender sobre desenvolvimento web, computação em nuvem, sistemas distribuídos e muito mais!
+
+
+
+## Iniciando o Projeto
+
+
+### 💻 Desenvolvimento Local
+```
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
+
+
+Se isso não funcionar, consulte [First Run Issues](./doc/self-hosters/first-run-issues.md) para solucionar os problemas.
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
+
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
+
+
+
+### 🚀 Auto-Hospedagem
+
+Para guia detalhados sobre como auto-hospedar o Puter, incluindo opções de configuração e melhores práticas, consulte nossa [Documentação de Auto-Hospedagem](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md).
+
+### ☁️ Puter.com
+
+O Puter está disponível como um serviço hospedado em [**puter.com**](https://puter.com).
+
+
+
+## Requerimentos do sistema
+
+- **Sistema operacional:** Linux, macOS, Windows
+- **RAM:** 2GB mínimo (4GB recomendado)
+- **Espaço de disco:** 1GB de espaço disponível
+- **Node.js:** Versão 16+ (Versão 23+ recomendada)
+- **npm:** Última versão estável
+
+
+
+## Suporte
+
+Conecte-se com os mantenedores e a comunidade através destes canais:
+
+- Relato de bug ou solicitação de recurso? Por favor, [abra um tópico](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Problemas de segurança? [security@puter.com](mailto:security@puter.com)
+- Envie um email para os mantenedores em [hi@puter.com](mailto:hi@puter.com)
+
+Estamos sempre felizes em ajudá-lo com quaisquer perguntas que você possa ter. Não hesite em perguntar!
+
+
+
+
+## Licença
+
+Este repositório, incluindo todos os seus conteúdos, subprojetos, módulos e componentes, está licenciado sob [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) a menos que explicitamente indicado de outra forma. Bibliotecas de terceiros incluídas neste repositório podem estar sujeitas às suas próprias licenças.
+
+
+
+## Traduções
+
+- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
+- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
+- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
+- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
+- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
+- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
+- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
+- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
+- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
+- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
+- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
+- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
+- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
+- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
+- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
+- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
+- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
+- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
+- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
+- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
+- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
+- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
+- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
+- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
+- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
+- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
+- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
+- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
\ No newline at end of file
diff --git a/doc/i18n/README.ro.md b/doc/i18n/README.ro.md
new file mode 100644
index 0000000000..ad8b0a5353
--- /dev/null
+++ b/doc/i18n/README.ro.md
@@ -0,0 +1,129 @@
+
+
+Sistemul de operare al internetului! Gratuit, open-source și găzduibil autonom.
+
+
+
+
+
+ « DEMO LIVE »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ YouTube
+ ·
+ Reddit
+ ·
+ X (Twitter)
+ ·
+ Program de recompense pentru identificarea bugurilor
+
+
+
+
+
+
+## Puter
+
+Puter este un sistem de operare pe internet, avansat, open-source, conceput să fie bogat în funcționalități, excepțional de rapid și foarte extensibil. Puter poate fi folosit ca:
+
+* Un cloud personal cu accent pe confidențialitate, pentru a-ți păstra toate fișierele, aplicațiile și jocurile într-un singur loc securizat, accesibil de oriunde și oricând.
+* O platformă pentru a construi și publica site-uri, aplicații web și jocuri.
+* O alternativă la Dropbox, Google Drive, OneDrive etc., cu o interfață nouă și funcționalități puternice.
+* Un mediu desktop la distanță pentru servere și stații de lucru.
+* Un proiect și o comunitate, open-source și prietenoase, pentru a învăța despre dezvoltare web, cloud computing, sisteme distribuite și multe altele!
+
+
+
+## Fă primii pași
+
+### 💻 Dezvoltare locală
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Aceasta va porni Puter la [http://puter.localhost:4100](http://puter.localhost:4100) (sau pe următorul port disponibil).
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+
+### ☁️ Puter.com
+
+Puter este disponibil ca serviciu găzduit la adresa [**puter.com**](https://puter.com).
+
+
+
+## Cerințe de sistem
+
+* **Sisteme de operare:** Linux, macOS, Windows
+* **RAM:** minimum 2GB (recomandat 4GB)
+* **Spațiu pe disc:** 1GB spațiu liber
+* **Node.js:** versiunea 16+ (versiunea 22+ recomandată)
+* **npm:** ultima versiune stabilă
+
+
+
+## Suport
+
+Ia legătura cu cei care asigură mentenanța proiectului și cu comunitatea prin aceste canale:
+
+* Vrei să raportezi un bug sau să ceri o funcționalitate? Te rugăm să [deschizi o problemă](https://github.com/HeyPuter/puter/issues/new/choose).
+* Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+* X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+* Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+* Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+* Probleme de securitate? [security@puter.com](mailto:security@puter.com)
+* Trimite un e-mail celor care asigură mentenanța proiectului la [hi@puter.com](mailto:hi@puter.com)
+
+Suntem întotdeauna bucuroși să te ajutăm cu orice întrebări ai. Nu ezita să ne pui întrebări!
+
+
+
+## Licență
+
+Acest repository, inclusiv tot conținutul său, subproiectele, modulele și componentele, este licențiat sub [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), cu excepția cazurilor în care se menționează explicit altfel. Bibliotecile terțe incluse în acest repository pot fi supuse propriilor lor licențe.
+
+
+
diff --git a/doc/i18n/README.ru.md b/doc/i18n/README.ru.md
new file mode 100644
index 0000000000..2452520a71
--- /dev/null
+++ b/doc/i18n/README.ru.md
@@ -0,0 +1,127 @@
+
+
+Интернет ОС! Бесплатная, с открытым исходным кодом и возможностью самостоятельной установки.
+
+
+
+
+
+ « ЖИВОЕ ДЕМО »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter — это передовая операционная система с открытым исходным кодом, разработанная для обеспечения широкого функционала, исключительной скорости и высокой масштабируемости. Puter можно использовать как:
+
+- Персональное облако с приоритетом конфиденциальности для хранения всех ваших файлов, приложений и игр в одном безопасном месте, доступном из любой точки мира в любое время.
+- Платформа для создания и публикации веб-сайтов, веб-приложений и игр.
+- Альтернатива Dropbox, Google Drive, OneDrive и т. д. с новым интерфейсом и мощными функциями.
+- Удаленное рабочее окружение для серверов и рабочих станций.
+- Дружественный проект с открытым исходным кодом и сообщество для изучения веб-разработки, облачных вычислений, распределенных систем и многого другого!
+
+
+
+## Начало работы
+
+
+### 💻 Локальная разработка
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Это запустит Puter по адресу http://puter.localhost:4100 (или на следующем доступном порту).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter доступен как облачный сервис на [**puter.com**](https://puter.com).
+
+
+
+## Системные требования
+
+- **Операционные системы:** Linux, macOS, Windows
+- **ОЗУ:** минимум 2 ГБ (рекомендуется 4 ГБ)
+- **Место на диске:** 1 ГБ свободного места
+- **Node.js:** Версия 16+ (рекомендуется версия 22+)
+- **npm:** Последняя стабильная версия
+
+
+
+## Поддержка
+
+Свяжитесь с разработчиками и сообществом этими способами:
+
+- Отчет об ошибке или запрос функции? Пожалуйста, [откройте вопрос](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Проблемы безопасности? [security@puter.com](mailto:security@puter.com)
+- Свяжитесь с разработчиками по адресу [hi@puter.com](mailto:hi@puter.com)
+
+Мы всегда рады помочь вам с любыми вопросами. Не стесняйтесь спрашивать!
+
+
+
+
+## Лицензия
+
+Этот репозиторий, включая все его содержимое, подпроекты, модули и компоненты, лицензирован в соответствии с [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), если явно не указано иное. Сторонние библиотеки, включенные в этот репозиторий, могут подпадать под действие их собственных лицензий.
+
+
diff --git a/doc/i18n/README.sv.md b/doc/i18n/README.sv.md
new file mode 100644
index 0000000000..d50aef3377
--- /dev/null
+++ b/doc/i18n/README.sv.md
@@ -0,0 +1,125 @@
+
+
+Internet OS! Gratis, öppen källkod och självhostad.
+
+
+
+
+
+ « LIVE DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter är ett avancerat, öppen källkod internetoperativsystem designat för att vara funktionsrikt, exceptionellt snabbt och mycket utbyggbart. Puter kan användas som:
+
+- Ett integritetsfokuserat personligt moln för att hålla alla dina filer, appar och spel på ett säkert ställe, tillgängligt var som helst när som helst.
+- En plattform för att bygga och publicera webbplatser, webbappar och spel.
+- Ett alternativ till Dropbox, Google Drive, OneDrive, etc. med ett fräscht gränssnitt och kraftfulla funktioner.
+- En fjärrskrivbordsmiljö för servrar och arbetsstationer.
+- Ett vänligt, öppen källkod-projekt och gemenskap för att lära sig om webbutveckling, molndatorer, distribuerade system och mycket mer!
+
+
+
+## Komma igång
+
+### 💻 Lokal Utveckling
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Detta kommer att starta Puter på http://puter.localhost:4100 (eller nästa lediga port).
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 Docker Compose
+
+#### Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+
+### ☁️ Puter.com
+
+Puter är tillgängligt som en värdtjänst på [**puter.com**](https://puter.com).
+
+
+
+## Systemkrav
+
+- **Operating Systems:** Linux, macOS, Windows
+- **RAM:** 2GB minimum (4GB recommended)
+- **Disk Space:** 1GB free space
+- **Node.js:** Version 16+ (Version 22+ recommended)
+- **npm:** Latest stable version
+
+
+
+## Support
+
+Anslut med underhållarna och gemenskapen genom dessa kanaler:
+
+- Buggrapport eller funktionsförfrågan? Vänligen [öppna ett ärende](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Säkerhetsproblem? [security@puter.com](mailto:security@puter.com)
+- E-posta underhållarna på [hi@puter.com](mailto:hi@puter.com)
+
+Vi hjälper dig gärna med eventuella frågor du kan ha. Tveka inte att fråga!
+
+
+
+## Licens
+
+Detta arkiv, inklusive allt dess innehåll, delprojekt, moduler och komponenter, är licensierat under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) om inte annat uttryckligen anges. Tredjepartsbibliotek som ingår i detta arkiv kan vara föremål för sina egna licenser.
+
+
+
diff --git a/doc/i18n/README.ta.md b/doc/i18n/README.ta.md
new file mode 100644
index 0000000000..8792b39eb8
--- /dev/null
+++ b/doc/i18n/README.ta.md
@@ -0,0 +1,123 @@
+
+
+இன்டர்நெட் OS! இலவசம், ஓப்பன் சோர்ஸ் மற்றும் Self-Hostable
+
+
+
+
+
+ « லைவ் டெமோ »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## புட்டர் (Putter)
+
+புட்டர்(putter) என்பது ஒரு மேம்பட்ட, திறந்த மூல இலவசமாக இணைய இயக்க முறைமையாகும், இது அம்சம் நிறைந்ததாகவும், விதிவிலக்காக வேகமாகவும், அதிக விரிவாக்கக்கூடியதாகவும் வடிவமைக்கப்பட்டுள்ளது. புட்டரை இவ்வாறு பயன்படுத்தலாம்:
+
+- உங்கள் கோப்புகள், பயன்பாடுகள் மற்றும் கேம்கள் அனைத்தையும் ஒரே பாதுகாப்பான இடத்தில் வைத்திருக்க, எந்த நேரத்திலும் எங்கிருந்தும் அணுகக்கூடிய தனியுரிமை-முதல் தனிப்பட்ட கிளவுட்.
+- இணையதளங்கள், இணைய பயன்பாடுகள் மற்றும் கேம்களை உருவாக்கி வெளியிடுவதற்கான தளம் இதுவாகும்.
+- புதிய இடைமுகம் மற்றும் சக்திவாய்ந்த அம்சங்களுடன் Dropbox, Google Drive, OneDrive போன்றவற்றுக்கு மாற்றீடாக உபயோகிக்க கூடியது.
+- சர்வர்கள் மற்றும் பணிநிலையங்களுக்கான தொலைநிலை டெஸ்க்டாப்(desktop) சூழல்.
+- வலை மேம்பாடு, கிளவுட் கம்ப்யூட்டிங், விநியோகிக்கப்பட்ட அமைப்புகள் மற்றும் பலவற்றைப் பற்றி அறிந்து ஒரு நட்பு ரீதியான, திறந்த மூல திட்டம் மற்றும் சமூக அறிவியலில் சார்ந்த ஒன்று.
+
+
+
+## தொடங்குதல்
+
+### 💻 உள்ளூர் வளர்ச்சி
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+``` தொடக்கம்
+```
+
+இது புட்டரை இல் தொடங்கும் (அல்லது அடுத்து கிடைக்கும் இடம்).
+
+
+
+### 🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 டோக்கர் கம்போஸ்
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+புட்டர் ஹோஸ்ட் செய்யப்பட்ட சேவையாக [**puter.com**](https://puter.com) இல் கிடைக்கிறது.
+
+
+
+## கணினி தேவைகள்
+
+- **இயக்க முறைமைகள்:** Linux, macOS, Windows
+- **ரேம்:** குறைந்தபட்சம் 2 ஜிபி (4 ஜிபி பரிந்துரைக்கப்படுகிறது)
+- **வட்டு இடம்:** 1GB இலவச இடம்
+- **Node.js:** Version 16+ (Version 22+ recommended)
+- **npm:** சமீபத்திய நிலையான பதிப்பு(Latest stable version)
+
+
+
+## ஆதரவு
+
+இந்த சேனல்கள் மூலம் பராமரிப்பாளர்கள் மற்றும் சமூகத்துடன் சமூக இணைப்பாளர்:
+
+- பிழை அறிக்கை அல்லது மாற்றுதல் கோரிக்கை? தயவுசெய்து [சிக்கலைத் திறக்கவும்](https://github.com/HeyPuter/puter/issues/new/choose).
+- கருத்து வேறுபாடு: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- பாதுகாப்பு பிரச்சினைகள்? [security@puter.com](mailto:security@puter.com)
+- மின்னஞ்சல் பராமரிப்பாளர்களுக்கு [hi@puter.com](mailto:hi@puter.com)
+
+உங்களுக்கு ஏதேனும் கேள்விகள் இருந்தால் உங்களுக்கு உதவ நாங்கள் எப்போதும் மகிழ்ச்சியடைகிறோம். தயங்காமல் கேளுங்கள்!
+
+
+
+## உரிமம்
+
+இந்தக் களஞ்சியமானது, அதன் அனைத்து உள்ளடக்கங்கள், துணைத் திட்டங்கள், தொகுதிகள் மற்றும் கூறுகள் உட்பட, வெளிப்படையாகக் கூறப்படாவிட்டால், [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) இன் கீழ் உரிமம் பெற்றுள்ளது. . இந்தக் களஞ்சியத்தில் சேர்க்கப்பட்டுள்ள மூன்றாம் தரப்பு நூலகங்கள் அவற்றின் சொந்த உரிமங்களுக்கு உட்பட்டதாக இருக்கும்.
+
+
diff --git a/doc/i18n/README.te.md b/doc/i18n/README.te.md
new file mode 100644
index 0000000000..a35c32b9ba
--- /dev/null
+++ b/doc/i18n/README.te.md
@@ -0,0 +1,161 @@
+
+
+ ఇంటర్నెట్ OS! ఉచిత, ఓపెన్ సోర్స్, and Self-Hostable.
+
+
+
+
+
+ « ప్రత్యక్ష ప్రదర్శన »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## పుటర్ (Puter)
+
+పుటర్ అనేది అధునాతన, ఓపెన్ సోర్స్ ఇంటర్నెట్ ఆపరేటింగ్ సిస్టమ్, ఇది ఫీచర్-రిచ్, అనూహ్యంగా వేగవంతమైన మరియు అత్యంత విస్తరించదగినదిగా రూపొందించబడింది. పుటర్ను ఇలా ఉపయోగించవచ్చు:
+
+- మీ అన్ని ఫైల్లు, యాప్లు మరియు గేమ్లను ఒకే సురక్షిత స్థలంలో ఉంచడానికి గోప్యత-మొదటి వ్యక్తిగత క్లౌడ్, ఎప్పుడైనా ఎక్కడి నుండైనా యాక్సెస్ చేయవచ్చు.
+- వెబ్సైట్లు, వెబ్ యాప్లు మరియు గేమ్లను రూపొందించడానికి మరియు ప్రచురించడానికి ఒక వేదిక.
+- తాజా ఇంటర్ఫేస్ మరియు శక్తివంతమైన ఫీచర్లతో Dropbox, Google Drive, OneDrive మొదలైన వాటికి ప్రత్యామ్నాయం.
+- సర్వర్లు మరియు వర్క్స్టేషన్ల కోసం రిమోట్ డెస్క్టాప్ వాతావరణం.
+- వెబ్ డెవలప్మెంట్, క్లౌడ్ కంప్యూటింగ్, డిస్ట్రిబ్యూట్ సిస్టమ్లు మరియు మరిన్నింటి గురించి తెలుసుకోవడానికి స్నేహపూర్వక, ఓపెన్ సోర్స్ ప్రాజెక్ట్ మరియు కమ్యూనిటీ!
+
+
+
+## ప్రారంభించడం
+
+### లోకల్ డెవలప్మెంట్
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+ఇది http://puter.localhost:4100 (లేదా తదుపరి అందుబాటులో ఉన్న పోర్ట్) వద్ద పుటర్ని ప్రారంభిస్తుంది.
+
+ఇది పని చేయకపోతే, దీని కోసం [మొదటి రన్ సమస్యలు](./doc/first-run-issues.md) చూడండి
+ట్రబుల్షూటింగ్ దశలు.
+
+
+
+### 🐳 డోకర్
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+### 🐙 డోకర్ Compose
+
+#### లినక్స్/ macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+#### విండోస్
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+
+### ☁️ Puter.com
+
+పుటర్ [**puter.com**](https://puter.com)లో హోస్ట్ చేయబడి ఉంది.
+
+
+
+## System Requirements
+
+- **ఆపరేటింగ్ సిస్టమ్స్:** లినక్స్, macOS, విండోస్
+- **RAM:** 2GB కనీసం(4GB recommended)
+- **Disk Space:** 1GB ఖాళీ
+- **Node.js:** Version 16+ (Version 22+ recommended)
+- **npm:** Latest stable version
+
+
+
+## Support
+
+ఈ ఛానెల్ల ద్వారా నిర్వాహకులు మరియు సంఘంతో కనెక్ట్ అవ్వండి:
+
+- బగ్ నివేదిక లేదా ఫీచర్ అభ్యర్థన? దయచేసి [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Security issues? [security@puter.com](mailto:security@puter.com)
+- Email maintainers at [hi@puter.com](mailto:hi@puter.com)
+
+మీకు ఏవైనా సందేహాలు ఉంటే మీకు సహాయం చేయడానికి మేము ఎల్లప్పుడూ సంతోషిస్తాము. అడగడానికి సంకోచించకండి!
+
+
+
+## లైసెన్సు
+
+ఈ రిపోజిటరీ, దాని మొత్తం కంటెంట్లు, ఉప-ప్రాజెక్ట్లు, మాడ్యూల్స్ మరియు కాంపోనెంట్లతో సహా, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) కింద లైసెన్స్ని కలిగి ఉంటుంది. . ఈ రిపోజిటరీలో చేర్చబడిన థర్డ్-పార్టీ లైబ్రరీలు వాటి స్వంత లైసెన్స్లకు లోబడి ఉండవచ్చు.
+
+
+
+## అనువాదాలు
+
+- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
+- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
+- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
+- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
+- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
+- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
+- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
+- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
+- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
+- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
+- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
+- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
+- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
+- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
+- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
+- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
+- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
+- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
+- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
+- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
+- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
+- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
+- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
+- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
+- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
+- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
+- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
+- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
diff --git a/doc/i18n/README.th.md b/doc/i18n/README.th.md
new file mode 100644
index 0000000000..17d2dd941a
--- /dev/null
+++ b/doc/i18n/README.th.md
@@ -0,0 +1,127 @@
+
+
+ระบบปฏิบัติการอินเทอร์เน็ต ฟรี, โอเพ่นซอร์ส, และสามารถโฮสต์ได้ด้วยตนเอง
+
+
+
+
+
+ « การสาธิตสด »
+
+
+ Puter.com
+ ·
+ ชุดพัฒนาโปรแกรม
+ ·
+ ดิสคอร์ด
+ ·
+ เรดดิท
+ ·
+ X (ทวิตเตอร์)
+
+
+
+
+
+
+## พิวเตอร์
+
+พิวเตอร์ เป็นระบบปฏิบัติการอินเทอร์เน็ตขั้นสูงแบบโอเพ่นซอร์สที่ออกแบบมาให้มีฟีเจอร์ครบถ้วน ความเร็วสูง และมีความสามารถที่จะขยายได้สูง. พิวเตอร์ สามารถใช้ได้เป็น:
+
+- คลาวด์ส่วนตัว เพื่อเก็บไฟล์, แอพพลิเคชัน, และเกมทั้งหมดของคุณในที่เดียวที่ปลอดภัยและสามารถเข้าถึงได้ทุกที่ทุกเวลา
+- แพลตฟอร์มสำหรับการสร้างและเผยแพร่เว็บไซต์, เว็บแอปพลิเคชัน, และเกม
+- ทางเลือกอีกหนึ่งทางที่สามารถใช้แทน Dropbox, Google Drive, OneDrive ฯลฯ โดยที่มีอินเทอร์เฟซใหม่และฟีเจอร์ที่ทรงพลัง
+- สภาพแวดล้อมสำหรับเดสก์ท็อประยะไกลที่ใช้กับเซิร์ฟเวอร์และสถานีทำงาน
+- โครงการโอเพ่นซอร์สและชุมชนที่เป็นมิตรที่คุณสามารถเรียนรู้เกี่ยวกับการพัฒนาเว็บ, คลาวด์คอมพิวติ้ง, ระบบกระจาย, และอีกมากมาย
+
+
+
+## การเริ่มต้นใช้งาน
+
+
+### 💻 การพัฒนาภายในเครื่อง
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+พิวเตอร์ จะถูกเปิดใช้งานที่ http://puter.localhost:4100 (หรือพอร์ตถัดไปที่ว่าง).
+
+
+
+### 🐳 ด็อกเกอร์
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 ด็อกเกอร์ คอมโพส
+
+
+#### ลินุกซ์/แมคโอเอส
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### วินโดวส์
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+สามารถใช้งาน พิวเตอร์ ได้ในรูปแบบบริการโฮสต์ที่ [**puter.com**](https://puter.com).
+
+
+
+## ข้อกำหนดของระบบ
+
+- **ระบบปฏิบัติการ:** ลินุกซ์ แมคโอเอส วินโดวส์
+- **แรม:** อย่างน้อย 2GB (แนะนำ 4GB)
+- **พื้นที่เก็บข้อมูล:** พื้นที่ว่าง 1GB
+- **Node.js:** เวอร์ชัน 16+ (แนะนำเวอร์ชัน 22+)
+- **npm:** เวอร์ชันล่าสุดที่เสถียร
+
+
+
+## การช่วยเหลือ
+
+ติดต่อกับผู้ดูแลระบบและชุมชนผ่านช่องทางเหล่านี้:
+
+- พบข้อผิดพลาดหรือขอฟีเจอร์ใหม่? กรุณา [เปิดปัญหา](https://github.com/HeyPuter/puter/issues/new/choose).
+- ดิสคอร์ด: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (ทวิตเตอร์): [x.com/HeyPuter](https://x.com/HeyPuter)
+- เรดดิท: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- มาสตอดอน: [mastodon.social/@puter](https://mastodon.social/@puter)
+- ปัญหาด้านความปลอดภัย [security@puter.com](mailto:security@puter.com)
+- ส่งอีเมลถึงผู้ดูแลระบบได้ที่ [hi@puter.com](mailto:hi@puter.com)
+
+เรายินดีเสมอที่จะช่วยเหลือคุณกับทุกทุกคำถามที่คุณมี อย่าลังเลที่จะถาม
+
+
+
+
+## ลิขสิทธิ์
+
+ที่เก็บข้อมูลนี้ รวมถึงเนื้อหาทั้งหมด, โครงการย่อย, โมดูล, และส่วนประกอบต่างๆ ได้รับใบอนุญาตภายใต้ [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) เว้นแต่จะมีการระบุไว้เป็นอย่างอื่นอย่างชัดเจน ไลบรารีจากบุคคลที่สามที่รวมอยู่ในที่เก็บข้อมูลนี้อาจอยู่ภายใต้ใบอนุญาตของตนเอง
+
+
diff --git a/doc/i18n/README.tr.md b/doc/i18n/README.tr.md
new file mode 100644
index 0000000000..c3154573f2
--- /dev/null
+++ b/doc/i18n/README.tr.md
@@ -0,0 +1,127 @@
+
+
+İnternet İşletim Sistemi! Ücretsiz, Açık Kaynaklı ve Kendi Kendine Barındırılabilir
+
+
+
+
+
+ « CANLI DEMO »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter, zengin özelliklere sahip, son derece hızlı ve son derece genişletilebilir olacak şekilde tasarlanmış gelişmiş, açık kaynaklı bir internet işletim sistemidir. Puter şu şekilde kullanılabilir:
+
+- Tüm dosyalarınızı, uygulamalarınızı ve oyunlarınızı tek bir güvenli yerde tutmak için gizlilik öncelikli bir kişisel bulut, her yerden her zaman erişilebilir.
+- Web siteleri, web uygulamaları ve oyunlar oluşturmak ve yayınlamak için bir platform.
+- Yeni bir arayüz ve güçlü özelliklerle Dropbox, Google Drive, OneDrive vb. uygulamalara bir alternatif.
+- Sunucular ve iş istasyonları için bir uzak masaüstü ortamı.
+- Web geliştirme, bulut bilişim, dağıtık sistemler ve çok daha fazlası hakkında bilgi edinmek için dost canlısı, açık kaynaklı bir proje ve topluluk!
+
+
+
+## Başlarken
+
+
+### 💻 Yerel Geliştirme
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Bu, Puter'ı http://puter.localhost:4100 adresinde (veya bir sonraki kullanılabilir portta) başlatacaktır.
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter, [**puter.com**](https://puter.com) adresinde barındırılan bir hizmet olarak kullanılabilir.
+
+
+
+## Sistem Gereksinimleri
+
+- **İşletim Sistemleri:** Linux, macOS, Windows
+- **RAM:** 2GB Minimum (4GB önerilir)
+- **Disk Alanı:** 1GB boş alan
+- **Node.js:** Sürüm 16+ (Sürüm 22+ önerilir)
+- **npm:** En son stabil sürüm
+
+
+
+## Destek
+
+Bakımcılarla ve toplulukla şu kanallar aracılığıyla iletişim kurabilirsiniz:
+
+- Hata raporu veya özellik isteği? Lütfen [yeni bir issue açın](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Güvenlik sorunları? [security@puter.com](mailto:security@puter.com)
+- Bakımcılara şu adresten e-posta gönderin [hi@puter.com](mailto:hi@puter.com)
+
+Sorularınız varsa size her zaman yardımcı olmaktan mutluluk duyarız. Sormaktan çekinmeyin!
+
+
+
+
+## Lisans
+
+Bu depo, tüm içeriği, alt projeleri, modülleri ve bileşenleri dahil olmak üzere, aksi açıkça belirtilmedikçe [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) altında lisanslanmıştır. Bu depoda yer alan üçüncü taraf kütüphaneler kendi lisanslarına tabi olabilir.
+
+
diff --git a/doc/i18n/README.ua.md b/doc/i18n/README.ua.md
new file mode 100644
index 0000000000..3f5cc2ae43
--- /dev/null
+++ b/doc/i18n/README.ua.md
@@ -0,0 +1,125 @@
+
+
+Інтернет ОС! Безкоштовна, відкрита та self-hosted.
+
+
+
+
+
+ « Онлайн ДЕМО »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter — це просунута, інтернет-ОС, з відкритим кодом, створена для того, щоб бути багатофункціональною, надзвичайно швидкою та розширюваною. Puter може використовуватися як:
+
+- Приватний хмарний сервіс для збереження всіх ваших файлів, додатків і ігор у безпечному місці, доступному в будь-який час з будь-якого місця.
+- Платформа для створення та публікації вебсайтів, вебдодатків і ігор.
+- Альтернатива Dropbox, Google Drive, OneDrive і тд, з свіженьким інтерфейсом та потужними функціями.
+- Віддалене робоче середовище для серверів і робочих станцій.
+- Дружній, відкритий проєкт та спільнота для вивчення веброзробки, хмарних обчислень, розподілених систем і багато іншого!
+
+
+
+## Початок роботи
+
+### Локальна розробка
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+Це запустить Puter на http://puter.localhost:4100 (або на наступному доступному порті).
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter доступний як hosted service на [**puter.com**](https://puter.com).
+
+
+
+## Системні вимоги
+
+- **Операційні Системи:** Linux, macOS, Windows
+- **RAM:** 2GB мінімум (4GB рекомендовано)
+- **Місце на диску:** 1GB вільного місця
+- **Node.js:** Version 16+ (Version 22+ рекомендовано)
+- **npm:** остання "stable" версія
+
+
+
+## Підтримка
+
+Зв'язатися з розробниками та спільнотою можна через такі канали:
+
+- Повідомити про помилку, або запит щодо нової фічі? Будь ласка, [створіть issue](https://github.com/HeyPuter/puter/issues/new/choose).
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- Питання щодо Security? [security@puter.com](mailto:security@puter.com)
+- Написати розробникам [hi@puter.com](mailto:hi@puter.com)
+
+Ми завжди готові допомогти Вам з будь-якими питаннями, що можуть виникнути. Не соромтеся ставити нам питання!
+
+
+
+## License
+
+Цей репорзиторій, включаючи увесь його контент, дочірні проєкти, модулі, і компоненти, ліцензовано за [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), якщо явно не вказано інше. Сторонні бібліотеки, включені в цей репозиторій, можуть підпадати під дію інших ліцензій.
+
+
diff --git a/doc/i18n/README.ur.md b/doc/i18n/README.ur.md
new file mode 100644
index 0000000000..7a8abf27ba
--- /dev/null
+++ b/doc/i18n/README.ur.md
@@ -0,0 +1,121 @@
+
+
+انٹرنیٹ OS! مفت، اوپن سورس، اور خود میزبان.
+
+
+
+
+
+ « لائیو ڈیمو »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ ڈسکورڈ
+ ·
+ ریڈڈٹ
+ ·
+ ایکس (ٹوئٹر)
+
+
+
+
+
+
+## Puter
+
+ایک جدید، اوپن سورس انٹرنیٹ آپریٹنگ سسٹم ہے جو کہ خصوصیات سے بھرپور، بہت تیز، اور انتہائی توسیع پذیر ہے۔ Puter
+
+: کو استعمال کیا جا سکتا ہے Puter
+
+- ایک پرائیویسی فرسٹ ذاتی کلاؤڈ کے طور پر تاکہ آپ کی تمام فائلیں، ایپس، اور کھیل ایک محفوظ جگہ پر رکھی جا سکیں، کہیں سے بھی اور کسی بھی وقت قابل رسائی ہوں۔
+- ویب سائٹس، ویب ایپس، اور کھیل بنانے اور شائع کرنے کے لئے ایک پلیٹ فارم کے طور پر۔
+- وغیرہ کا متبادل، نئے انٹرفیس اور طاقتور خصوصیات کے ساتھ۔ Dropbox، Google Drive، OneDrive
+- سرورز اور ورک اسٹیشنز کے لیے ایک ریموٹ ڈیسک ٹاپ ماحول کے طور پر۔
+- ویب ڈویلپمنٹ، کلاؤڈ کمپیوٹنگ، تقسیم شدہ نظاموں، اور بہت کچھ سیکھنے کے لیے ایک دوستانہ، اوپن سورس پروجیکٹ اور کمیونٹی!
+
+
+
+## شروع کرنے کا طریقہ
+
+### 💻 مقامی ترقی
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+یہ Puter کو http://puter.localhost:4100 (یا اگلے دستیاب پورٹ) پر لانچ کرے گا۔
+
+
+🐳 Docker
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+🐙 Docker Compose
+Linux/macOS
+
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+Windows
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+### ☁️ Puter.com
+
+Puter کو [**puter.com**](https://puter.com) پر میزبان سروس کے طور پر دستیاب ہے۔
+
+
+
+## نظام کی ضروریات
+
+- **آپریٹنگ سسٹمز:** لینکس، macOS، ونڈوز
+- **RAM:** کم از کم 2GB (4GB تجویز کردہ)
+- **ڈسک کی جگہ:** 1GB خالی جگہ
+- **Node.js:** ورژن 16+ (ورژن 22+ تجویز کردہ)
+- **npm:** تازہ ترین مستحکم ورژن
+
+
+
+## سپورٹ
+
+منتظمین اور کمیونٹی سے جڑنے کے لیے یہ چینلز استعمال کریں:
+
+- بگ رپورٹ یا فیچر درخواست؟ براہ کرم [ایک مسئلہ کھولیں](https://github.com/HeyPuter/puter/issues/new/choose).
+- ڈسکورڈ: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- ایکس (ٹوئٹر): [x.com/HeyPuter](https://x.com/HeyPuter)
+- ریڈڈٹ: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- ماسٹڈون: [mastodon.social/@puter](https://mastodon.social/@puter)
+- سیکیورٹی کے مسائل؟ [security@puter.com](mailto:security@puter.com)
+- منتظمین کو ای میل کریں [hi@puter.com](mailto:hi@puter.com)
+
+ہم ہمیشہ آپ کی مدد کے لیے خوش ہیں۔ سوالات پوچھنے میں ہچکچاہٹ نہ کریں
+!
+
+
+## لائسنس
+
+اس ریپوزٹری، بشمول اس کے تمام مواد، ذیلی پروجیکٹس، ماڈیولز، اور کمپوننٹس، کو [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) کے تحت لائسنس کیا گیا ہے جب تک کہ واضح طور پر کہیں اور نہ کہا گیا ہو۔ اس ریپوزٹری میں شامل تھرڈ پارٹی لائبریریاں اپنی لائسنس کے تابع ہو سکتی ہیں۔
+
+
diff --git a/doc/i18n/README.vi.md b/doc/i18n/README.vi.md
new file mode 100644
index 0000000000..baf337955f
--- /dev/null
+++ b/doc/i18n/README.vi.md
@@ -0,0 +1,125 @@
+
+Hệ điều hành Internet! Miễn phí, Mã nguồn mở và Có thể tự lưu trữ.
+
+
+
+
+ « DEMO TRỰC TIẾP »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter là một hệ điều hành internet tiên tiến, mã nguồn mở được thiết kế để có nhiều tính năng, tốc độ vượt trội và khả năng mở rộng cao. Puter có thể được sử dụng như:
+
+- Một đám mây cá nhân ưu tiên quyền riêng tư để lưu trữ tất cả các tệp, ứng dụng và trò chơi của bạn ở một nơi an toàn, có thể truy cập từ bất cứ đâu, bất cứ lúc nào.
+- Một nền tảng để xây dựng và xuất bản các trang web, ứng dụng web và trò chơi.
+- Một sự thay thế cho Dropbox, Google Drive, OneDrive, v.v. với giao diện mới mẻ và nhiều tính năng mạnh mẽ.
+- Một môi trường máy tính từ xa cho các máy chủ và máy trạm.
+- Một dự án thân thiện, mã nguồn mở và cộng đồng để học hỏi về phát triển web, điện toán đám mây, hệ thống phân tán và nhiều hơn nữa!
+
+
+
+## Bắt Đầu
+
+## 💻 Phát Triển Cục Bộ
+
+```bash
+Copy code
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+Điều này sẽ khởi chạy Puter tại http://puter.localhost:4100 (hoặc cổng kế tiếp có sẵn).
+
+
+
+### 🐳 Docker
+
+
+```bash
+Copy code
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+## 🐙 Docker Compose
+
+## Linux/macOS
+
+``` bash
+Copy code
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+
+## Windows
+
+```powershell
+Copy code
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+## ☁️ Puter.com
+
+Puter có sẵn dưới dạng dịch vụ lưu trữ tại [**puter.com**](https://puter.com).
+
+
+
+## Yêu Cầu Hệ Thống
+
+- **Hệ Điều Hành:** Linux, macOS, Windows
+- **RAM:** Tối thiểu 2GB (Khuyến nghị 4GB)
+- **Dung Lượng Ổ Cứng:** Còn trống 1GB
+- **Node.js:** Phiên bản 16+ (Khuyến nghị phiên bản 22+)
+- **npm:** Phiên bản ổn định mới nhất
+
+
+
+## Hỗ Trợ
+
+Kết nối với các nhà bảo trì và cộng đồng thông qua các kênh sau:
+
+- Báo cáo lỗi hoặc yêu cầu tính năng? Vui lòng mở một vấn đề.
+- Discord: discord.com/invite/PQcx7Teh8u
+- X (Twitter): x.com/HeyPuter
+- Reddit: reddit.com/r/puter/
+- Mastodon: mastodon.social/@puter
+- Vấn đề bảo mật? security@puter.com
+- Email các nhà bảo trì tại hi@puter.com
+
+Chúng tôi luôn sẵn sàng giúp đỡ bạn với bất kỳ câu hỏi nào bạn có. Đừng ngần ngại hỏi!
+
+
+
+## Giấy Phép
+
+Kho lưu trữ này, bao gồm tất cả nội dung, dự án con, mô-đun và thành phần của nó, được cấp phép theo [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), trừ khi được tuyên bố rõ ràng khác. Các thư viện của bên thứ ba được bao gồm trong kho lưu trữ này có thể phải tuân theo các giấy phép riêng của chúng.
+
+
diff --git a/doc/i18n/README.zh.md b/doc/i18n/README.zh.md
new file mode 100644
index 0000000000..7022380f92
--- /dev/null
+++ b/doc/i18n/README.zh.md
@@ -0,0 +1,138 @@
+
+
+
+互联网操作系统!免费、开源且可自行托管。
+
+
+
+
+
+
+ « 在线演示 »
+
+
+ Puter.com
+ ·
+ SDK
+ ·
+ Discord
+ ·
+ Reddit
+ ·
+ X (Twitter)
+
+
+
+
+
+
+## Puter
+
+Puter 是一个先进的开源互联网操作系统,设计为功能丰富、速度极快且高度可扩展。Puter 可用作:
+
+- 一个以隐私为优先的个人云,将所有文件、应用程序和游戏保存在一个安全的地方,随时随地可访问。
+- 构建和发布网站、Web 应用程序和游戏的平台。
+- Dropbox、Google Drive、OneDrive 等的替代品,具有全新的界面和强大的功能。
+- 服务器和工作站的远程桌面环境。
+- 一个友好的开源项目和社区,学习 Web 开发、云计算、分布式系统等更多内容!
+
+
+
+## 入门指南
+
+
+### 💻 本地开发
+
+```bash
+git clone https://github.com/HeyPuter/puter
+cd puter
+npm install
+npm start
+```
+
+这将会在 http://puter.localhost:4100(或下一个可用端口)启动 Puter。
+
+
+
+### 🐳 Docker
+
+
+```bash
+mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
+```
+
+
+
+
+### 🐙 Docker Compose
+
+
+#### Linux/macOS
+```bash
+mkdir -p puter/config puter/data
+sudo chown -R 1000:1000 puter
+wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
+docker compose up
+```
+
+
+#### Windows
+
+
+```powershell
+mkdir -p puter
+cd puter
+New-Item -Path "puter\config" -ItemType Directory -Force
+New-Item -Path "puter\data" -ItemType Directory -Force
+Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
+docker compose up
+```
+
+
+## 宝塔面板Docker一键部署(推荐)
+
+1. 安装宝塔面板9.2.0及以上版本,前往 [宝塔面板](https://www.bt.cn/new/download.html?r=dk_puter) 官网,选择正式版的脚本下载安装
+
+2. 安装后登录宝塔面板,在左侧菜单栏中点击 `Docker`,首次进入会提示安装`Docker`服务,点击立即安装,按提示完成安装
+
+3. 安装完成后在应用商店中搜索`puter`,点击安装,配置域名等基本信息即可完成安装
+
+
+### ☁️ Puter.com
+
+Puter 可以作为托管服务使用,访问 [**puter.com**](https://puter.com)。
+
+
+
+## 系统要求
+
+- **操作系统:** Linux, macOS, Windows
+- **内存:** 最低 2GB(推荐 4GB)
+- **磁盘空间:** 1GB 可用空间
+- **Node.js:** 版本 16+(推荐 22+)
+- **npm:** 最新稳定版本
+
+
+
+## 支持
+
+通过以下渠道与维护者和社区联系:
+
+- 有 Bug 报告或功能请求?请 [提交问题](https://github.com/HeyPuter/puter/issues/new/choose)。
+- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
+- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
+- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
+- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
+- 安全问题?请联系 [security@puter.com](mailto:security@puter.com)
+- 电子邮件维护者 [hi@puter.com](mailto:hi@puter.com)
+
+我们随时乐意帮助您解答任何问题,欢迎随时联系!
+
+
+
+
+## 许可证
+
+本仓库,包括其所有内容、子项目、模块和组件,除非另有明确说明,否则均遵循 [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) 许可证。 本仓库中包含的第三方库可能受其各自的许可证约束。
+
+
diff --git a/doc/prod.md b/doc/prod.md
index 5d04898f97..c56c02da4d 100644
--- a/doc/prod.md
+++ b/doc/prod.md
@@ -124,6 +124,18 @@ The GUI is a single page application (SPA) and as best practice any route under
In other words, consider the routes above as "reserved" for Puter.
+### Publish My Website
+
+Right-click anywhere on the desktop to display options
+From the options menu, select "New".
+Then, choose "Folder".
+Give the folder a name according to your preference.
+
+After creating the folder:
+
+Right-click on the folder.
+Select the option "Publish as Website".
+
### Best Practices
- The `title` tags and meta tags (` `, ` {
+ out(`${'#'.repeat(n)} ${str}\n\n`);
+};
+
+const N_START = 3;
+
+const out = str => process.stdout.write(str);
+for ( const configVal of configVals ) {
+ mdlib.h(out, N_START, `\`${configVal.key}\``);
+ out(`${dedent(configVal.description) }\n\n`);
+
+ if ( configVal.example_values ) {
+ mdlib.h(out, N_START + 1, 'Examples');
+ for ( const example of configVal.example_values ) {
+ out(`- \`"${configVal.key}": ${JSON.stringify(example)}\`\n`);
+ }
+ }
+
+ out('\n');
+
+}
diff --git a/doc/self-hosters/instructions.md b/doc/self-hosters/instructions.md
new file mode 100644
index 0000000000..4be6845765
--- /dev/null
+++ b/doc/self-hosters/instructions.md
@@ -0,0 +1,59 @@
+# Self-Hosting Puter
+
+> [!WARNING]
+> The self-hosted version of Puter is currently in alpha stage and should not be used in production yet. It is under active development and may contain bugs, other issues. Please exercise caution and use it for testing and evaluation purposes only.
+
+### Self-Hosting Differences
+Currently, the self-hosted version of Puter is different in a few ways from [Puter.com](https://puter.com):
+- There is no built-in way to access apps from puter.com (see below)
+- Several "core" apps are missing, such as **Code** or **Draw**
+- Some assets are different
+
+Work is ongoing to improve the **App Center** and make it available on self-hosted.
+Until then, it is still possible to add apps using the **Dev Center** app.
+
+
+
+## Configuration
+
+Running the server will generate a [configuration file](./config.md) in one of these locations:
+- `config/config.json` when [Using Docker](#using-docker)
+- `volatile/config/config.json` in [Local Development](#local-development)
+- `/etc/puter/config.json` on a server (or within a Docker container)
+
+### Domain Name
+
+To access Puter on your device, you can simply go to the address printed in
+the server console (usually `puter.localhost:4100`).
+
+To access Puter from another device on LAN, enable the following configuration:
+```json
+"allow_nipio_domains": true
+```
+
+To access Puter from another device, a domain name must be configured, as well as
+an `api` subdomain. For example, `example.local` might be the domain name pointing
+to the IP address of the server running puter, and `api.example.com` must point to
+this address as well. This domain must be specified in the configuration file
+(usually `volatile/config/config.json`) as well.
+
+See [domain configuration](./domains.md) for more information.
+
+### Configure the Port
+
+- You can specify a custom port by setting `http_port` to a desired value
+- If you're using a reverse-proxy such as nginx or cloudflare, you should
+ also set `pub_port` to the public (external) port (usually `443`)
+- If you have HTTPS enabled on your reverse-proxy, ensure that
+ `protocol` in config.json is set accordingly
+
+### Default User
+
+By default, Puter will create a user called `default_user`.
+This user will have a randomly generated password, which will be printed
+in the development console.
+A warning will persist in the dev console until this user's
+password is changed. Please login to this user and change the password as
+your first step.
+
+
diff --git a/doc/testing_with_email.md b/doc/testing_with_email.md
new file mode 100644
index 0000000000..d1156c63c1
--- /dev/null
+++ b/doc/testing_with_email.md
@@ -0,0 +1,31 @@
+# Testing with Email
+
+Testing anything involving email is really simple using [mailhog](https://github.com/mailhog/MailHog)
+
+### Step 1: Configure email service
+
+In your `config.json` for Puter (`volatile/config/config.json` usually, `/var/puter/config.json` in containers),
+add this entry to the `"services`" map:
+
+```javascript
+ "services": {
+
+ // ... there are probably other service configs
+
+ "email": {
+ "host": "localhost",
+ "port": 1025
+ }
+ }
+```
+
+### Step 2: Install and run mailhog
+
+Follow the instructions on [MailHog](https://github.com/mailhog/MailHog)'s
+repository, or install through your distro's package manager.
+
+Run the command: `mailhog`.
+
+You should now have an inbox at [http://127.0.0.1:8025](http://127.0.0.1:8025).
+
+Every email that Puter sends will show up on this page.
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000000..abfaeb3ce9
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,204 @@
+import js from '@eslint/js';
+import stylistic from '@stylistic/eslint-plugin';
+import tseslintPlugin from '@typescript-eslint/eslint-plugin';
+import tseslintParser from '@typescript-eslint/parser';
+import { defineConfig } from 'eslint/config';
+import globals from 'globals';
+import bangSpaceIf from './eslint/bang-space-if.js';
+import controlStructureSpacing from './eslint/control-structure-spacing.js';
+import spaceUnaryOpsWithException from './eslint/space-unary-ops-with-exception.js';
+
+export const rules = {
+ 'no-invalid-this': 'error',
+ 'no-unused-vars': ['error', {
+ vars: 'all',
+ args: 'after-used',
+ caughtErrors: 'none',
+ ignoreRestSiblings: false,
+ ignoreUsingDeclarations: false,
+ reportUsedIgnorePattern: false,
+ argsIgnorePattern: '^_',
+ destructuredArrayIgnorePattern: '^_',
+
+ }],
+ curly: ['error', 'multi-line'],
+ '@stylistic/curly-newline': ['error', 'always'],
+ '@stylistic/object-curly-spacing': ['error', 'always'],
+ '@stylistic/indent': ['error', 4, {
+ SwitchCase: 1,
+ CallExpression: {
+ arguments: 1,
+ },
+ }],
+ '@stylistic/indent-binary-ops': ['error', 4],
+ '@stylistic/array-bracket-newline': ['error', 'consistent'],
+ '@stylistic/semi': ['error', 'always'],
+ '@stylistic/quotes': ['error', 'single', { 'avoidEscape': true }],
+ '@stylistic/function-call-argument-newline': ['error', 'consistent'],
+ '@stylistic/function-paren-newline': ['error', 'multiline-arguments'],
+ '@stylistic/arrow-spacing': ['error', { before: true, after: true }],
+ '@stylistic/space-before-function-paren': 'error',
+ '@stylistic/key-spacing': ['error', { 'beforeColon': false, 'afterColon': true }],
+ '@stylistic/keyword-spacing': ['error', { 'before': true, 'after': true }],
+ '@stylistic/no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0 }],
+ '@stylistic/comma-spacing': ['error', { 'before': false, 'after': true }],
+ '@stylistic/comma-dangle': ['error', 'always-multiline'],
+ '@stylistic/object-property-newline': ['error', { allowAllPropertiesOnSameLine: true }],
+ '@stylistic/dot-location': ['error', 'property'],
+ '@stylistic/space-infix-ops': ['error'],
+ 'no-undef': 'error',
+ 'custom/control-structure-spacing': 'error',
+ 'custom/bang-space-if': 'error',
+ '@stylistic/no-trailing-spaces': 'error',
+ '@stylistic/space-before-blocks': ['error', 'always'],
+ 'prefer-template': 'error',
+ '@stylistic/no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
+ 'custom/space-unary-ops-with-exception': ['error', { words: true, nonwords: false }],
+ '@stylistic/no-multi-spaces': ['error', { exceptions: { 'VariableDeclarator': true } }],
+ '@stylistic/type-annotation-spacing': 'error',
+ '@stylistic/type-generic-spacing': 'error',
+ '@stylistic/type-named-tuple-spacing': ['error'],
+ 'no-use-before-define': ['error', {
+ 'functions': false,
+ }],
+ '@stylistic/array-bracket-spacing': ['error', 'never'],
+ '@stylistic/linebreak-style': ['error', 'unix'],
+ 'no-useless-computed-key': 'error',
+ 'no-sequences': [
+ 'error', {
+ allowInParentheses: false,
+ },
+ ],
+};
+
+const tsRules = {
+ '@typescript-eslint/no-explicit-any': 'warn',
+ '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', caughtErrors: 'none' }],
+ '@typescript-eslint/ban-ts-comment': 'warn',
+ '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
+};
+
+const sharedPlugins = {
+ js,
+ '@stylistic': stylistic,
+ custom: {
+ rules: {
+ 'control-structure-spacing': controlStructureSpacing,
+ 'bang-space-if': bangSpaceIf,
+ 'space-unary-ops-with-exception': spaceUnaryOpsWithException,
+ },
+ },
+};
+
+const sharedJsConfig = {
+ rules,
+ plugins: sharedPlugins,
+};
+
+const recommendedJsConfig = {
+ ...sharedJsConfig,
+ extends: ['js/recommended'],
+};
+
+const createTsConfig = ({ files, project, ignores = [], globals: tsGlobals }) => ({
+ files,
+ ignores,
+ languageOptions: {
+ parser: tseslintParser,
+ ...(tsGlobals ? { globals: tsGlobals } : {}),
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ project,
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tseslintPlugin,
+ },
+ rules: tsRules,
+});
+
+const backendConfig = {
+ ...recommendedJsConfig,
+ files: [
+ 'src/backend/**/*.{js,mjs,cjs,ts}',
+ 'src/putility/**/*.{js,mjs,cjs,ts}',
+ ],
+ ignores: [
+ '**/*.test.js',
+ '**/*.test.ts',
+ '**/*.test.mts',
+ ],
+ languageOptions: { globals: globals.node },
+};
+
+const testConfig = {
+ ...sharedJsConfig,
+ files: [
+ '**/*.test.js',
+ '**/*.test.ts',
+ '**/*.test.mts',
+ ],
+ languageOptions: { globals: { ...globals.node, ...globals.vitest } },
+};
+
+const extensionConfig = {
+ ...recommendedJsConfig,
+ files: ['extensions/**/*.{js,mjs,cjs,ts}'],
+ languageOptions: {
+ globals: {
+ extension: 'readonly',
+ config: 'readonly',
+ global_config: 'readonly',
+ ...globals.node,
+ },
+ },
+};
+
+const frontendConfig = {
+ ...recommendedJsConfig,
+ files: ['**/*.{js,mjs,cjs,ts}', 'src/gui/src/**/*.js'],
+ ignores: [
+ 'src/backend/**/*.{js,mjs,cjs,ts}',
+ 'extensions/**/*.{js,mjs,cjs,ts}',
+ 'submodules/**',
+ '**/*.test.{js,ts,mts,mjs}',
+ '**/*.min.js',
+ '**/*.min.cjs',
+ '**/*.min.mjs',
+ '**/socket.io.js',
+ '**/dist/*.js',
+ 'src/gui/src/lib/**',
+ 'src/gui/dist/**',
+ ],
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ ...globals.jquery,
+ i18n: 'readonly',
+ puter: 'readonly',
+ },
+ },
+};
+
+export default defineConfig([
+ createTsConfig({
+ files: ['**/*.test.ts', '**/*.test.mts', '**/*.test.setup.ts'],
+ ignores: ['tests/playwright/tests/**/*.ts'],
+ project: './tests/tsconfig.json',
+ globals: { ...globals.node, ...globals.vitest },
+ }),
+ createTsConfig({
+ files: ['**/*.ts'],
+ ignores: ['**/*.test.ts', '**/*.test.mts', 'extensions/**/*.ts'],
+ project: './tsconfig.json',
+ }),
+ createTsConfig({
+ files: ['extensions/**/*.ts'],
+ project: './extensions/tsconfig.json',
+ }),
+ backendConfig,
+ testConfig,
+ extensionConfig,
+ frontendConfig,
+]);
diff --git a/eslint/bang-space-if.js b/eslint/bang-space-if.js
new file mode 100644
index 0000000000..7b6c0b8dd5
--- /dev/null
+++ b/eslint/bang-space-if.js
@@ -0,0 +1,69 @@
+// eslint-plugin-bang-space-if/index.js
+'use strict';
+
+/** @type {import('eslint').ESLint.Plugin} */
+export default {
+ meta: {
+ type: 'layout',
+ docs: {
+ description:
+ "Require a space after a top-level '!' in an if(...) condition (e.g., `if ( ! entry )`).",
+ recommended: false,
+ },
+ fixable: 'whitespace',
+ schema: [], // no options
+ },
+ create (context) {
+ const source = context.getSourceCode();
+
+ // Unwrap ParenthesizedExpression layers, if any
+ function unwrapParens (node) {
+ let n = node;
+ // ESLint/ESTree: ParenthesizedExpression is supported by espree
+ while ( n && n.type === 'ParenthesizedExpression' ) {
+ n = n.expression;
+ }
+ return n;
+ }
+
+ return {
+ IfStatement (ifNode) {
+ const testRaw = ifNode.test;
+ if ( ! testRaw ) return;
+
+ const test = unwrapParens(testRaw);
+ if ( !test || test.type !== 'UnaryExpression' || test.operator !== '!' ) {
+ return; // only top-level `!` expressions
+ }
+
+ // Ignore boolean-cast `!!x` cases to avoid producing `! !x`
+ if ( test.argument && test.argument.type === 'UnaryExpression' && test.argument.operator === '!' ) {
+ return;
+ }
+
+ // Grab operator and argument tokens
+ const opToken = source.getFirstToken(test); // should be '!'
+ const argToken = source.getTokenAfter(opToken, { includeComments: false });
+ if ( !opToken || !argToken ) return;
+
+ // Compute current whitespace between '!' and the argument
+ const between = source.text.slice(opToken.range[1], argToken.range[0]);
+
+ // We want exactly one space
+ if ( between === ' ' ) return;
+
+ context.report({
+ node: test,
+ loc: {
+ start: opToken.loc.end,
+ end: argToken.loc.start,
+ },
+ message: "Expected a single space after top-level '!' in if(...) condition.",
+ fix (fixer) {
+ return fixer.replaceTextRange([opToken.range[1], argToken.range[0]], ' ');
+ },
+ });
+ },
+ };
+ },
+};;;;
diff --git a/eslint/control-structure-spacing.js b/eslint/control-structure-spacing.js
new file mode 100644
index 0000000000..bd2bf2ed94
--- /dev/null
+++ b/eslint/control-structure-spacing.js
@@ -0,0 +1,206 @@
+export default {
+ meta: {
+ type: 'layout',
+ docs: {
+ description: 'enforce spacing inside parentheses for control structures only',
+ category: 'Stylistic Issues',
+ },
+ fixable: 'whitespace',
+ schema: [],
+ messages: {
+ missingSpaceAfterOpen: 'Missing space after opening parenthesis in control structure.',
+ missingSpaceBeforeClose: 'Missing space before closing parenthesis in control structure.',
+ unexpectedSpaceAfterOpen: 'Unexpected space after opening parenthesis in function call.',
+ unexpectedSpaceBeforeClose: 'Unexpected space before closing parenthesis in function call.',
+ },
+ },
+
+ create (context) {
+ const sourceCode = context.getSourceCode();
+
+ function checkControlStructureSpacing (node) {
+ // For control structures, we need to find the parentheses around the condition/test
+ let conditionNode;
+
+ if ( node.type === 'IfStatement' || node.type === 'WhileStatement' || node.type === 'DoWhileStatement' ) {
+ conditionNode = node.test;
+ } else if ( node.type === 'ForStatement' || node.type === 'ForInStatement' || node.type === 'ForOfStatement' ) {
+ // For loops, we want the parentheses around the entire for clause
+ conditionNode = node;
+ } else if ( node.type === 'SwitchStatement' ) {
+ conditionNode = node.discriminant;
+ } else if ( node.type === 'CatchClause' ) {
+ conditionNode = node.param;
+ }
+
+ if ( ! conditionNode ) return;
+
+ // Find the opening paren - it should be right before the condition starts
+ const openParen = sourceCode.getTokenBefore(conditionNode, token => token.value === '(');
+ if ( !openParen || openParen.value !== '(' ) return;
+
+ // Find the closing paren - it should be right after the condition ends
+ const closeParen = sourceCode.getTokenAfter(conditionNode, token => token.value === ')');
+ if ( !closeParen || closeParen.value !== ')' ) return;
+
+ const afterOpen = sourceCode.getTokenAfter(openParen);
+ const beforeClose = sourceCode.getTokenBefore(closeParen);
+
+ {
+ const contentBetweenParens = sourceCode.getText().slice(openParen.range[1], closeParen.range[0]);
+ const isSingleCharVariable = /^\s*[a-zA-Z_$]\s*$/.test(contentBetweenParens);
+
+ // Skip spacing requirements for single character variables
+ if ( isSingleCharVariable ) {
+ return;
+ }
+ }
+
+ // Control structures should have spacing
+ if ( afterOpen && openParen.range[1] === afterOpen.range[0] ) {
+ context.report({
+ node,
+ loc: openParen.loc,
+ messageId: 'missingSpaceAfterOpen',
+ fix (fixer) {
+ return fixer.insertTextAfter(openParen, ' ');
+ },
+ });
+ }
+
+ if ( beforeClose && beforeClose.range[1] === closeParen.range[0] ) {
+ context.report({
+ node,
+ loc: closeParen.loc,
+ messageId: 'missingSpaceBeforeClose',
+ fix (fixer) {
+ return fixer.insertTextBefore(closeParen, ' ');
+ },
+ });
+ }
+ }
+
+ function checkForLoopSpacing (node) {
+ // For loops are special - we need to find the opening paren after the 'for' keyword
+ // and the closing paren before the body
+ const forKeyword = sourceCode.getFirstToken(node);
+ if ( !forKeyword || forKeyword.value !== 'for' ) return;
+
+ const openParen = sourceCode.getTokenAfter(forKeyword, token => token.value === '(');
+ if ( ! openParen ) return;
+
+ // The closing paren should be right before the body
+ const closeParen = sourceCode.getTokenBefore(node.body, token => token.value === ')');
+ if ( ! closeParen ) return;
+
+ const afterOpen = sourceCode.getTokenAfter(openParen);
+ const beforeClose = sourceCode.getTokenBefore(closeParen);
+
+ if ( afterOpen && openParen.range[1] === afterOpen.range[0] ) {
+ context.report({
+ node,
+ loc: openParen.loc,
+ messageId: 'missingSpaceAfterOpen',
+ fix (fixer) {
+ return fixer.insertTextAfter(openParen, ' ');
+ },
+ });
+ }
+
+ if ( beforeClose && beforeClose.range[1] === closeParen.range[0] ) {
+ context.report({
+ node,
+ loc: closeParen.loc,
+ messageId: 'missingSpaceBeforeClose',
+ fix (fixer) {
+ return fixer.insertTextBefore(closeParen, ' ');
+ },
+ });
+ }
+ }
+
+ function checkFunctionCallSpacing (node) {
+ // Find the opening parenthesis for this function call
+ const openParen = sourceCode.getFirstToken(node, token => token.value === '(');
+ const closeParen = sourceCode.getLastToken(node, token => token.value === ')');
+
+ if ( !openParen || !closeParen ) return;
+ // Defer multi-line call/new formatting to stylistic paren/argument rules.
+ if ( openParen.loc.start.line !== closeParen.loc.end.line ) return;
+
+ const afterOpen = sourceCode.getTokenAfter(openParen);
+ const beforeClose = sourceCode.getTokenBefore(closeParen);
+
+ // Function calls should NOT have spacing on the same line (multi-line calls are allowed)
+ if ( afterOpen && openParen.range[1] !== afterOpen.range[0] ) {
+ const spaceAfter = sourceCode.getText().slice(openParen.range[1], afterOpen.range[0]);
+ if ( /^\s+$/.test(spaceAfter) && !spaceAfter.includes('\n') ) {
+ context.report({
+ node,
+ loc: openParen.loc,
+ messageId: 'unexpectedSpaceAfterOpen',
+ fix (fixer) {
+ return fixer.removeRange([openParen.range[1], afterOpen.range[0]]);
+ },
+ });
+ }
+ }
+
+ if ( beforeClose && beforeClose.range[1] !== closeParen.range[0] ) {
+ const spaceBefore = sourceCode.getText().slice(beforeClose.range[1], closeParen.range[0]);
+ if ( /^\s+$/.test(spaceBefore) && !spaceBefore.includes('\n') ) {
+ context.report({
+ node,
+ loc: closeParen.loc,
+ messageId: 'unexpectedSpaceBeforeClose',
+ fix (fixer) {
+ return fixer.removeRange([beforeClose.range[1], closeParen.range[0]]);
+ },
+ });
+ }
+ }
+ }
+
+ return {
+ // Control structures that should have spacing
+ IfStatement (node) {
+ checkControlStructureSpacing(node);
+ },
+ WhileStatement (node) {
+ checkControlStructureSpacing(node);
+ },
+ DoWhileStatement (node) {
+ checkControlStructureSpacing(node);
+ },
+ SwitchStatement (node) {
+ checkControlStructureSpacing(node);
+ },
+ CatchClause (node) {
+ if ( node.param ) {
+ checkControlStructureSpacing(node);
+ }
+ },
+
+ // For loops need special handling
+ ForStatement (node) {
+ checkForLoopSpacing(node);
+ },
+ ForInStatement (node) {
+ checkForLoopSpacing(node);
+ },
+ ForOfStatement (node) {
+ checkForLoopSpacing(node);
+ },
+
+ // Function calls that should NOT have spacing
+ CallExpression (node) {
+ checkFunctionCallSpacing(node);
+ },
+ NewExpression (node) {
+ if ( node.arguments.length > 0 || sourceCode.getLastToken(node).value === ')' ) {
+ checkFunctionCallSpacing(node);
+ }
+ },
+ };
+ },
+};
diff --git a/eslint/mandatory.eslint.config.js b/eslint/mandatory.eslint.config.js
new file mode 100644
index 0000000000..5f0e4962d4
--- /dev/null
+++ b/eslint/mandatory.eslint.config.js
@@ -0,0 +1,86 @@
+import tseslintPlugin from '@typescript-eslint/eslint-plugin';
+import { defineConfig } from 'eslint/config';
+import globals from 'globals';
+
+const backendLanguageOptions = {
+ globals: {
+ // Current, intentionally supported globals
+ extension: 'readonly',
+ config: 'readonly',
+ global_config: 'readonly',
+
+ // Older not entirely ideal globals
+ use: 'readonly', // <-- older import mechanism
+ def: 'readonly', // <-- older import mechanism
+ kv: 'readonly', // <-- should be passed/imported
+ ll: 'readonly', // <-- questionable
+
+ // Language/environment globals
+ ...globals.node,
+ },
+};
+
+const mandatoryRules = {
+ 'no-undef': 'error',
+ 'no-use-before-define': ['error', {
+ 'functions': false,
+ }],
+ 'no-invalid-this': 'warn',
+};
+
+export default defineConfig([
+ {
+ ignores: [
+ 'src/backend/src/modules/apps/AppInformationService.js', // TEMPORARY - SHOULD BE FIXED!
+ 'src/backend/src/services/worker/WorkerService.js', // TEMPORARY - SHOULD BE FIXED!
+ 'src/backend/src/public/**/*', // We may be able to delete this! I don't think it's used
+
+ // These files run in the worker environment, so these rules don't apply
+ 'src/backend/src/services/worker/dist/**/*.{js,cjs,mjs}',
+ 'src/backend/src/services/worker/src/**/*.{js,cjs,mjs}',
+ 'src/backend/src/services/worker/template/puter-portable.js',
+ ],
+ },
+ {
+ plugins: {
+ '@typescript-eslint': tseslintPlugin,
+ },
+ },
+ {
+ files: [
+ 'src/backend/**/*.{js,mjc,cjs}',
+ 'extensions/**/*.{js,mjc,cjs}',
+ ],
+ ignores: [
+ 'src/backend/src/services/database/sqlite_setup/**/*.js',
+ ],
+ rules: mandatoryRules,
+ languageOptions: {
+ ...backendLanguageOptions,
+ },
+ },
+ {
+ files: [
+ 'src/backend/src/services/database/sqlite_setup/**/*.js',
+ ],
+ rules: mandatoryRules,
+ languageOptions: {
+ globals: {
+ read: 'readonly',
+ write: 'readonly',
+ log: 'readonly',
+ ...globals.node,
+ },
+ },
+ },
+ {
+ files: [
+ 'src/backend/**/*.{ts}',
+ 'extensions/**/*.{ts}',
+ ],
+ rules: mandatoryRules,
+ languageOptions: {
+ ...backendLanguageOptions,
+ },
+ },
+]);
diff --git a/eslint/space-unary-ops-with-exception.js b/eslint/space-unary-ops-with-exception.js
new file mode 100644
index 0000000000..83a48d366c
--- /dev/null
+++ b/eslint/space-unary-ops-with-exception.js
@@ -0,0 +1,37 @@
+import ruleComposer from 'eslint-rule-composer';
+
+// Adjust this require to match the package you use for the rule.
+// For eslint-stylistic v2+ the package is "@stylistic/eslint-plugin"
+import stylistic from '@stylistic/eslint-plugin';
+const baseRule = stylistic.rules['space-unary-ops'];
+
+// unwrap nested parentheses
+function unwrapParens (node) {
+ let n = node;
+ while ( n && n.type === 'ParenthesizedExpression' ) n = n.expression;
+ return n;
+}
+
+function isTopLevelBangInIfTest (node) {
+ if ( !node || node.type !== 'UnaryExpression' || node.operator !== '!' ) return false;
+
+ // Walk up through ancestors manually using .parent (safe in ESLint)
+ let current = node;
+ let parent = current.parent;
+
+ // Skip ParenthesizedExpression layers
+ while ( parent && parent.type === 'ParenthesizedExpression' ) {
+ current = parent;
+ parent = parent.parent;
+ }
+
+ return parent && parent.type === 'IfStatement' && unwrapParens(parent.test) === node;
+}
+
+// Filter out ONLY the reports for top-level ! inside if(...) condition
+export default ruleComposer.filterReports(baseRule, (problem, context) => {
+ const { node } = problem;
+ // If this particular report is about a top-level ! in an if(...) test,
+ // suppress it. Otherwise, keep the original report.
+ return !isTopLevelBangInIfTest(node, context);
+});
diff --git a/exports.js b/exports.js
index fd9c632477..63cc7337bf 100644
--- a/exports.js
+++ b/exports.js
@@ -1,2 +1,20 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
import backend from '@heyputer/backend';
export default backend;
diff --git a/packages/backend/src/filesystem/core/FSEntry.ts b/extensions/.gitkeep
similarity index 100%
rename from packages/backend/src/filesystem/core/FSEntry.ts
rename to extensions/.gitkeep
diff --git a/extensions/README.md b/extensions/README.md
new file mode 100644
index 0000000000..6186a41dda
--- /dev/null
+++ b/extensions/README.md
@@ -0,0 +1,11 @@
+# Extension System Development Guide
+
+## Where to find documentation
+
+### Here
+Documentation for extensions is [here](src/backend/doc/extensions/README.md).
+
+### Not Here
+
+Outdated documentation for extensions is [here](../doc/contributors/extensions/README.md).
+This documentation may include some topics that are missing from the current documentation. Eventually those topics should be updated and transferred to the current documentation so that this documentation may be removed.
diff --git a/extensions/api.d.ts b/extensions/api.d.ts
new file mode 100644
index 0000000000..3dd3b3e137
--- /dev/null
+++ b/extensions/api.d.ts
@@ -0,0 +1,207 @@
+
+import type APIError from '@heyputer/backend/src/api/APIError.js';
+import type query from '@heyputer/backend/src/om/query/query';
+import type { Actor } from '@heyputer/backend/src/services/auth/Actor.js';
+import type { ServicesMap } from '@heyputer/backend/src/services/BaseService.d.ts';
+import type { BaseDatabaseAccessService } from '@heyputer/backend/src/services/database/BaseDatabaseAccessService.d.ts';
+import type { DynamoKVStore } from '@heyputer/backend/src/services/repositories/DynamoKVStore/DynamoKVStore.ts';
+import type { IUser } from '@heyputer/backend/src/services/User.js';
+import type { Context } from '@heyputer/backend/src/util/context.js';
+import type kvjs from '@heyputer/kv.js';
+import type { RequestHandler } from 'express';
+import type { Cluster } from 'ioredis';
+import type FSNodeContext from '../src/backend/src/filesystem/FSNodeContext.js';
+import type helpers from '../src/backend/src/helpers.js';
+import type { ICompleteArguments } from '../src/backend/src/services/ai/chat/providers/types.ts';
+import type * as ExtensionControllerExports from './ExtensionController/src/ExtensionController.ts';
+import type { s3ClientProvider } from '../src/backend/src/clients/s3/s3ClientProvider.js';
+
+declare global {
+ namespace Express {
+ interface Request {
+ services: {
+ get: (
+ string: T,
+ ) => T extends keyof ServicesMap ? ServicesMap[T] : unknown;
+ };
+ actor?: Actor;
+ rawBody: Buffer;
+ /** @deprecated use actor instead */
+ user: IUser;
+ }
+ }
+}
+
+export type { Cluster } from 'ioredis';
+
+export interface EndpointOptions {
+ allowedMethods?: string[];
+ subdomain?: string;
+ noauth?: boolean;
+ mw?: RequestHandler[];
+ otherOpts?: Record & {
+ json?: boolean;
+ noReallyItsJson?: boolean;
+ };
+}
+
+// Driver interface types
+interface ParameterDefinition {
+ type: 'string' | 'number' | 'boolean' | 'object' | 'array';
+ optional: boolean;
+}
+interface MethodDefinition {
+ description: string;
+ parameters: Record;
+}
+interface DriverInterface {
+ description: string;
+ methods: Record;
+}
+
+export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';
+
+export type AddRouteFunction = (
+ path: string,
+ options: EndpointOptions,
+ handler: RequestHandler,
+) => void;
+
+export type RouterMethods = {
+ [K in HttpMethod]: {
+ (path: string, options: EndpointOptions, handler: RequestHandler): void;
+ (path: string, handler: RequestHandler, options?: EndpointOptions): void;
+ };
+};
+
+interface CoreRuntimeModule {
+ util: {
+ helpers: typeof helpers;
+ };
+ redisClient: Cluster;
+ kvjs: kvjs
+ s3ClientProvider: typeof s3ClientProvider;
+ Context: typeof Context;
+ APIError: typeof APIError;
+}
+
+interface FilesystemModule {
+ FSNodeContext: FSNodeContext;
+ selectors: unknown;
+}
+
+export interface ExtensionEventTypeMap {
+ 'metering:registerAvailablePolicies': {
+ availablePolicies: unknown[]
+ },
+ 'create.drivers': {
+ createDriver: (interface: string, service: string, executors: any) => any;
+ };
+ 'create.permissions': {
+ grant_to_everyone: (permission: string) => void;
+ grant_to_users: (permission: string) => void;
+ };
+ 'create.interfaces': {
+ createInterface: (interface: string, interfaces: DriverInterface) => void;
+ };
+ 'puter.gui.addons': {
+ bodyContent: string;
+ headContent: string;
+ guiParams: {
+ env: string;
+ app_origin: string;
+ api_origin: string;
+ gui_origin: string;
+ asset_dir: string;
+ launch_options: unknown;
+ app_name_regex: RegExp;
+ app_name_max_length: number;
+ app_title_max_length: number;
+ hosting_domain: string;
+ subdomain_regex: RegExp;
+ subdomain_max_length: number;
+ domain: string;
+ protocol: string;
+ api_base_url: string;
+ app?: { name: string, uid: string } & Record;
+ [key: string]: unknown;
+ };
+ };
+ 'app.changed': {
+ app_uid: string;
+ action: 'updated' | 'deleted';
+ };
+ 'app.privateAccess.check': {
+ appUid: string;
+ userUid?: string | null;
+ requestHost?: string;
+ requestPath?: string;
+ result: {
+ allowed: boolean;
+ redirectUrl?: string;
+ reason?: string;
+ checkedBy?: string;
+ };
+ };
+ 'app.privateAccess.resolveLaunch': {
+ appUid: string;
+ appName?: string;
+ userUid?: string | null;
+ source?: string;
+ args?: Record;
+ result: {
+ hasAccess: boolean;
+ fallbackAppName?: string;
+ fallbackArgs?: Record;
+ reason?: string;
+ checkedBy?: string;
+ };
+ };
+ 'ai.prompt.validate': {
+ actor: Actor;
+ actor,
+ completionId: string,
+ allow: boolean,
+ intended_service: string,
+ parameters: ICompleteArguments
+ }
+ 'outer.cacheUpdate': { cacheKey: string | string[], ttlSeconds?: number, data?: unknown }
+}
+
+interface Extension extends RouterMethods {
+ exports: Record;
+ span: ((label: string, fn: () => T) => () => T) & {
+ run(label: string, fn: () => T): T;
+ run(fn: () => T): T;
+ };
+ config: Record;
+
+ on(
+ name: E,
+ listener: (event: ExtensionEventTypeMap[E], metadata?: { from_outside?: boolean }) => void | Promise
+ ): void;
+ on(name: string, listener: (event: T, metadata?: { from_outside?: boolean }) => void | Promise): void
+
+ import(module: 'data'): {
+ db: BaseDatabaseAccessService;
+ kv: DynamoKVStore;
+ cache: Cluster;
+ s3ClientProvider: typeof s3ClientProvider;
+ };
+ import(module: 'core'): CoreRuntimeModule;
+ import(module: 'fs'): FilesystemModule;
+ import(module: 'query'): typeof query;
+ import(module: 'extensionController'): typeof ExtensionControllerExports;
+ import(
+ module: T
+ ): T extends `service:${infer R extends keyof ServicesMap}`
+ ? ServicesMap[R]
+ : unknown;
+}
+
+declare global {
+ // Declare the extension variable
+ const extension: Extension;
+ const config: Record;
+ const global_config: Record;
+}
diff --git a/extensions/app-telemetry/app-user-count.ts b/extensions/app-telemetry/app-user-count.ts
new file mode 100644
index 0000000000..0f7f3e44de
--- /dev/null
+++ b/extensions/app-telemetry/app-user-count.ts
@@ -0,0 +1,138 @@
+const { Eq } = extension.import('query');
+const { db } = extension.import('data');
+const { APIError, Context } = extension.import('core');
+const app_es = extension.import('service:es:app') as any;
+const svc_permission = extension.import('service:permission') as any;
+
+const DEFAULT_LIMIT = 100;
+const MAX_LIMIT = 1000;
+const MAX_OFFSET = 100_000;
+
+const parseIntegerParam = (
+ value: unknown,
+ {
+ key,
+ min,
+ max,
+ fallback,
+ }: { key: string, min: number, max: number, fallback: number },
+) => {
+ if ( value === undefined || value === null ) return fallback;
+
+ const parsed = typeof value === 'number'
+ ? value
+ : (typeof value === 'string' && value.trim() !== ''
+ ? Number(value)
+ : Number.NaN);
+
+ if ( !Number.isFinite(parsed) || !Number.isInteger(parsed) ) {
+ throw APIError.create('field_invalid', undefined, {
+ key,
+ expected: `an integer between ${min} and ${max}`,
+ got: value,
+ });
+ }
+
+ if ( parsed < min || parsed > max ) {
+ throw APIError.create('field_invalid', undefined, {
+ key,
+ expected: `an integer between ${min} and ${max}`,
+ got: parsed,
+ });
+ }
+
+ return parsed;
+};
+
+extension.on('create.interfaces', (event) => {
+ event.createInterface('app-telemetry', {
+ description: 'Provides methods for getting app telemetry',
+ methods: {
+ get_users: {
+ description: 'Returns users who have used your app',
+ parameters: {
+ app_uuid: {
+ type: 'string',
+ optional: false,
+ },
+ limit: {
+ type: 'number',
+ optional: true,
+ },
+ offset: {
+ type: 'number',
+ optional: true,
+ },
+ },
+ },
+ user_count: {
+ description: 'Returns number of users who have used your app',
+ parameters: {
+ app_uuid: {
+ type: 'string',
+ optional: false,
+ },
+ },
+ },
+ },
+ });
+});
+
+extension.on('create.drivers', event => {
+ event.createDriver('app-telemetry', 'app-telemetry', {
+ async get_users ({ app_uuid, limit, offset }: { app_uuid: string, limit?: number, offset?: number }) {
+ const safeLimit = parseIntegerParam(limit, {
+ key: 'limit',
+ min: 1,
+ max: MAX_LIMIT,
+ fallback: DEFAULT_LIMIT,
+ });
+ const safeOffset = parseIntegerParam(offset, {
+ key: 'offset',
+ min: 0,
+ max: MAX_OFFSET,
+ fallback: 0,
+ });
+
+ // first lets make sure executor owns this app
+ const [result] = (await app_es.select({ predicate: new Eq({ key: 'uid', value: app_uuid }) }));
+ if ( ! result ) {
+ throw APIError.create('permission_denied');
+ }
+ if ( ! (await svc_permission.check(Context.get('actor'), `apps-of-user:${result.values_.owner.uuid}:write`, { no_cache: true })) ) {
+ throw APIError.create('permission_denied');
+ }
+
+ // Fetch and return users
+ const users: Array<{ username: string, uuid: string }> = await db.read(
+ `SELECT user.username, user.uuid FROM user_to_app_permissions
+ INNER JOIN user ON user_to_app_permissions.user_id = user.id
+ WHERE permission = 'flag:app-is-authenticated' AND app_id=? ORDER BY (dt IS NOT NULL), dt, user_id LIMIT ? OFFSET ?`,
+ [result.private_meta.mysql_id, safeLimit, safeOffset],
+ );
+ return users.map(e => {
+ return { user: e.username, user_uuid: e.uuid };
+ });
+ },
+ async user_count ({ app_uuid }: { app_uuid: string }) {
+ // first lets make sure executor owns this app
+ const [result] = (await app_es.select({ predicate: new Eq({ key: 'uid', value: app_uuid }) }));
+ if ( ! result ) {
+ throw APIError.create('permission_denied');
+ }
+
+ // Fetch and return authenticated user count
+ const [data] = await db.read(
+ `SELECT count(*) FROM user_to_app_permissions
+ WHERE permission = 'flag:app-is-authenticated' AND app_id=?;`,
+ [result.private_meta.mysql_id],
+ );
+ const count = data['count(*)'];
+ return count;
+ },
+ });
+});
+
+extension.on('create.permissions', (event) => {
+ event.grant_to_everyone('service:app-telemetry:ii:app-telemetry');
+});
diff --git a/extensions/app-telemetry/index.d.ts b/extensions/app-telemetry/index.d.ts
new file mode 100644
index 0000000000..2fc1c14d94
--- /dev/null
+++ b/extensions/app-telemetry/index.d.ts
@@ -0,0 +1 @@
+import '../api.js';
\ No newline at end of file
diff --git a/extensions/app-telemetry/package.json b/extensions/app-telemetry/package.json
new file mode 100644
index 0000000000..fcc665103e
--- /dev/null
+++ b/extensions/app-telemetry/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@heyputer/app-telemetry",
+ "main": "app-user-count.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "devDependencies": {
+ "typescript": "^5.9.3"
+ }
+}
\ No newline at end of file
diff --git a/extensions/app-telemetry/tsconfig.json b/extensions/app-telemetry/tsconfig.json
new file mode 100644
index 0000000000..6b590838ba
--- /dev/null
+++ b/extensions/app-telemetry/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "rootDir": "./",
+ "strict": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowSyntheticDefaultImports": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/data.js b/extensions/data.js
new file mode 100644
index 0000000000..e72dbba49e
--- /dev/null
+++ b/extensions/data.js
@@ -0,0 +1,34 @@
+//@extension priority -10000
+
+const { redisClient, kvjs, s3ClientProvider } = extension.import('core');
+const svc_database = extension.import('service:database');
+const svc_kvstore = extension.import('service:puter-kvstore');
+
+// Methods on the object from `.as()` come from TraitsFeature.js,
+// and they are already bound to their respective instance.
+const simplified_kv = { ...svc_kvstore.as('puter-kvstore') };
+
+const original_get = simplified_kv.get;
+const original_set = simplified_kv.set;
+
+simplified_kv.get = (...a) => {
+ if ( typeof a[0] === 'string' ) {
+ return original_get({ key: a[0] });
+ }
+ return original_get(...a);
+};
+
+simplified_kv.set = (...a) => {
+ if ( typeof a[0] === 'string' ) {
+ return original_set({ key: a[0], value: a[1] });
+ }
+ return original_set(...a);
+};
+
+extension.exports = {
+ db: svc_database.get(),
+ kv: simplified_kv,
+ cache: redisClient,
+ kvjs: kvjs,
+ s3ClientProvider,
+};
diff --git a/extensions/extensionController/package.json b/extensions/extensionController/package.json
new file mode 100644
index 0000000000..7035aa372c
--- /dev/null
+++ b/extensions/extensionController/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@puter/extension-controller",
+ "version": "1.0.0",
+ "description": "",
+ "main": "src/index.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@types/node": "^24.9.1",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.9.3"
+ },
+ "dependencies": {
+ "http-status-codes": "^2.3.0",
+ "stripe": "^19.1.0"
+ }
+}
\ No newline at end of file
diff --git a/extensions/extensionController/puter.json b/extensions/extensionController/puter.json
new file mode 100644
index 0000000000..5fce7a8c0c
--- /dev/null
+++ b/extensions/extensionController/puter.json
@@ -0,0 +1,3 @@
+{
+ "priority": -10
+}
\ No newline at end of file
diff --git a/extensions/extensionController/src/ExtensionController.ts b/extensions/extensionController/src/ExtensionController.ts
new file mode 100644
index 0000000000..5529a9ab64
--- /dev/null
+++ b/extensions/extensionController/src/ExtensionController.ts
@@ -0,0 +1,238 @@
+import type { NextFunction, Request, Response } from 'express';
+import { StatusCodes } from 'http-status-codes';
+import type {
+ EndpointOptions,
+ HttpMethod,
+ RouterMethods,
+} from '../../api.d.ts';
+declare const extension: Partial>;
+/**
+ * Class decorator to set prefix on prototype and register routes on instantiation
+ * @argument prefix - prefix for all routes under the class
+ * @argument [adminUsernames] - gate all routes behind admin username check
+ */
+export const Controller = (
+ prefix: string,
+ adminUsernames?: string[],
+ allowedAppIds?: string[],
+): ClassDecorator => {
+ return (target: Function) => {
+ target.prototype.__controllerPrefix = prefix;
+ target.prototype.__allowedAppIds = allowedAppIds;
+ target.prototype.__adminUsernames = adminUsernames
+ ? [...adminUsernames, 'admin', 'system']
+ : undefined;
+ };
+};
+
+/**
+ * Method decorator factory that collects route metadata
+ */
+interface RouteMeta {
+ method: HttpMethod;
+ path: string;
+ options?: EndpointOptions | undefined;
+ handler: (req: Request, res: Response, next: NextFunction) => void | Promise;
+ adminUsernames?: string[];
+ allowedAppIds?: string[];
+}
+
+const createMethodDecorator = (method: HttpMethod) => {
+ return (
+ path: string,
+ routeOptions?: EndpointOptions & { allowedAppIds?: string[] },
+ adminUsernames?: string[],
+ ) => {
+ const { allowedAppIds, ...options } = routeOptions ?? {};
+ return (
+ target: (req: Request, res: Response, next: NextFunction) => void | Promise,
+ _context: ClassMethodDecoratorContext<
+ This,
+ (
+ this: This,
+ ...args: [req: Request, res: Response, next: NextFunction]
+ ) => void | Promise
+ >,
+ ) => {
+ _context.addInitializer(function () {
+ // eslint-disable-next-line no-invalid-this
+ const proto = Object.getPrototypeOf(this); // will be bound to class
+ if ( ! proto.__routes ) {
+ proto.__routes = [];
+ }
+ proto.__routes.push({
+ method,
+ path,
+ options: options as EndpointOptions | undefined,
+ adminUsernames: adminUsernames
+ ? [...adminUsernames, 'admin', 'system']
+ : undefined,
+ allowedAppIds,
+ handler: target,
+ });
+ });
+ };
+ };
+};
+
+// HTTP method decorators
+export const Get = createMethodDecorator('get');
+export const Post = createMethodDecorator('post');
+export const Put = createMethodDecorator('put');
+export const Delete = createMethodDecorator('delete');
+// TODO DS: add others as needed (patch, etc)
+
+interface HttpErrorOptions {
+ cause?: unknown;
+ legacyCode?: string;
+ code?: string;
+ fields?: Record;
+}
+
+const isHttpErrorOptions = (value: unknown): value is HttpErrorOptions => {
+ if ( !value || typeof value !== 'object' || Array.isArray(value) ) {
+ return false;
+ }
+
+ return (
+ Object.prototype.hasOwnProperty.call(value, 'cause')
+ || Object.prototype.hasOwnProperty.call(value, 'legacyCode')
+ || Object.prototype.hasOwnProperty.call(value, 'code')
+ || Object.prototype.hasOwnProperty.call(value, 'fields')
+ );
+};
+
+export class HttpError extends Error {
+ statusCode: number;
+ legacyCode?: string;
+ code?: string;
+ fields?: Record;
+ constructor (
+ statusCode: StatusCodes,
+ message: string,
+ causeOrOptions?: unknown,
+ legacyCode?: string,
+ ) {
+ const options = isHttpErrorOptions(causeOrOptions)
+ ? causeOrOptions
+ : undefined;
+ const cause = options
+ ? options.cause
+ : causeOrOptions;
+ const resolvedLegacyCode = legacyCode ?? options?.legacyCode;
+ const code = options?.code;
+ super(
+ `${statusCode} - ${message}`,
+ cause !== undefined ? { cause } : undefined,
+ );
+ this.statusCode = statusCode;
+ this.legacyCode = resolvedLegacyCode;
+ this.code = code;
+ this.fields = options?.fields;
+ }
+}
+
+// Registers all routes from a decorated controller instance to an Express router
+export class ExtensionController {
+ logger?: Console;
+ // TODO DS: make this work with other express-like routers
+ registerRoutes () {
+ const logger = this.logger || console;
+ const prefix = Object.getPrototypeOf(this).__controllerPrefix || '';
+ const adminsForController = Object.getPrototypeOf(this).__adminUsernames as
+ | string[]
+ | undefined;
+ const allowedAppIdsForController = Object.getPrototypeOf(this).__allowedAppIds as
+ | string[]
+ | undefined;
+ const routes: RouteMeta[] = Object.getPrototypeOf(this).__routes || [];
+ for ( const route of routes ) {
+ const fullPath = `${prefix}/${route.path}`.replace(/\/+/g, '/');
+ const adminsForRoute = route.adminUsernames
+ ? adminsForController
+ ? adminsForController.concat(route.adminUsernames)
+ : route.adminUsernames
+ : adminsForController
+ ? adminsForController
+ : undefined;
+ const allowedAppIds = route.allowedAppIds
+ ? allowedAppIdsForController
+ ? allowedAppIdsForController.concat(route.allowedAppIds)
+ : route.allowedAppIds
+ : allowedAppIdsForController
+ ? allowedAppIdsForController
+ : undefined;
+
+ if ( ! extension[route.method] ) {
+ throw new Error(`Unsupported HTTP method: ${route.method}`);
+ } else {
+ logger.log(`Registering route: [${route.method.toUpperCase()}] ${fullPath}`);
+
+ (extension[route.method] as RouterMethods[HttpMethod])(
+ fullPath,
+ route.options || {},
+ async (req, res, next) => {
+ try {
+ if ( adminsForRoute || allowedAppIds ) {
+ if ( ! req.actor ) {
+ throw new HttpError(StatusCodes.UNAUTHORIZED, 'Unauthenticated');
+ }
+ }
+ if ( adminsForRoute ) {
+ if ( ! adminsForRoute.includes(req.actor!.type.user.username) ) {
+ throw new HttpError(
+ StatusCodes.FORBIDDEN,
+ 'Only admins may request this resource.',
+ );
+ }
+ }
+ if ( allowedAppIds ) {
+ if ( ( req.actor!.type?.app?.uid && !allowedAppIds.includes(req.actor!.type.app.uid) ) ) {
+ throw new HttpError(
+ StatusCodes.FORBIDDEN,
+ 'This app may not request this resource.',
+ );
+ }
+ }
+ return await route.handler.bind(this)(req, res, next);
+ } catch ( error ) {
+ if ( error instanceof HttpError ) {
+ const payload: Record = {
+ error: error.message,
+ };
+ if ( error.legacyCode ) {
+ payload.code = error.legacyCode;
+ }
+ if ( error.code ) {
+ if ( payload.code === undefined ) {
+ payload.code = error.code;
+ } else {
+ payload.errorCode = error.code;
+ }
+ }
+ if ( error.fields ) {
+ for ( const [key, value] of Object.entries(error.fields) ) {
+ if ( payload[key] !== undefined ) {
+ continue;
+ }
+ payload[key] = value;
+ }
+ }
+ res.status(error.statusCode).send(payload);
+ logger.warn('httpError:', error);
+ return;
+ }
+ if ( error instanceof Error ) {
+ res.status(StatusCodes.INTERNAL_SERVER_ERROR).send({ error: error.message });
+ logger.error('Non-http error:', error);
+ return;
+ }
+ res.status(StatusCodes.INTERNAL_SERVER_ERROR).send({ error: 'An unknown error occurred' });
+ logger.error('An unknown error occurred:', error);
+ }
+ },
+ );
+ }
+ }
+ }
+}
diff --git a/extensions/extensionController/src/index.ts b/extensions/extensionController/src/index.ts
new file mode 100644
index 0000000000..d4d2769984
--- /dev/null
+++ b/extensions/extensionController/src/index.ts
@@ -0,0 +1,15 @@
+import { Controller, Delete, ExtensionController, Get, HttpError, Post, Put } from './ExtensionController.js';
+
+extension.exports = {
+ ExtensionController,
+ Controller,
+ Get,
+ Put,
+ Post,
+ Delete,
+ HttpError,
+};
+
+export {
+ Controller, Delete, ExtensionController, Get, HttpError, Post, Put,
+};
diff --git a/extensions/extensionController/tsconfig.json b/extensions/extensionController/tsconfig.json
new file mode 100644
index 0000000000..c9cbd48a9b
--- /dev/null
+++ b/extensions/extensionController/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "noEmitOnError": true,
+ "noImplicitAny": false,
+ "allowJs": true,
+ "checkJs": false,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/fsv2/package-lock.json b/extensions/fsv2/package-lock.json
new file mode 100644
index 0000000000..dbf6c2349d
--- /dev/null
+++ b/extensions/fsv2/package-lock.json
@@ -0,0 +1,2653 @@
+{
+ "name": "@heyputer/prodfsv2",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@heyputer/prodfsv2",
+ "version": "1.0.0",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "@aws-sdk/s3-request-presigner": "^3.1021.0",
+ "body-parser": "^2.2.0",
+ "busboy": "^1.6.0",
+ "http-status-codes": "^2.3.0",
+ "stripe": "^20.1.2",
+ "uuid": "^13.0.0"
+ },
+ "devDependencies": {
+ "@aws-sdk/client-s3": "^3.1021.0",
+ "@types/express": "^4.17.21",
+ "@types/node": "^24.9.1",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.9.3"
+ }
+ },
+ "node_modules/@aws-crypto/crc32": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
+ "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/crc32c": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz",
+ "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz",
+ "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
+ "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-js": "^5.2.0",
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+ "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
+ "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+ "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.1021.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1021.0.tgz",
+ "integrity": "sha512-BCfggq8gYSjlKOZlMSVApix3cgKAQIWGeoJFX/AU5HMvqz1BZBEw83jJFL9LYrqTPCocH8NGl++1Xr70ro+jcg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha1-browser": "5.2.0",
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/credential-provider-node": "^3.972.29",
+ "@aws-sdk/middleware-bucket-endpoint": "^3.972.8",
+ "@aws-sdk/middleware-expect-continue": "^3.972.8",
+ "@aws-sdk/middleware-flexible-checksums": "^3.974.6",
+ "@aws-sdk/middleware-host-header": "^3.972.8",
+ "@aws-sdk/middleware-location-constraint": "^3.972.8",
+ "@aws-sdk/middleware-logger": "^3.972.8",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.9",
+ "@aws-sdk/middleware-sdk-s3": "^3.972.27",
+ "@aws-sdk/middleware-ssec": "^3.972.8",
+ "@aws-sdk/middleware-user-agent": "^3.972.28",
+ "@aws-sdk/region-config-resolver": "^3.972.10",
+ "@aws-sdk/signature-v4-multi-region": "^3.996.15",
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-endpoints": "^3.996.5",
+ "@aws-sdk/util-user-agent-browser": "^3.972.8",
+ "@aws-sdk/util-user-agent-node": "^3.973.14",
+ "@smithy/config-resolver": "^4.4.13",
+ "@smithy/core": "^3.23.13",
+ "@smithy/eventstream-serde-browser": "^4.2.12",
+ "@smithy/eventstream-serde-config-resolver": "^4.3.12",
+ "@smithy/eventstream-serde-node": "^4.2.12",
+ "@smithy/fetch-http-handler": "^5.3.15",
+ "@smithy/hash-blob-browser": "^4.2.13",
+ "@smithy/hash-node": "^4.2.12",
+ "@smithy/hash-stream-node": "^4.2.12",
+ "@smithy/invalid-dependency": "^4.2.12",
+ "@smithy/md5-js": "^4.2.12",
+ "@smithy/middleware-content-length": "^4.2.12",
+ "@smithy/middleware-endpoint": "^4.4.28",
+ "@smithy/middleware-retry": "^4.4.46",
+ "@smithy/middleware-serde": "^4.2.16",
+ "@smithy/middleware-stack": "^4.2.12",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/node-http-handler": "^4.5.1",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.44",
+ "@smithy/util-defaults-mode-node": "^4.2.48",
+ "@smithy/util-endpoints": "^3.3.3",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-retry": "^4.2.13",
+ "@smithy/util-stream": "^4.5.21",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/util-waiter": "^4.2.14",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/core": {
+ "version": "3.973.26",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.26.tgz",
+ "integrity": "sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/xml-builder": "^3.972.16",
+ "@smithy/core": "^3.23.13",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/signature-v4": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/crc64-nvme": {
+ "version": "3.972.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz",
+ "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.972.24",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.24.tgz",
+ "integrity": "sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.972.26",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.26.tgz",
+ "integrity": "sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/fetch-http-handler": "^5.3.15",
+ "@smithy/node-http-handler": "^4.5.1",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-stream": "^4.5.21",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.28.tgz",
+ "integrity": "sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/credential-provider-env": "^3.972.24",
+ "@aws-sdk/credential-provider-http": "^3.972.26",
+ "@aws-sdk/credential-provider-login": "^3.972.28",
+ "@aws-sdk/credential-provider-process": "^3.972.24",
+ "@aws-sdk/credential-provider-sso": "^3.972.28",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.28",
+ "@aws-sdk/nested-clients": "^3.996.18",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/credential-provider-imds": "^4.2.12",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-login": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.28.tgz",
+ "integrity": "sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/nested-clients": "^3.996.18",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.29.tgz",
+ "integrity": "sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "^3.972.24",
+ "@aws-sdk/credential-provider-http": "^3.972.26",
+ "@aws-sdk/credential-provider-ini": "^3.972.28",
+ "@aws-sdk/credential-provider-process": "^3.972.24",
+ "@aws-sdk/credential-provider-sso": "^3.972.28",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.28",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/credential-provider-imds": "^4.2.12",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.972.24",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.24.tgz",
+ "integrity": "sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.28.tgz",
+ "integrity": "sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/nested-clients": "^3.996.18",
+ "@aws-sdk/token-providers": "3.1021.0",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.28.tgz",
+ "integrity": "sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/nested-clients": "^3.996.18",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-bucket-endpoint": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz",
+ "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-arn-parser": "^3.972.3",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-config-provider": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-expect-continue": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz",
+ "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-flexible-checksums": {
+ "version": "3.974.6",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.6.tgz",
+ "integrity": "sha512-YckB8k1ejbyCg/g36gUMFLNzE4W5cERIa4MtsdO+wpTmJEP0+TB7okWIt7d8TDOvnb7SwvxJ21E4TGOBxFpSWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/crc32": "5.2.0",
+ "@aws-crypto/crc32c": "5.2.0",
+ "@aws-crypto/util": "5.2.0",
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/crc64-nvme": "^3.972.5",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/is-array-buffer": "^4.2.2",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-stream": "^4.5.21",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz",
+ "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-location-constraint": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz",
+ "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz",
+ "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.9.tgz",
+ "integrity": "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@aws/lambda-invoke-store": "^0.2.2",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3": {
+ "version": "3.972.27",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.27.tgz",
+ "integrity": "sha512-gomO6DZwx+1D/9mbCpcqO5tPBqYBK7DtdgjTIjZ4yvfh/S7ETwAPS0XbJgP2JD8Ycr5CwVrEkV1sFtu3ShXeOw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-arn-parser": "^3.972.3",
+ "@smithy/core": "^3.23.13",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/signature-v4": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-config-provider": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-stream": "^4.5.21",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-ssec": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz",
+ "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.28.tgz",
+ "integrity": "sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-endpoints": "^3.996.5",
+ "@smithy/core": "^3.23.13",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-retry": "^4.2.13",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/nested-clients": {
+ "version": "3.996.18",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.18.tgz",
+ "integrity": "sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/middleware-host-header": "^3.972.8",
+ "@aws-sdk/middleware-logger": "^3.972.8",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.9",
+ "@aws-sdk/middleware-user-agent": "^3.972.28",
+ "@aws-sdk/region-config-resolver": "^3.972.10",
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-endpoints": "^3.996.5",
+ "@aws-sdk/util-user-agent-browser": "^3.972.8",
+ "@aws-sdk/util-user-agent-node": "^3.973.14",
+ "@smithy/config-resolver": "^4.4.13",
+ "@smithy/core": "^3.23.13",
+ "@smithy/fetch-http-handler": "^5.3.15",
+ "@smithy/hash-node": "^4.2.12",
+ "@smithy/invalid-dependency": "^4.2.12",
+ "@smithy/middleware-content-length": "^4.2.12",
+ "@smithy/middleware-endpoint": "^4.4.28",
+ "@smithy/middleware-retry": "^4.4.46",
+ "@smithy/middleware-serde": "^4.2.16",
+ "@smithy/middleware-stack": "^4.2.12",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/node-http-handler": "^4.5.1",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.44",
+ "@smithy/util-defaults-mode-node": "^4.2.48",
+ "@smithy/util-endpoints": "^3.3.3",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-retry": "^4.2.13",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/region-config-resolver": {
+ "version": "3.972.10",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.10.tgz",
+ "integrity": "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/config-resolver": "^4.4.13",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/s3-request-presigner": {
+ "version": "3.1021.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1021.0.tgz",
+ "integrity": "sha512-kkIzsIAc7wnG7vVRkZFIwJ3noOyF3S6ozOQ9t2KxzPde1LsmpmPwYbmiB91DzdfuGySdk4Hpb0JmHh4KhGECXQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/signature-v4-multi-region": "^3.996.15",
+ "@aws-sdk/types": "^3.973.6",
+ "@aws-sdk/util-format-url": "^3.972.8",
+ "@smithy/middleware-endpoint": "^4.4.28",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-multi-region": {
+ "version": "3.996.15",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.15.tgz",
+ "integrity": "sha512-Ukw2RpqvaL96CjfH/FgfBmy/ZosHBqoHBCFsN61qGg99F33vpntIVii8aNeh65XuOja73arSduskoa4OJea9RQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/middleware-sdk-s3": "^3.972.27",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/signature-v4": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.1021.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1021.0.tgz",
+ "integrity": "sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.26",
+ "@aws-sdk/nested-clients": "^3.996.18",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.973.6",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz",
+ "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-arn-parser": {
+ "version": "3.972.3",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz",
+ "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.996.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz",
+ "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "@smithy/util-endpoints": "^3.3.3",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-format-url": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.8.tgz",
+ "integrity": "sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/querystring-builder": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.965.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz",
+ "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.972.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz",
+ "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/types": "^4.13.1",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.973.14",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.14.tgz",
+ "integrity": "sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/middleware-user-agent": "^3.972.28",
+ "@aws-sdk/types": "^3.973.6",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-config-provider": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/xml-builder": {
+ "version": "3.972.16",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz",
+ "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "fast-xml-parser": "5.5.8",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/@aws/lambda-invoke-store": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
+ "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz",
+ "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader-native": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz",
+ "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-base64": "^4.3.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/config-resolver": {
+ "version": "4.4.13",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.13.tgz",
+ "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-config-provider": "^4.2.2",
+ "@smithy/util-endpoints": "^3.3.3",
+ "@smithy/util-middleware": "^4.2.12",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/core": {
+ "version": "3.23.13",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.13.tgz",
+ "integrity": "sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-stream": "^4.5.21",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/uuid": "^1.1.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz",
+ "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-codec": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz",
+ "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/crc32": "5.2.0",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-browser": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz",
+ "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-config-resolver": {
+ "version": "4.3.12",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz",
+ "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-node": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz",
+ "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-universal": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz",
+ "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-codec": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "5.3.15",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz",
+ "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/querystring-builder": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-base64": "^4.3.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-blob-browser": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz",
+ "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/chunked-blob-reader": "^5.2.2",
+ "@smithy/chunked-blob-reader-native": "^4.2.3",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-node": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz",
+ "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-stream-node": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz",
+ "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/invalid-dependency": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz",
+ "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/is-array-buffer": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz",
+ "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/md5-js": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz",
+ "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-content-length": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz",
+ "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-endpoint": {
+ "version": "4.4.28",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.28.tgz",
+ "integrity": "sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.13",
+ "@smithy/middleware-serde": "^4.2.16",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "@smithy/url-parser": "^4.2.12",
+ "@smithy/util-middleware": "^4.2.12",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry": {
+ "version": "4.4.46",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.46.tgz",
+ "integrity": "sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/service-error-classification": "^4.2.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-retry": "^4.2.13",
+ "@smithy/uuid": "^1.1.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-serde": {
+ "version": "4.2.16",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.16.tgz",
+ "integrity": "sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.13",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-stack": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz",
+ "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/node-config-provider": {
+ "version": "4.3.12",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz",
+ "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/shared-ini-file-loader": "^4.4.7",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.1.tgz",
+ "integrity": "sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/querystring-builder": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/property-provider": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz",
+ "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/protocol-http": {
+ "version": "5.3.12",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz",
+ "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-builder": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz",
+ "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-uri-escape": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-parser": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz",
+ "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/service-error-classification": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz",
+ "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/shared-ini-file-loader": {
+ "version": "4.4.7",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz",
+ "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "5.3.12",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz",
+ "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^4.2.2",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.12",
+ "@smithy/util-uri-escape": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/smithy-client": {
+ "version": "4.12.8",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.8.tgz",
+ "integrity": "sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.13",
+ "@smithy/middleware-endpoint": "^4.4.28",
+ "@smithy/middleware-stack": "^4.2.12",
+ "@smithy/protocol-http": "^5.3.12",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-stream": "^4.5.21",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "4.13.1",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz",
+ "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/url-parser": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz",
+ "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/querystring-parser": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-base64": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz",
+ "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-browser": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz",
+ "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-node": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz",
+ "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-buffer-from": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz",
+ "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-config-provider": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz",
+ "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-browser": {
+ "version": "4.3.44",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.44.tgz",
+ "integrity": "sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-node": {
+ "version": "4.2.48",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.48.tgz",
+ "integrity": "sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/config-resolver": "^4.4.13",
+ "@smithy/credential-provider-imds": "^4.2.12",
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/property-provider": "^4.2.12",
+ "@smithy/smithy-client": "^4.12.8",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-endpoints": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz",
+ "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-hex-encoding": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz",
+ "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-middleware": {
+ "version": "4.2.12",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz",
+ "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-retry": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.13.tgz",
+ "integrity": "sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/service-error-classification": "^4.2.12",
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream": {
+ "version": "4.5.21",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.21.tgz",
+ "integrity": "sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/fetch-http-handler": "^5.3.15",
+ "@smithy/node-http-handler": "^4.5.1",
+ "@smithy/types": "^4.13.1",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-uri-escape": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz",
+ "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-utf8": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz",
+ "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-waiter": {
+ "version": "4.2.14",
+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.14.tgz",
+ "integrity": "sha512-2zqq5o/oizvMaFUlNiTyZ7dbgYv1a893aGut2uaxtbzTx/VYYnRxWzDHuD/ftgcw94ffenua+ZNLrbqwUYE+Bg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.13.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/uuid": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz",
+ "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
+ "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.25",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
+ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "^1"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.19.8",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz",
+ "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
+ "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "<1"
+ }
+ },
+ "node_modules/@types/serve-static/node_modules/@types/send": {
+ "version": "0.17.6",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/bowser": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
+ "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/diff": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
+ "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.1.3"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.5.8",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
+ "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "fast-xml-builder": "^1.1.4",
+ "path-expression-matcher": "^1.2.0",
+ "strnum": "^2.2.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-status-codes": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
+ "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
+ "license": "MIT"
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-expression-matcher": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz",
+ "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/stripe": {
+ "version": "20.4.1",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.4.1.tgz",
+ "integrity": "sha512-axCguHItc8Sxt0HC6aSkdVRPffjYPV7EQqZRb2GkIa8FzWDycE7nHJM19C6xAIynH1Qp1/BHiopSi96jGBxT0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "@types/node": ">=16"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/strnum": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz",
+ "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
+ "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ }
+}
diff --git a/extensions/fsv2/package.json b/extensions/fsv2/package.json
new file mode 100644
index 0000000000..88707a94a4
--- /dev/null
+++ b/extensions/fsv2/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@heyputer/fs",
+ "version": "1.0.0",
+ "description": "",
+ "main": "src/index.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@types/express": "^4.17.21",
+ "@types/node": "^24.9.1",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.9.3",
+ "@aws-sdk/client-s3": "^3.1021.0"
+ },
+ "dependencies": {
+ "@aws-sdk/s3-request-presigner": "^3.1021.0",
+ "body-parser": "^2.2.0",
+ "busboy": "^1.6.0",
+ "http-status-codes": "^2.3.0",
+ "stripe": "^20.1.2",
+ "uuid": "^13.0.0"
+ }
+}
diff --git a/extensions/fsv2/src/.gitignore b/extensions/fsv2/src/.gitignore
new file mode 100644
index 0000000000..4e57eef884
--- /dev/null
+++ b/extensions/fsv2/src/.gitignore
@@ -0,0 +1,2 @@
+*.js
+*.js.map
diff --git a/extensions/fsv2/src/controllers/FSController.ts b/extensions/fsv2/src/controllers/FSController.ts
new file mode 100644
index 0000000000..39ca51ca07
--- /dev/null
+++ b/extensions/fsv2/src/controllers/FSController.ts
@@ -0,0 +1,1814 @@
+import type { ACLService } from '@heyputer/backend/src/services/auth/ACLService.js';
+import type { EventService } from '@heyputer/backend/src/services/EventService.js';
+import Busboy from 'busboy';
+import type { Request, Response } from 'express';
+import { posix as pathPosix } from 'node:path';
+import type { FSEntryService } from '../services/FSEntryService.js';
+import type {
+ PreparedBatchWrite,
+ UploadedBatchWriteItem,
+ UploadProgressTrackerLike,
+} from '../services/types.js';
+import type { FSEntry, FSEntryWriteInput } from '../types/FSEntry.js';
+import type {
+ CompleteWriteRequest,
+ CompleteWriteResponse,
+ SignedWriteRequest,
+ SignedWriteResponse,
+ SignMultipartPartsRequest,
+ SignMultipartPartsResponse,
+ WriteGuiMetadata,
+ WriteRequest,
+ WriteResponse,
+} from '../types/requests.js';
+import {
+ runWithConcurrencyLimit,
+ runWithConcurrencyLimitSettled,
+} from '../utils/concurrency.js';
+import type {
+ AbortWriteRequest,
+ BatchWriteManifest,
+ BatchWriteManifestItem,
+ ParsedMultipartBatchManifest,
+ RouteParams,
+ ThumbnailUploadPrepareItem,
+ ThumbnailUploadPreparePayload,
+} from './types.js';
+
+const { Controller, ExtensionController, HttpError, Post } = extension.import(
+ 'extensionController',
+);
+const { Context } = extension.import('core');
+const getApp = extension.import('core').util.helpers.get_app as (query: {
+ uid: string;
+}) => Promise<{ id?: unknown } | null>;
+class UploadProgressTracker implements UploadProgressTrackerLike {
+ total = 0;
+ progress = 0;
+ #listeners: Array<(delta: number) => void> = [];
+
+ setTotal (value: number) {
+ this.total = value;
+ }
+
+ add (amount: number) {
+ this.progress += amount;
+ for ( const listener of this.#listeners ) {
+ listener(amount);
+ }
+ }
+
+ subscribe (callback: (delta: number) => void) {
+ this.#listeners.push(callback);
+ return {
+ detach: () => {
+ const idx = this.#listeners.indexOf(callback);
+ if ( idx !== -1 ) this.#listeners.splice(idx, 1);
+ },
+ };
+ }
+}
+
+const aclService = extension.import('service:acl') as ACLService;
+const MAX_THUMBNAIL_BYTES = 2 * 1024 * 1024;
+const DEFAULT_BATCH_ACL_CHECK_CONCURRENCY = 32;
+const DEFAULT_BATCH_WRITE_SIDE_EFFECT_CONCURRENCY = 8;
+
+@Controller('/fs')
+export class FSController extends ExtensionController {
+ constructor (
+ private fsEntryService: FSEntryService,
+ private eventService: EventService,
+ ) {
+ super();
+ }
+ @Post('/startWrite', { subdomain: 'api' })
+ async startWrite (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const storageAllowanceMax = this.#getStorageAllowanceMaxOverride(req);
+ const requestBody = this.#withGuiMetadata(req.body, req.body);
+ requestBody.fileMetadata = this.#normalizeFileMetadataPath(
+ req,
+ requestBody.fileMetadata,
+ requestBody,
+ );
+ requestBody.fileMetadata = await this.#resolveAssociatedAppMetadata(
+ requestBody.fileMetadata,
+ requestBody,
+ );
+ await this.#assertWriteAccess(req, requestBody.fileMetadata, {
+ pathAlreadyNormalized: true,
+ });
+
+ const { response, createdDirectoryEntries } =
+ await this.fsEntryService.startUrlWriteWithCreatedDirectories(
+ userId,
+ requestBody,
+ storageAllowanceMax,
+ );
+ await this.#attachSignedThumbnailUploadTargets([requestBody], [response]);
+ if ( ! requestBody.directory ) {
+ await this.#runNonCritical(async () => {
+ await this.#emitGuiPendingWriteEvent(userId, requestBody, response);
+ }, 'emitStartWritePendingEvent');
+ }
+ if ( createdDirectoryEntries.length > 0 ) {
+ void this.#runNonCritical(async () => {
+ for ( const createdDirectoryEntry of createdDirectoryEntries ) {
+ await this.#emitGuiWriteEvent(
+ 'outer.gui.item.added',
+ createdDirectoryEntry,
+ requestBody.guiMetadata,
+ );
+ }
+ }, 'emitStartWriteDirectoryEvents');
+ }
+ res.json(response);
+ }
+
+ @Post('/startBatchWrite', { subdomain: 'api' })
+ async startBatchWrites (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const storageAllowanceMax = this.#getStorageAllowanceMaxOverride(req);
+ const appUidLookupCache = new Map>();
+ const requests = Array.isArray(req.body)
+ ? await Promise.all(
+ req.body.map(async (requestBody) => {
+ const normalizedRequestBody = this.#withGuiMetadata(
+ requestBody,
+ req.body,
+ );
+ normalizedRequestBody.fileMetadata =
+ this.#normalizeFileMetadataPath(
+ req,
+ normalizedRequestBody.fileMetadata,
+ normalizedRequestBody,
+ );
+ normalizedRequestBody.fileMetadata =
+ await this.#resolveAssociatedAppMetadata(
+ normalizedRequestBody.fileMetadata,
+ normalizedRequestBody,
+ appUidLookupCache,
+ );
+ return normalizedRequestBody;
+ }),
+ )
+ : [];
+ await this.#assertBatchWriteAccess(
+ req,
+ requests.map((requestBody) => requestBody.fileMetadata),
+ { pathAlreadyNormalized: true },
+ );
+
+ const { responses, createdDirectoryEntries } =
+ await this.fsEntryService.batchStartUrlWritesWithCreatedDirectories(
+ userId,
+ requests,
+ storageAllowanceMax,
+ );
+ const directoryGuiMetadataByPath = new Map<
+ string,
+ WriteGuiMetadata | undefined
+ >(
+ requests
+ .filter((request) => request.directory)
+ .map((request) => [request.fileMetadata.path, request.guiMetadata]),
+ );
+ const emittedDirectoryPaths = new Set();
+
+ await this.#attachSignedThumbnailUploadTargets(requests, responses);
+ await this.#runNonCritical(async () => {
+ await runWithConcurrencyLimit(
+ responses,
+ 32,
+ async (writeResponse, index) => {
+ const requestBody = requests[index];
+ if ( requestBody && writeResponse ) {
+ if ( ! requestBody.directory ) {
+ await this.#emitGuiPendingWriteEvent(
+ userId,
+ requestBody,
+ writeResponse,
+ );
+ }
+ }
+ },
+ );
+ }, 'emitStartBatchWritePendingEvents');
+ if ( createdDirectoryEntries.length > 0 ) {
+ void this.#runNonCritical(async () => {
+ for ( const createdDirectoryEntry of createdDirectoryEntries ) {
+ if ( emittedDirectoryPaths.has(createdDirectoryEntry.path) ) {
+ continue;
+ }
+ emittedDirectoryPaths.add(createdDirectoryEntry.path);
+ await this.#emitGuiWriteEvent(
+ 'outer.gui.item.added',
+ createdDirectoryEntry,
+ directoryGuiMetadataByPath.get(createdDirectoryEntry.path),
+ );
+ }
+ }, 'emitStartBatchWriteDirectoryEvents');
+ }
+ res.json(responses);
+ }
+
+ @Post('/completeWrite', { subdomain: 'api' })
+ async completeWrite (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const requestBody = this.#withGuiMetadata(req.body, req.body);
+ this.#assertNoInlineSignedThumbnailData(requestBody.thumbnailData);
+
+ const response = await this.fsEntryService.completeUrlWrite(
+ userId,
+ requestBody,
+ );
+ const writeResponse = await this.#applyWriteResponseSideEffects(
+ userId,
+ {
+ fsEntry: response.fsEntry,
+ wasOverwrite: response.wasOverwrite,
+ requestedThumbnail: response.requestedThumbnail,
+ contentHashSha256: null,
+ },
+ requestBody.guiMetadata,
+ );
+ res.json({ ...response, fsEntry: writeResponse.fsEntry });
+ }
+
+ @Post('/completeBatchWrite', { subdomain: 'api' })
+ async completeBatchWrites (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const requests = Array.isArray(req.body)
+ ? req.body.map((requestBody) => {
+ return this.#withGuiMetadata(requestBody, req.body);
+ })
+ : [];
+ for ( const requestBody of requests ) {
+ this.#assertNoInlineSignedThumbnailData(requestBody.thumbnailData);
+ }
+ const response = await this.fsEntryService.batchCompleteUrlWrite(
+ userId,
+ requests,
+ );
+ const updatedResponse = await runWithConcurrencyLimit(
+ response,
+ DEFAULT_BATCH_WRITE_SIDE_EFFECT_CONCURRENCY,
+ async (writeResponse, index) => {
+ const requestBody = requests[index];
+ const withSideEffects = await this.#applyWriteResponseSideEffects(
+ userId,
+ {
+ fsEntry: writeResponse.fsEntry,
+ wasOverwrite: writeResponse.wasOverwrite,
+ requestedThumbnail: writeResponse.requestedThumbnail,
+ contentHashSha256: null,
+ },
+ requestBody?.guiMetadata,
+ );
+ return { ...writeResponse, fsEntry: withSideEffects.fsEntry };
+ },
+ );
+ res.json(updatedResponse);
+ }
+
+ @Post('/abortWrite', { subdomain: 'api' })
+ async abortWrite (
+ req: Request,
+ res: Response<{ ok: true }>,
+ ) {
+ const userId = this.#getActorUserId(req);
+ if ( ! req.body?.uploadId ) {
+ throw new HttpError(400, 'Missing uploadId');
+ }
+
+ await this.fsEntryService.abortUrlWrite(userId, req.body.uploadId);
+ res.json({ ok: true });
+ }
+
+ @Post('/signMultipartParts', { subdomain: 'api' })
+ async signMultipartParts (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const response = await this.fsEntryService.signMultipartParts(
+ userId,
+ req.body,
+ );
+ res.json(response);
+ }
+
+ @Post('/write', { subdomain: 'api' })
+ async write (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const storageAllowanceMax = this.#getStorageAllowanceMaxOverride(req);
+ const requestBody = this.#withGuiMetadata(req.body, req.body);
+ requestBody.fileMetadata = this.#normalizeFileMetadataPath(
+ req,
+ requestBody.fileMetadata,
+ requestBody,
+ );
+ requestBody.fileMetadata = await this.#resolveAssociatedAppMetadata(
+ requestBody.fileMetadata,
+ requestBody,
+ );
+ await this.#assertWriteAccess(req, requestBody.fileMetadata, {
+ pathAlreadyNormalized: true,
+ });
+ const normalizedPath = this.#normalizePath(requestBody.fileMetadata.path);
+ const uploadTracker = await this.#createUploadTracker(
+ userId,
+ normalizedPath,
+ normalizedPath,
+ Number(requestBody.fileMetadata.size ?? 0),
+ requestBody.guiMetadata,
+ );
+ const response = await this.fsEntryService.write(
+ userId,
+ requestBody,
+ uploadTracker,
+ storageAllowanceMax,
+ );
+ const updatedResponse = await this.#applyWriteResponseSideEffects(
+ userId,
+ response,
+ requestBody.guiMetadata,
+ );
+ res.json(updatedResponse);
+ }
+
+ @Post('/batchWrite', { subdomain: 'api' })
+ async batchWrites (
+ req: Request,
+ res: Response,
+ ) {
+ const userId = this.#getActorUserId(req);
+ const storageAllowanceMax = this.#getStorageAllowanceMaxOverride(req);
+ const requestMode = this.#resolveBatchWriteRequestMode(req);
+ const appUidLookupCache = new Map>();
+ if ( requestMode === 'multipart' ) {
+ let parsedManifest: ParsedMultipartBatchManifest | null = null;
+ let preparedBatch: PreparedBatchWrite | null = null;
+ let manifestPreparationPromise: Promise | null = null;
+ let parseFailure: Error | null = null;
+ const uploadPromises: Promise[] = [];
+ const uploadedIndexes = new Set();
+ let fileOrderIndex = 0;
+
+ const failParse = (error: unknown) => {
+ if ( parseFailure ) {
+ return;
+ }
+ if ( error instanceof Error ) {
+ parseFailure = error;
+ return;
+ }
+ parseFailure = new Error(String(error));
+ };
+
+ const busboy = Busboy({ headers: req.headers });
+
+ busboy.on('field', (fieldName, value, info) => {
+ if ( info.fieldnameTruncated || info.valueTruncated ) {
+ failParse(
+ new HttpError(400, 'Batch write manifest field is truncated'),
+ );
+ return;
+ }
+ if ( fieldName !== 'manifest' ) {
+ return;
+ }
+ if ( manifestPreparationPromise ) {
+ failParse(
+ new HttpError(
+ 409,
+ 'Batch write manifest was provided more than once',
+ ),
+ );
+ return;
+ }
+
+ try {
+ parsedManifest = this.#parseBatchWriteManifest(value, undefined);
+ const ignoredItemIndexes = new Set();
+ parsedManifest = {
+ ...parsedManifest,
+ items: parsedManifest.items.map((item) => ({
+ ...item,
+ fileMetadata: this.#normalizeFileMetadataPath(
+ req,
+ item.fileMetadata,
+ item,
+ ),
+ })),
+ ignoredItemIndexes,
+ };
+ for ( const item of parsedManifest.items ) {
+ if ( this.#shouldIgnoreUploadPath(item.fileMetadata.path) ) {
+ ignoredItemIndexes.add(item.index);
+ }
+ }
+ manifestPreparationPromise = (async () => {
+ try {
+ if ( ! parsedManifest ) {
+ throw new HttpError(400, 'Batch write manifest is missing');
+ }
+ parsedManifest = {
+ ...parsedManifest,
+ items: await Promise.all(
+ parsedManifest.items.map(async (item) => ({
+ ...item,
+ fileMetadata: await this.#resolveAssociatedAppMetadata(
+ item.fileMetadata,
+ item,
+ appUidLookupCache,
+ ),
+ })),
+ ),
+ };
+ const activeManifestItems = parsedManifest.items.filter(
+ (item) => !parsedManifest?.ignoredItemIndexes?.has(item.index),
+ );
+
+ await this.#assertBatchWriteAccess(
+ req,
+ activeManifestItems.map((item) => item.fileMetadata),
+ { pathAlreadyNormalized: true },
+ );
+
+ preparedBatch = await this.fsEntryService.prepareBatchWrites(
+ userId,
+ activeManifestItems.map((item) => ({
+ fileMetadata: item.fileMetadata,
+ thumbnailData: item.thumbnailData,
+ guiMetadata: item.guiMetadata,
+ })),
+ storageAllowanceMax,
+ );
+ await this.fsEntryService.assertStorageAllowanceForPreparedBatch(
+ preparedBatch,
+ undefined,
+ storageAllowanceMax,
+ );
+ } catch ( error ) {
+ failParse(error);
+ }
+ })();
+ } catch ( error ) {
+ failParse(error);
+ }
+ });
+
+ busboy.on('file', (fieldName, stream) => {
+ const currentFileOrder = fileOrderIndex;
+ fileOrderIndex++;
+ const uploadPromise = (async () => {
+ try {
+ if ( parseFailure ) {
+ throw parseFailure;
+ }
+ if ( ! manifestPreparationPromise ) {
+ throw new HttpError(
+ 400,
+ 'Batch write manifest must come before file content',
+ );
+ }
+
+ await manifestPreparationPromise;
+ if ( parseFailure ) {
+ throw parseFailure;
+ }
+ if ( !parsedManifest || !preparedBatch ) {
+ throw new HttpError(400, 'Batch write manifest is missing');
+ }
+
+ const itemIndex = this.#resolveMultipartFileIndex(
+ fieldName,
+ currentFileOrder,
+ parsedManifest,
+ );
+ if ( parsedManifest.ignoredItemIndexes.has(itemIndex) ) {
+ if ( !stream.readableEnded && !stream.destroyed ) {
+ stream.resume();
+ }
+ return null;
+ }
+ if ( uploadedIndexes.has(itemIndex) ) {
+ throw new HttpError(
+ 409,
+ `Duplicate file content for batch index ${itemIndex}`,
+ );
+ }
+ uploadedIndexes.add(itemIndex);
+
+ const preparedItem = preparedBatch.itemsByIndex.get(itemIndex);
+ if ( ! preparedItem ) {
+ throw new HttpError(
+ 400,
+ `Batch write metadata was not found for index ${itemIndex}`,
+ );
+ }
+
+ const uploadTracker = await this.#createUploadTracker(
+ userId,
+ preparedItem.objectKey,
+ preparedItem.normalizedInput.path,
+ preparedItem.normalizedInput.size,
+ preparedItem.guiMetadata,
+ );
+
+ return await this.fsEntryService.uploadPreparedBatchItem({
+ preparedBatch,
+ itemIndex,
+ fileContent: stream,
+ uploadTracker,
+ });
+ } catch ( error ) {
+ if ( !stream.readableEnded && !stream.destroyed ) {
+ stream.resume();
+ }
+ throw error;
+ }
+ })();
+ uploadPromises.push(uploadPromise);
+ });
+
+ const parsingComplete = new Promise((resolve, reject) => {
+ busboy.once('error', reject);
+ busboy.once('close', resolve);
+ });
+
+ req.pipe(busboy);
+ await parsingComplete;
+ if ( ! manifestPreparationPromise ) {
+ await Promise.allSettled(uploadPromises);
+ throw new HttpError(400, 'Batch write manifest is required');
+ }
+ await manifestPreparationPromise;
+ const uploadResults = await Promise.allSettled(uploadPromises);
+ const uploadedItems = uploadResults
+ .filter(
+ (
+ result,
+ ): result is PromiseFulfilledResult =>
+ result.status === 'fulfilled',
+ )
+ .map((result) => result.value)
+ .filter(
+ (uploadedItem): uploadedItem is UploadedBatchWriteItem =>
+ uploadedItem !== null,
+ );
+ if ( parseFailure ) {
+ if ( preparedBatch ) {
+ await this.fsEntryService.cleanupPreparedBatchUploads(
+ preparedBatch,
+ uploadedItems,
+ );
+ }
+ throw parseFailure;
+ }
+ if ( ! preparedBatch ) {
+ throw new HttpError(500, 'Failed to prepare batch write operation');
+ }
+ const failedUpload = uploadResults.find(
+ (result) => result.status === 'rejected',
+ );
+ if ( failedUpload?.status === 'rejected' ) {
+ await this.fsEntryService.cleanupPreparedBatchUploads(
+ preparedBatch,
+ uploadedItems,
+ );
+ throw failedUpload.reason instanceof Error
+ ? failedUpload.reason
+ : new Error('Failed to upload multipart batch item');
+ }
+
+ const writeResponses =
+ await this.fsEntryService.finalizePreparedBatchWrites(
+ preparedBatch,
+ uploadedItems,
+ );
+ const updatedResponses = await runWithConcurrencyLimit(
+ writeResponses,
+ 32,
+ async (writeResponse, index) => {
+ const preparedItem = preparedBatch?.items[index];
+ return this.#applyWriteResponseSideEffects(
+ userId,
+ writeResponse,
+ preparedItem?.guiMetadata,
+ );
+ },
+ );
+ res.json(updatedResponses);
+ return;
+ }
+
+ const requests = Array.isArray(req.body)
+ ? await Promise.all(
+ req.body.map(async (requestBody) => {
+ const normalizedRequestBody = this.#withGuiMetadata(
+ requestBody,
+ req.body,
+ );
+ normalizedRequestBody.fileMetadata =
+ this.#normalizeFileMetadataPath(
+ req,
+ normalizedRequestBody.fileMetadata,
+ normalizedRequestBody,
+ );
+ normalizedRequestBody.fileMetadata =
+ await this.#resolveAssociatedAppMetadata(
+ normalizedRequestBody.fileMetadata,
+ normalizedRequestBody,
+ appUidLookupCache,
+ );
+ return normalizedRequestBody;
+ }),
+ )
+ : [];
+ const filteredRequests = requests.filter((requestBody) => {
+ return !this.#shouldIgnoreUploadPath(requestBody.fileMetadata.path);
+ });
+ if ( filteredRequests.length === 0 ) {
+ res.json([]);
+ return;
+ }
+ await this.#assertBatchWriteAccess(
+ req,
+ filteredRequests.map((requestBody) => requestBody.fileMetadata),
+ { pathAlreadyNormalized: true },
+ );
+
+ const preparedBatch = await this.fsEntryService.prepareBatchWrites(
+ userId,
+ filteredRequests.map((requestBody) => ({
+ fileMetadata: requestBody.fileMetadata,
+ thumbnailData: requestBody.thumbnailData,
+ guiMetadata: requestBody.guiMetadata,
+ })),
+ storageAllowanceMax,
+ );
+ await this.fsEntryService.assertStorageAllowanceForPreparedBatch(
+ preparedBatch,
+ undefined,
+ storageAllowanceMax,
+ );
+
+ const uploadResults = await runWithConcurrencyLimitSettled(
+ filteredRequests,
+ 8,
+ async (requestBody, index) => {
+ const preparedItem = preparedBatch.items[index];
+ if ( ! preparedItem ) {
+ throw new Error(
+ `Failed to resolve prepared batch item for index ${index}`,
+ );
+ }
+ const uploadTracker = await this.#createUploadTracker(
+ userId,
+ preparedItem.objectKey,
+ preparedItem.normalizedInput.path,
+ preparedItem.normalizedInput.size,
+ requestBody.guiMetadata,
+ );
+ return this.fsEntryService.uploadPreparedBatchItem({
+ preparedBatch,
+ itemIndex: preparedItem.index,
+ fileContent: requestBody.fileContent,
+ encoding: requestBody.encoding,
+ uploadTracker,
+ });
+ },
+ );
+ const uploadedItems = uploadResults
+ .filter(
+ (result): result is PromiseFulfilledResult =>
+ result.status === 'fulfilled',
+ )
+ .map((result) => result.value);
+ const failedUpload = uploadResults.find(
+ (result) => result.status === 'rejected',
+ );
+ if ( failedUpload?.status === 'rejected' ) {
+ await this.fsEntryService.cleanupPreparedBatchUploads(
+ preparedBatch,
+ uploadedItems,
+ );
+ throw failedUpload.reason instanceof Error
+ ? failedUpload.reason
+ : new Error('Failed to upload batch write item');
+ }
+
+ const writeResponses =
+ await this.fsEntryService.finalizePreparedBatchWrites(
+ preparedBatch,
+ uploadedItems,
+ );
+ const updatedResponses = await runWithConcurrencyLimit(
+ writeResponses,
+ 32,
+ async (writeResponse, index) => {
+ const requestBody = filteredRequests[index];
+ return this.#applyWriteResponseSideEffects(
+ userId,
+ writeResponse,
+ requestBody?.guiMetadata,
+ );
+ },
+ );
+ res.json(updatedResponses);
+ }
+
+ #getActorUserId (req: Request): number {
+ const requestUser = (
+ req as Request & {
+ user?: {
+ id?: unknown;
+ };
+ }
+ ).user;
+ const actorUser = req.actor?.type?.user;
+ const candidateUserId = requestUser?.id ?? actorUser?.id;
+ if ( candidateUserId === undefined || candidateUserId === null ) {
+ throw new HttpError(401, 'Unauthorized');
+ }
+
+ const userId = Number(candidateUserId);
+ if ( Number.isNaN(userId) ) {
+ throw new HttpError(401, 'Unauthorized');
+ }
+
+ return userId;
+ }
+
+ #getActorUsername (req: Request): string {
+ const requestUser = (
+ req as Request & {
+ user?: {
+ username?: unknown;
+ };
+ }
+ ).user;
+ const actorUser = req.actor?.type?.user;
+ const actorUsername = requestUser?.username ?? actorUser?.username;
+ if (
+ typeof actorUsername !== 'string' ||
+ actorUsername.trim().length === 0
+ ) {
+ throw new HttpError(401, 'Unauthorized');
+ }
+ return actorUsername.trim();
+ }
+
+ #toObjectRecord (value: unknown): Record {
+ if ( !value || typeof value !== 'object' || Array.isArray(value) ) {
+ return {};
+ }
+ return value as Record;
+ }
+
+ #firstDefined (...values: unknown[]): unknown {
+ for ( const value of values ) {
+ if ( value !== undefined && value !== null ) {
+ return value;
+ }
+ }
+ return undefined;
+ }
+
+ #toBoolean (value: unknown): boolean | undefined {
+ if ( typeof value === 'boolean' ) {
+ return value;
+ }
+ if ( typeof value === 'number' ) {
+ if ( value === 1 ) return true;
+ if ( value === 0 ) return false;
+ return undefined;
+ }
+ if ( typeof value === 'string' ) {
+ const normalizedValue = value.trim().toLowerCase();
+ if ( ['1', 'true', 'yes', 'on'].includes(normalizedValue) ) {
+ return true;
+ }
+ if ( ['0', 'false', 'no', 'off'].includes(normalizedValue) ) {
+ return false;
+ }
+ }
+ return undefined;
+ }
+
+ #toNumber (value: unknown): number | undefined {
+ if ( value === undefined || value === null || value === '' ) {
+ return undefined;
+ }
+ const candidate = Number(value);
+ if ( ! Number.isFinite(candidate) ) {
+ return undefined;
+ }
+ return candidate;
+ }
+
+ #isDedupeEnabled (fileMetadata: FSEntryWriteInput | undefined): boolean {
+ if ( ! fileMetadata ) {
+ return false;
+ }
+ const metadataRecord = fileMetadata as unknown as Record;
+ const dedupeCandidate = this.#firstDefined(
+ fileMetadata.dedupeName,
+ metadataRecord.dedupe_name,
+ );
+ return this.#toBoolean(dedupeCandidate) ?? false;
+ }
+
+ #resolveWriteFileMetadata (
+ fileMetadata: FSEntryWriteInput | undefined,
+ fallbackSource?: unknown,
+ ): FSEntryWriteInput {
+ const metadataRecord = this.#toObjectRecord(fileMetadata);
+ const fallbackRecord = this.#toObjectRecord(fallbackSource);
+
+ const normalizedFileMetadata: Record = {
+ ...metadataRecord,
+ };
+
+ const path = this.#firstDefined(metadataRecord.path, fallbackRecord.path);
+ if ( typeof path === 'string' ) {
+ normalizedFileMetadata.path = path;
+ }
+
+ const size = this.#toNumber(
+ this.#firstDefined(metadataRecord.size, fallbackRecord.size),
+ );
+ if ( size !== undefined ) {
+ normalizedFileMetadata.size = size;
+ }
+
+ const contentType = this.#firstDefined(
+ metadataRecord.contentType,
+ metadataRecord.content_type,
+ fallbackRecord.contentType,
+ fallbackRecord.content_type,
+ );
+ if ( typeof contentType === 'string' && contentType.length > 0 ) {
+ normalizedFileMetadata.contentType = contentType;
+ }
+
+ const checksumSha256 = this.#firstDefined(
+ metadataRecord.checksumSha256,
+ metadataRecord.checksum_sha256,
+ fallbackRecord.checksumSha256,
+ fallbackRecord.checksum_sha256,
+ );
+ if ( typeof checksumSha256 === 'string' && checksumSha256.length > 0 ) {
+ normalizedFileMetadata.checksumSha256 = checksumSha256;
+ }
+
+ const overwrite = this.#toBoolean(
+ this.#firstDefined(metadataRecord.overwrite, fallbackRecord.overwrite),
+ );
+ if ( overwrite !== undefined ) {
+ normalizedFileMetadata.overwrite = overwrite;
+ }
+
+ const dedupeName = this.#toBoolean(
+ this.#firstDefined(
+ metadataRecord.dedupeName,
+ metadataRecord.dedupe_name,
+ fallbackRecord.dedupeName,
+ fallbackRecord.dedupe_name,
+ fallbackRecord.rename,
+ fallbackRecord.change_name,
+ ),
+ );
+ if ( dedupeName !== undefined ) {
+ normalizedFileMetadata.dedupeName = dedupeName;
+ }
+
+ const createMissingParents = this.#toBoolean(
+ this.#firstDefined(
+ metadataRecord.createMissingParents,
+ metadataRecord.create_missing_parents,
+ metadataRecord.create_missing_ancestors,
+ fallbackRecord.createMissingParents,
+ fallbackRecord.create_missing_parents,
+ fallbackRecord.createMissingAncestors,
+ fallbackRecord.create_missing_ancestors,
+ fallbackRecord.createFileParent,
+ fallbackRecord.create_file_parent,
+ ),
+ );
+ if ( createMissingParents !== undefined ) {
+ normalizedFileMetadata.createMissingParents = createMissingParents;
+ }
+
+ const immutable = this.#toBoolean(
+ this.#firstDefined(metadataRecord.immutable, fallbackRecord.immutable),
+ );
+ if ( immutable !== undefined ) {
+ normalizedFileMetadata.immutable = immutable;
+ }
+
+ const isPublic = this.#toBoolean(
+ this.#firstDefined(
+ metadataRecord.isPublic,
+ metadataRecord.is_public,
+ fallbackRecord.isPublic,
+ fallbackRecord.is_public,
+ ),
+ );
+ if ( isPublic !== undefined ) {
+ normalizedFileMetadata.isPublic = isPublic;
+ }
+
+ const multipartPartSize = this.#toNumber(
+ this.#firstDefined(
+ metadataRecord.multipartPartSize,
+ metadataRecord.multipart_part_size,
+ fallbackRecord.multipartPartSize,
+ fallbackRecord.multipart_part_size,
+ ),
+ );
+ if ( multipartPartSize !== undefined && multipartPartSize > 0 ) {
+ normalizedFileMetadata.multipartPartSize = multipartPartSize;
+ }
+
+ const bucket = this.#firstDefined(
+ metadataRecord.bucket,
+ fallbackRecord.bucket,
+ );
+ if ( typeof bucket === 'string' && bucket.length > 0 ) {
+ normalizedFileMetadata.bucket = bucket;
+ }
+
+ const bucketRegion = this.#firstDefined(
+ metadataRecord.bucketRegion,
+ metadataRecord.bucket_region,
+ fallbackRecord.bucketRegion,
+ fallbackRecord.bucket_region,
+ );
+ if ( typeof bucketRegion === 'string' && bucketRegion.length > 0 ) {
+ normalizedFileMetadata.bucketRegion = bucketRegion;
+ }
+
+ const associatedAppId = this.#toNumber(
+ this.#firstDefined(
+ metadataRecord.associatedAppId,
+ metadataRecord.associated_app_id,
+ fallbackRecord.associatedAppId,
+ fallbackRecord.associated_app_id,
+ ),
+ );
+ if ( associatedAppId !== undefined ) {
+ normalizedFileMetadata.associatedAppId = associatedAppId;
+ }
+
+ return normalizedFileMetadata as unknown as FSEntryWriteInput;
+ }
+
+ async #resolveAssociatedAppMetadata (
+ fileMetadata: FSEntryWriteInput,
+ fallbackSource?: unknown,
+ appUidLookupCache?: Map>,
+ ): Promise {
+ const metadataRecord = this.#toObjectRecord(fileMetadata);
+ const fallbackRecord = this.#toObjectRecord(fallbackSource);
+
+ const associatedAppId = this.#toNumber(
+ this.#firstDefined(
+ metadataRecord.associatedAppId,
+ metadataRecord.associated_app_id,
+ fallbackRecord.associatedAppId,
+ fallbackRecord.associated_app_id,
+ ),
+ );
+ if ( associatedAppId !== undefined ) {
+ return {
+ ...fileMetadata,
+ associatedAppId,
+ };
+ }
+
+ const appUid = this.#firstDefined(
+ metadataRecord.appUID,
+ metadataRecord.appUid,
+ metadataRecord.app_uid,
+ fallbackRecord.appUID,
+ fallbackRecord.appUid,
+ fallbackRecord.app_uid,
+ );
+ if ( typeof appUid !== 'string' || appUid.trim().length === 0 ) {
+ return fileMetadata;
+ }
+
+ const normalizedAppUid = appUid.trim();
+ const lookupPromise = (() => {
+ const cachedLookup = appUidLookupCache?.get(normalizedAppUid);
+ if ( cachedLookup ) {
+ return cachedLookup;
+ }
+
+ const createdLookupPromise = (async () => {
+ const app = await getApp({ uid: normalizedAppUid });
+ return this.#toNumber(app?.id) ?? null;
+ })();
+ appUidLookupCache?.set(normalizedAppUid, createdLookupPromise);
+ return createdLookupPromise;
+ })();
+
+ const resolvedAppId = await lookupPromise;
+ if ( resolvedAppId === null ) {
+ return fileMetadata;
+ }
+ return {
+ ...fileMetadata,
+ associatedAppId: resolvedAppId,
+ };
+ }
+
+ #toStorageCapacityCandidate (value: unknown): number | undefined {
+ const capacity = Number(value);
+ if ( !Number.isFinite(capacity) || capacity < 0 ) {
+ return undefined;
+ }
+ return capacity;
+ }
+
+ #getStorageAllowanceMaxOverride (req: Request): number | undefined {
+ const actorUser = req.actor?.type.user;
+
+ const candidates = [
+ this.#toStorageCapacityCandidate(actorUser?.free_storage),
+ this.#toStorageCapacityCandidate(actorUser?.actual_free_storage),
+ ].filter((candidate): candidate is number => candidate !== undefined);
+
+ if ( candidates.length === 0 ) {
+ return undefined;
+ }
+ return Math.max(...candidates);
+ }
+
+ #normalizePath (path: string, username?: string): string {
+ const trimmedPath = path.trim();
+ if ( trimmedPath.length === 0 ) {
+ throw new HttpError(400, 'Path cannot be empty');
+ }
+
+ let pathToNormalize = trimmedPath;
+ if ( pathToNormalize === '~' || pathToNormalize.startsWith('~/') ) {
+ if ( ! username ) {
+ throw new HttpError(400, 'Unable to resolve home path');
+ }
+
+ pathToNormalize = `/${username}${pathToNormalize.slice(1)}`;
+ }
+
+ let normalizedPath = pathPosix.normalize(pathToNormalize);
+ if ( ! normalizedPath.startsWith('/') ) {
+ normalizedPath = `/${normalizedPath}`;
+ }
+ if ( normalizedPath.length > 1 && normalizedPath.endsWith('/') ) {
+ normalizedPath = normalizedPath.slice(0, -1);
+ }
+ return normalizedPath;
+ }
+
+ #normalizeFileMetadataPath (
+ req: Request,
+ fileMetadata: FSEntryWriteInput | undefined,
+ fallbackSource?: unknown,
+ ): FSEntryWriteInput {
+ const resolvedFileMetadata = this.#resolveWriteFileMetadata(
+ fileMetadata,
+ fallbackSource,
+ );
+ if ( typeof resolvedFileMetadata.path !== 'string' ) {
+ throw new HttpError(400, 'Missing path');
+ }
+
+ const username = this.#getActorUsername(req);
+ return {
+ ...resolvedFileMetadata,
+ path: this.#normalizePath(resolvedFileMetadata.path, username),
+ };
+ }
+
+ #extractGuiMetadata (
+ input: unknown,
+ fallback: WriteGuiMetadata | undefined,
+ ): WriteGuiMetadata | undefined {
+ const source =
+ input && typeof input === 'object'
+ ? (input as Record)
+ : {};
+ const guiMetadata: WriteGuiMetadata = {
+ originalClientSocketId:
+ typeof source.originalClientSocketId === 'string'
+ ? source.originalClientSocketId
+ : typeof source.original_client_socket_id === 'string'
+ ? source.original_client_socket_id
+ : fallback?.originalClientSocketId,
+ socketId:
+ typeof source.socketId === 'string'
+ ? source.socketId
+ : typeof source.socket_id === 'string'
+ ? source.socket_id
+ : fallback?.socketId,
+ operationId:
+ typeof source.operationId === 'string'
+ ? source.operationId
+ : typeof source.operation_id === 'string'
+ ? source.operation_id
+ : fallback?.operationId,
+ itemUploadId:
+ typeof source.itemUploadId === 'string'
+ ? source.itemUploadId
+ : typeof source.item_upload_id === 'string'
+ ? source.item_upload_id
+ : fallback?.itemUploadId,
+ };
+
+ if (
+ !guiMetadata.originalClientSocketId &&
+ !guiMetadata.socketId &&
+ !guiMetadata.operationId &&
+ !guiMetadata.itemUploadId
+ ) {
+ return undefined;
+ }
+ return guiMetadata;
+ }
+
+ #withGuiMetadata(
+ value: T,
+ fallbackSource: unknown,
+ ): T {
+ const guiMetadata = this.#extractGuiMetadata(
+ value,
+ this.#extractGuiMetadata(fallbackSource, undefined),
+ );
+ if ( ! guiMetadata ) {
+ return value;
+ }
+ return {
+ ...value,
+ guiMetadata,
+ };
+ }
+
+ async #assertWriteAccess (
+ req: Request,
+ fileMetadata: FSEntryWriteInput | undefined,
+ options?: {
+ pathAlreadyNormalized?: boolean;
+ },
+ ): Promise {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw new HttpError(401, 'Unauthorized');
+ }
+ const normalizedFileMetadata = options?.pathAlreadyNormalized
+ ? fileMetadata
+ : this.#normalizeFileMetadataPath(req, fileMetadata);
+ if ( ! normalizedFileMetadata ) {
+ throw new HttpError(400, 'Missing path');
+ }
+
+ const targetPath = normalizedFileMetadata.path;
+ if ( targetPath === '/' ) {
+ throw new HttpError(400, 'Cannot write to root path');
+ }
+ const parentPath = pathPosix.dirname(targetPath);
+ if ( parentPath === '/' ) {
+ throw new HttpError(400, 'Cannot write to root path');
+ }
+
+ const dedupeEnabled = this.#isDedupeEnabled(normalizedFileMetadata);
+ let pathToCheck = parentPath;
+ if ( Boolean(normalizedFileMetadata.overwrite) && !dedupeEnabled ) {
+ const destinationExists =
+ await this.fsEntryService.entryExistsByPath(targetPath);
+ if ( destinationExists ) {
+ pathToCheck = targetPath;
+ }
+ }
+
+ const fsEntryService = this.fsEntryService;
+ let ancestorsCache: Promise> | null =
+ null;
+ const resourceDescriptor = {
+ path: pathToCheck,
+ resolveAncestors () {
+ if ( ! ancestorsCache ) {
+ ancestorsCache = fsEntryService.getAncestorChain(pathToCheck);
+ }
+ return ancestorsCache;
+ },
+ };
+
+ const canWrite = await aclService.check(actor, resourceDescriptor, 'write');
+ if ( canWrite ) {
+ return;
+ }
+
+ const safeAclError = (await aclService.get_safe_acl_error(
+ actor,
+ resourceDescriptor,
+ 'write',
+ )) as {
+ status?: unknown;
+ message?: unknown;
+ fields?: {
+ code?: unknown;
+ };
+ };
+ const safeAclStatus = Number(safeAclError?.status);
+ const safeAclMessage =
+ typeof safeAclError?.message === 'string' &&
+ safeAclError.message.length > 0
+ ? safeAclError.message
+ : 'Write access denied for destination';
+ const safeAclCode =
+ typeof safeAclError?.fields?.code === 'string'
+ ? safeAclError.fields.code
+ : undefined;
+ const legacyCode =
+ safeAclCode === 'forbidden' ? 'access_denied' : safeAclCode;
+
+ if ( safeAclStatus === 404 ) {
+ throw new HttpError(404, safeAclMessage, {
+ ...(legacyCode ? { legacyCode } : {}),
+ });
+ }
+
+ throw new HttpError(403, safeAclMessage, {
+ legacyCode: legacyCode ?? 'access_denied',
+ });
+ }
+
+ async #assertBatchWriteAccess (
+ req: Request,
+ fileMetadataItems: Array,
+ options?: {
+ pathAlreadyNormalized?: boolean;
+ concurrency?: number;
+ },
+ ): Promise {
+ await runWithConcurrencyLimit(
+ fileMetadataItems,
+ options?.concurrency ?? DEFAULT_BATCH_ACL_CHECK_CONCURRENCY,
+ async (fileMetadata) => {
+ await this.#assertWriteAccess(req, fileMetadata, {
+ pathAlreadyNormalized: options?.pathAlreadyNormalized,
+ });
+ },
+ );
+ }
+
+ #toEventGuiMetadata (
+ guiMetadata: WriteGuiMetadata | undefined,
+ includeOriginalClientSocketId = true,
+ ): Record {
+ if ( ! guiMetadata ) {
+ return {};
+ }
+
+ return {
+ ...(includeOriginalClientSocketId && guiMetadata.originalClientSocketId
+ ? { original_client_socket_id: guiMetadata.originalClientSocketId }
+ : {}),
+ ...(guiMetadata.socketId ? { socket_id: guiMetadata.socketId } : {}),
+ ...(guiMetadata.operationId
+ ? { operation_id: guiMetadata.operationId }
+ : {}),
+ ...(guiMetadata.itemUploadId
+ ? { item_upload_id: guiMetadata.itemUploadId }
+ : {}),
+ };
+ }
+
+ async #toGuiFsEntry (entry: FSEntry): Promise> {
+ const dirpath = pathPosix.dirname(entry.path);
+ const extension = pathPosix.extname(entry.name).slice(1).toLowerCase();
+ const response = {
+ id: entry.uuid,
+ uid: entry.uuid,
+ uuid: entry.uuid,
+ user_id: entry.userId,
+ parent_id: entry.parentUid,
+ parent_uid: entry.parentUid,
+ path: entry.path,
+ dirname: dirpath,
+ dirpath,
+ name: entry.name,
+ is_dir: entry.isDir,
+ is_shortcut: entry.isShortcut ? 1 : 0,
+ shortcut_to: entry.shortcutTo,
+ type: entry.isDir ? 'folder' : extension,
+ writable: true,
+ is_public: entry.isPublic,
+ thumbnail: entry.thumbnail,
+ immutable: entry.immutable,
+ metadata: entry.metadata,
+ modified: entry.modified,
+ created: entry.created,
+ accessed: entry.accessed,
+ size: entry.size,
+ associated_app_id: entry.associatedAppId,
+ };
+
+ if (
+ typeof response.thumbnail === 'string' &&
+ response.thumbnail.length > 0
+ ) {
+ const thumbnailEntry = {
+ uuid: entry.uuid,
+ thumbnail: response.thumbnail,
+ };
+ await this.eventService.emit('thumbnail.read', thumbnailEntry);
+ response.thumbnail =
+ typeof thumbnailEntry.thumbnail === 'string' &&
+ thumbnailEntry.thumbnail.length > 0
+ ? thumbnailEntry.thumbnail
+ : null;
+ }
+
+ return response;
+ }
+
+ async #emitGuiWriteEvent (
+ eventName: 'outer.gui.item.added' | 'outer.gui.item.updated',
+ fsEntry: FSEntry,
+ guiMetadata: WriteGuiMetadata | undefined,
+ ): Promise {
+ const response = {
+ ...(await this.#toGuiFsEntry(fsEntry)),
+ ...this.#toEventGuiMetadata(guiMetadata, false),
+ from_new_service: true,
+ };
+ await this.eventService.emit(eventName, {
+ user_id_list: [fsEntry.userId],
+ response,
+ });
+ }
+
+ async #emitFsLifecycleEvent (
+ eventName: 'fs.write.file' | 'fs.create.file',
+ fsEntry: FSEntry,
+ ): Promise {
+ await this.eventService.emit(eventName, {
+ node: fsEntry,
+ context: Context.get(),
+ });
+ }
+
+ async #emitGuiPendingWriteEvent (
+ userId: number,
+ requestBody: SignedWriteRequest,
+ response: SignedWriteResponse,
+ ): Promise {
+ const normalizedPath = this.#normalizePath(requestBody.fileMetadata.path);
+ const pendingResponse = {
+ id: response.objectKey,
+ uid: response.objectKey,
+ uuid: response.objectKey,
+ user_id: userId,
+ path: normalizedPath,
+ name: pathPosix.basename(normalizedPath),
+ is_dir: false,
+ content_type: response.contentType,
+ size: Number(requestBody.fileMetadata.size),
+ upload_id: response.sessionId,
+ pending_upload: true,
+ status: 'pending',
+ ...this.#toEventGuiMetadata(requestBody.guiMetadata),
+ from_new_service: true,
+ };
+ await this.eventService.emit('outer.gui.item.pending', {
+ user_id_list: [userId],
+ response: pendingResponse,
+ });
+ }
+
+ #isAppDataPath (targetPath: string): boolean {
+ const pathParts = targetPath.split('/').filter(Boolean);
+ return pathParts.length >= 2 && pathParts[1] === 'AppData';
+ }
+
+ #estimateDataUrlSize (dataUrl: string): number {
+ const commaIndex = dataUrl.indexOf(',');
+ const base64 = commaIndex === -1 ? dataUrl : dataUrl.slice(commaIndex + 1);
+ return Math.ceil((base64.length * 3) / 4);
+ }
+
+ #isOversizedThumbnailDataUrl (thumbnail: string): boolean {
+ if ( ! thumbnail.startsWith('data:') ) {
+ return false;
+ }
+ return this.#estimateDataUrlSize(thumbnail) > MAX_THUMBNAIL_BYTES;
+ }
+
+ async #applyThumbnailAfterWrite (
+ userId: number,
+ fsEntry: FSEntry,
+ requestedThumbnail: string | null | undefined,
+ ): Promise {
+ if ( !requestedThumbnail || this.#isAppDataPath(fsEntry.path) ) {
+ return fsEntry;
+ }
+ if ( this.#isOversizedThumbnailDataUrl(requestedThumbnail) ) {
+ return fsEntry;
+ }
+
+ const thumbnailPayload = { url: requestedThumbnail };
+ await this.eventService.emit('thumbnail.created', thumbnailPayload);
+ const finalThumbnail =
+ typeof thumbnailPayload.url === 'string' &&
+ thumbnailPayload.url.length > 0
+ ? thumbnailPayload.url
+ : null;
+
+ if ( finalThumbnail === fsEntry.thumbnail || finalThumbnail === null ) {
+ return fsEntry;
+ }
+
+ return this.fsEntryService.updateEntryThumbnail(
+ userId,
+ fsEntry.uuid,
+ finalThumbnail,
+ );
+ }
+
+ #toThumbnailPrepareItem (
+ requestBody: SignedWriteRequest,
+ index: number,
+ ): ThumbnailUploadPrepareItem | null {
+ if ( requestBody.directory ) {
+ return null;
+ }
+
+ const thumbnailMetadata = requestBody.thumbnailMetadata;
+ if ( ! thumbnailMetadata ) {
+ return null;
+ }
+
+ const contentType =
+ typeof thumbnailMetadata.contentType === 'string'
+ ? thumbnailMetadata.contentType.trim()
+ : '';
+ if ( ! contentType ) {
+ throw new HttpError(
+ 400,
+ 'thumbnailMetadata.contentType is required for signed thumbnail upload',
+ );
+ }
+
+ if ( thumbnailMetadata.size === undefined ) {
+ return null;
+ }
+
+ const size = Number(thumbnailMetadata.size);
+ if ( !Number.isFinite(size) || size < 0 ) {
+ throw new HttpError(
+ 400,
+ 'thumbnailMetadata.size must be a non-negative number',
+ );
+ }
+ if ( size > MAX_THUMBNAIL_BYTES ) {
+ return null;
+ }
+
+ return { index, contentType, size };
+ }
+
+ async #attachSignedThumbnailUploadTargets (
+ requests: SignedWriteRequest[],
+ responses: SignedWriteResponse[],
+ ): Promise {
+ const prepareItems = requests
+ .map((requestBody, index) =>
+ this.#toThumbnailPrepareItem(requestBody, index))
+ .filter((item): item is ThumbnailUploadPrepareItem => Boolean(item));
+ if ( prepareItems.length === 0 ) {
+ return;
+ }
+
+ const payload: ThumbnailUploadPreparePayload = {
+ items: prepareItems.map(
+ (item): ThumbnailUploadPrepareItem => ({
+ index: item.index,
+ contentType: item.contentType,
+ ...(item.size !== undefined ? { size: item.size } : {}),
+ }),
+ ),
+ };
+ await this.eventService.emit('thumbnail.upload.prepare', payload);
+
+ for ( const item of payload.items ) {
+ const response = responses[item.index];
+ if ( ! response ) {
+ throw new HttpError(
+ 500,
+ 'Failed to resolve signed thumbnail response target',
+ );
+ }
+ if ( typeof item.uploadUrl !== 'string' || item.uploadUrl.length === 0 ) {
+ continue;
+ }
+ if (
+ typeof item.thumbnailUrl !== 'string' ||
+ item.thumbnailUrl.length === 0
+ ) {
+ continue;
+ }
+
+ response.thumbnailUploadUrl = item.uploadUrl;
+ response.thumbnailUrl = item.thumbnailUrl;
+ }
+ }
+
+ #assertNoInlineSignedThumbnailData (thumbnailData: string | undefined): void {
+ if ( typeof thumbnailData !== 'string' ) {
+ return;
+ }
+ if ( thumbnailData.startsWith('data:') ) {
+ throw new HttpError(
+ 400,
+ 'Signed write completion does not accept inline thumbnail data. Upload thumbnail to signed URL and provide thumbnail URL.',
+ );
+ }
+ }
+
+ #isMultipartRequest (req: Request): boolean {
+ const contentType = req.headers['content-type'];
+ if ( typeof contentType !== 'string' ) {
+ return false;
+ }
+ return contentType.includes('multipart/form-data');
+ }
+
+ #resolveBatchWriteRequestMode (req: Request): 'multipart' | 'json' {
+ if ( this.#isMultipartRequest(req) ) {
+ return 'multipart';
+ }
+
+ const contentTypeHeader = req.headers['content-type'];
+ const contentType =
+ typeof contentTypeHeader === 'string'
+ ? contentTypeHeader.toLowerCase()
+ : '';
+
+ if (
+ contentType.includes('application/json') ||
+ contentType.startsWith('text/plain;actually=json')
+ ) {
+ return 'json';
+ }
+
+ throw new HttpError(
+ 415,
+ 'Unsupported content type for batchWrite. Use multipart/form-data or application/json.',
+ );
+ }
+
+ async #runNonCritical (
+ work: () => Promise,
+ operationName: string,
+ ): Promise {
+ try {
+ await work();
+ } catch ( error ) {
+ console.error(
+ `prodfsv2 non-critical operation failed: ${operationName}`,
+ error,
+ );
+ }
+ }
+
+ async #createUploadTracker (
+ userId: number,
+ itemUid: string,
+ itemPath: string,
+ expectedSize: number,
+ guiMetadata: WriteGuiMetadata | undefined,
+ ): Promise {
+ const uploadTracker = new UploadProgressTracker();
+ uploadTracker.setTotal(Math.max(0, expectedSize));
+
+ const context = Context.get();
+ if ( ! context ) {
+ return uploadTracker;
+ }
+
+ await this.eventService.emit('fs.storage.upload-progress', {
+ upload_tracker: uploadTracker,
+ context,
+ meta: {
+ user_id: userId,
+ userId: userId,
+ item_uid: itemUid,
+ item_path: itemPath,
+ ...this.#toEventGuiMetadata(guiMetadata),
+ },
+ });
+ return uploadTracker;
+ }
+
+ async #emitWriteHashEvent (
+ contentHashSha256: string | null | undefined,
+ entryUuid: string,
+ ): Promise {
+ if ( ! contentHashSha256 ) {
+ return;
+ }
+ await this.eventService.emit('outer.fs.write-hash', {
+ hash: contentHashSha256,
+ uuid: entryUuid,
+ });
+ }
+
+ async #applyWriteResponseSideEffects (
+ userId: number,
+ response: WriteResponse,
+ guiMetadata: WriteGuiMetadata | undefined,
+ ): Promise {
+ let fsEntry = response.fsEntry;
+
+ const hashEventPromise = this.#runNonCritical(async () => {
+ await this.#emitWriteHashEvent(response.contentHashSha256, fsEntry.uuid);
+ }, 'emitWriteHashEvent');
+
+ await this.#runNonCritical(async () => {
+ fsEntry = await this.#applyThumbnailAfterWrite(
+ userId,
+ response.fsEntry,
+ response.requestedThumbnail,
+ );
+ }, 'applyThumbnailAfterWrite');
+
+ await this.#runNonCritical(async () => {
+ await this.#emitGuiWriteEvent(
+ response.wasOverwrite
+ ? 'outer.gui.item.updated'
+ : 'outer.gui.item.added',
+ fsEntry,
+ guiMetadata,
+ );
+ }, 'emitGuiWriteEvent');
+
+ await this.#runNonCritical(async () => {
+ await this.#emitFsLifecycleEvent(
+ response.wasOverwrite ? 'fs.write.file' : 'fs.create.file',
+ fsEntry,
+ );
+ }, 'emitFsLifecycleEvent');
+
+ await hashEventPromise;
+
+ return { ...response, fsEntry };
+ }
+
+ #shouldIgnoreUploadPath (targetPath: string): boolean {
+ return pathPosix.basename(targetPath).toLowerCase() === '.ds_store';
+ }
+
+ #parseBatchWriteManifest (
+ manifestRaw: string,
+ fallbackGuiMetadata: WriteGuiMetadata | undefined,
+ ): ParsedMultipartBatchManifest {
+ let parsedManifest: unknown;
+ try {
+ parsedManifest = JSON.parse(manifestRaw);
+ } catch {
+ throw new HttpError(400, 'Batch write manifest is not valid JSON');
+ }
+
+ const manifest: BatchWriteManifest = Array.isArray(parsedManifest)
+ ? { items: parsedManifest as BatchWriteManifestItem[] }
+ : (parsedManifest as BatchWriteManifest);
+
+ if (
+ !manifest ||
+ !Array.isArray(manifest.items) ||
+ manifest.items.length === 0
+ ) {
+ throw new HttpError(
+ 400,
+ 'Batch write manifest must include a non-empty items array',
+ );
+ }
+
+ const manifestGuiMetadata = this.#extractGuiMetadata(
+ manifest,
+ fallbackGuiMetadata,
+ );
+ const normalizedItems = manifest.items.map((item, orderIndex) => {
+ if ( !item || typeof item !== 'object' ) {
+ throw new HttpError(
+ 400,
+ `Batch write manifest item at position ${orderIndex} is invalid`,
+ );
+ }
+
+ const candidateIndex =
+ (item as { index?: number | string }).index ?? orderIndex;
+ const index = Number(candidateIndex);
+ if ( !Number.isInteger(index) || index < 0 ) {
+ throw new HttpError(
+ 400,
+ `Batch write manifest item index is invalid at position ${orderIndex}`,
+ );
+ }
+
+ if ( !item.fileMetadata || typeof item.fileMetadata !== 'object' ) {
+ throw new HttpError(
+ 400,
+ `Batch write manifest item ${index} is missing fileMetadata`,
+ );
+ }
+
+ return {
+ index,
+ fileMetadata: item.fileMetadata,
+ thumbnailData:
+ typeof item.thumbnailData === 'string'
+ ? item.thumbnailData
+ : undefined,
+ guiMetadata: this.#extractGuiMetadata(item, manifestGuiMetadata),
+ };
+ });
+
+ const seenIndexes = new Set();
+ const fieldIndexMap = new Map();
+ for ( const item of normalizedItems ) {
+ if ( seenIndexes.has(item.index) ) {
+ throw new HttpError(
+ 409,
+ `Batch write manifest has duplicate index ${item.index}`,
+ );
+ }
+ seenIndexes.add(item.index);
+ fieldIndexMap.set(String(item.index), item.index);
+ fieldIndexMap.set(`file-${item.index}`, item.index);
+ fieldIndexMap.set(`files[${item.index}]`, item.index);
+ }
+
+ return {
+ items: normalizedItems,
+ guiMetadata: manifestGuiMetadata,
+ fieldIndexMap,
+ ignoredItemIndexes: new Set(),
+ };
+ }
+
+ #resolveMultipartFileIndex (
+ fieldName: string,
+ fileOrderIndex: number,
+ manifest: ParsedMultipartBatchManifest,
+ ): number {
+ const directMatch = manifest.fieldIndexMap.get(fieldName);
+ if ( directMatch !== undefined ) {
+ return directMatch;
+ }
+
+ if ( /^\d+$/.test(fieldName) ) {
+ const parsedIndex = Number(fieldName);
+ if ( manifest.fieldIndexMap.get(String(parsedIndex)) !== undefined ) {
+ return parsedIndex;
+ }
+ }
+
+ if ( fieldName === 'file' || fieldName === 'files' ) {
+ const itemAtPosition = manifest.items[fileOrderIndex];
+ if ( itemAtPosition ) {
+ return itemAtPosition.index;
+ }
+ }
+
+ const fallbackItem = manifest.items[fileOrderIndex];
+ if ( fallbackItem ) {
+ return fallbackItem.index;
+ }
+
+ throw new HttpError(
+ 400,
+ `Batch write file part "${fieldName}" does not map to manifest metadata`,
+ );
+ }
+}
diff --git a/extensions/fsv2/src/controllers/types.ts b/extensions/fsv2/src/controllers/types.ts
new file mode 100644
index 0000000000..c7a5a3dbc9
--- /dev/null
+++ b/extensions/fsv2/src/controllers/types.ts
@@ -0,0 +1,47 @@
+import type { Readable } from 'node:stream';
+import type { FSEntryWriteInput } from '../types/FSEntry.js';
+import type { WriteGuiMetadata } from '../types/requests.js';
+
+export interface AbortWriteRequest {
+ uploadId: string;
+}
+
+export type RouteParams = Record;
+
+export interface BatchWriteManifestItem {
+ index: number;
+ fileMetadata: FSEntryWriteInput;
+ thumbnailData?: string;
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface BatchWriteManifest {
+ items: BatchWriteManifestItem[];
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface ParsedMultipartBatchManifest {
+ items: BatchWriteManifestItem[];
+ guiMetadata?: WriteGuiMetadata;
+ fieldIndexMap: Map;
+ ignoredItemIndexes: Set;
+}
+
+export interface ThumbnailUploadPrepareItem {
+ index: number;
+ contentType: string;
+ size?: number;
+ uploadUrl?: string;
+ thumbnailUrl?: string;
+}
+
+export interface ThumbnailUploadPreparePayload {
+ items: ThumbnailUploadPrepareItem[];
+}
+
+export interface MultipartBatchFilePart {
+ fieldName: string;
+ stream: Readable;
+ filename?: string;
+ mimeType?: string;
+}
diff --git a/extensions/fsv2/src/eventHandlers/FSEntryCacheInvalidationEventHandler.ts b/extensions/fsv2/src/eventHandlers/FSEntryCacheInvalidationEventHandler.ts
new file mode 100644
index 0000000000..21be28d423
--- /dev/null
+++ b/extensions/fsv2/src/eventHandlers/FSEntryCacheInvalidationEventHandler.ts
@@ -0,0 +1,153 @@
+import type { FSEntryRepository } from '../repositories/FSEntryRepository.js';
+import type {
+ FsRemoveNodeEventPayload,
+ FsRemoveNodeTarget,
+ OuterGuiItemEventPayload,
+} from './types.js';
+
+export class FSEntryCacheInvalidationEventHandler {
+ #fsEntryRepository: FSEntryRepository;
+
+ constructor (fsEntryRepository: FSEntryRepository) {
+ this.#fsEntryRepository = fsEntryRepository;
+ this.#registerHandlers();
+ }
+
+ #registerHandlers (): void {
+ extension.on('outer.gui.item.added', async (event: OuterGuiItemEventPayload) => {
+ await this.#runSafely(() => this.#handleOuterGuiItemEvent(event), 'outer.gui.item.added');
+ });
+ extension.on('outer.gui.item.updated', async (event: OuterGuiItemEventPayload) => {
+ await this.#runSafely(() => this.#handleOuterGuiItemEvent(event), 'outer.gui.item.updated');
+ });
+ extension.on('outer.gui.item.moved', async (event: OuterGuiItemEventPayload) => {
+ await this.#runSafely(() => this.#handleOuterGuiItemEvent(event), 'outer.gui.item.moved');
+ });
+ extension.on('fs.remove.node', async (event: FsRemoveNodeEventPayload) => {
+ await this.#runSafely(() => this.#handleRemoveNodeEvent(event), 'fs.remove.node');
+ });
+ }
+
+ async #runSafely (handler: () => Promise, eventName: string): Promise {
+ try {
+ await handler();
+ } catch ( error ) {
+ console.error(`prodfsv2 cache invalidation failed for ${eventName}`, error);
+ }
+ }
+
+ #toUserIds (value: unknown): number[] {
+ if ( ! Array.isArray(value) ) {
+ return [];
+ }
+
+ const userIds: number[] = [];
+ for ( const item of value ) {
+ const numeric = Number(item);
+ if ( Number.isInteger(numeric) && numeric > 0 ) {
+ userIds.push(numeric);
+ }
+ }
+ return userIds;
+ }
+
+ #toNonEmptyString (value: unknown): string | null {
+ if ( typeof value !== 'string' ) {
+ return null;
+ }
+ const trimmed = value.trim();
+ return trimmed.length > 0 ? trimmed : null;
+ }
+
+ #isUnrecognizedTargetKeyError (error: unknown): boolean {
+ if ( ! (error instanceof Error) ) {
+ return false;
+ }
+ return error.message.includes('unrecognize key for FSNodeContext.get:');
+ }
+
+ async #readTargetValue (target: FsRemoveNodeTarget, keys: string[]): Promise {
+ if ( typeof target.get !== 'function' ) {
+ return undefined;
+ }
+
+ for ( const key of keys ) {
+ try {
+ return await target.get(key);
+ } catch ( error ) {
+ if ( this.#isUnrecognizedTargetKeyError(error) ) {
+ continue;
+ }
+ throw error;
+ }
+ }
+
+ return undefined;
+ }
+
+ #extractUidFromEntry (value: unknown): string | null {
+ if ( !value || typeof value !== 'object' ) {
+ return null;
+ }
+ const entry = value as { uid?: unknown; uuid?: unknown };
+ return this.#toNonEmptyString(entry.uid) ?? this.#toNonEmptyString(entry.uuid);
+ }
+
+ async #handleOuterGuiItemEvent (event: OuterGuiItemEventPayload): Promise {
+ const userIds = this.#toUserIds(event?.user_id_list);
+ const response = event?.response ?? {};
+
+ const path = this.#toNonEmptyString(response.path);
+ const oldPath = this.#toNonEmptyString(response.old_path);
+ const uid =
+ this.#toNonEmptyString(response.uid)
+ ?? this.#toNonEmptyString(response.uuid)
+ ?? this.#toNonEmptyString(response.id);
+
+ const tasks: Promise[] = [];
+ for ( const userId of userIds ) {
+ if ( path ) {
+ tasks.push(this.#fsEntryRepository.invalidateEntryCacheByPathForUser(userId, path));
+ }
+ if ( oldPath && oldPath !== path ) {
+ tasks.push(this.#fsEntryRepository.invalidateEntryCacheByPathForUser(userId, oldPath));
+ }
+ }
+ if ( uid ) {
+ tasks.push(this.#fsEntryRepository.invalidateEntryCacheByUuid(uid));
+ }
+
+ if ( tasks.length > 0 ) {
+ await Promise.all(tasks);
+ }
+ }
+
+ async #handleRemoveNodeEvent (event: FsRemoveNodeEventPayload): Promise {
+ const target = event?.target;
+ if ( !target || typeof target.get !== 'function' ) {
+ return;
+ }
+
+ const userIdValue = await this.#readTargetValue(target, ['user_id']);
+ const pathValue = await this.#readTargetValue(target, ['path']);
+ const uidValue =
+ await this.#readTargetValue(target, ['uid', 'uuid'])
+ ?? this.#extractUidFromEntry(await this.#readTargetValue(target, ['entry']));
+
+ const userId = Number(userIdValue);
+ const path = this.#toNonEmptyString(pathValue);
+ const uuid = this.#toNonEmptyString(uidValue);
+
+ const tasks: Promise[] = [];
+ if ( Number.isInteger(userId) && userId > 0 && path ) {
+ tasks.push(this.#fsEntryRepository.invalidateEntryCacheByPathForUser(userId, path));
+ }
+ if ( uuid ) {
+ tasks.push(this.#fsEntryRepository.invalidateEntryCacheByUuid(uuid));
+ }
+
+ if ( tasks.length > 0 ) {
+ await Promise.all(tasks);
+ }
+ }
+}
diff --git a/extensions/fsv2/src/eventHandlers/types.ts b/extensions/fsv2/src/eventHandlers/types.ts
new file mode 100644
index 0000000000..831766019e
--- /dev/null
+++ b/extensions/fsv2/src/eventHandlers/types.ts
@@ -0,0 +1,20 @@
+export interface OuterGuiItemEventResponse {
+ path?: string;
+ old_path?: string;
+ uid?: string;
+ uuid?: string;
+ id?: string;
+}
+
+export interface OuterGuiItemEventPayload {
+ user_id_list?: Array;
+ response?: OuterGuiItemEventResponse;
+}
+
+export interface FsRemoveNodeTarget {
+ get?: (key: string) => Promise | unknown;
+}
+
+export interface FsRemoveNodeEventPayload {
+ target?: FsRemoveNodeTarget;
+}
diff --git a/extensions/fsv2/src/globals.d.ts b/extensions/fsv2/src/globals.d.ts
new file mode 100644
index 0000000000..7f00061125
--- /dev/null
+++ b/extensions/fsv2/src/globals.d.ts
@@ -0,0 +1,3 @@
+///
+
+export {};
diff --git a/extensions/fsv2/src/index.d.ts b/extensions/fsv2/src/index.d.ts
new file mode 100644
index 0000000000..55986b5e64
--- /dev/null
+++ b/extensions/fsv2/src/index.d.ts
@@ -0,0 +1,6 @@
+import '@heyputer/backend/src/services/User.js';
+declare module '../../packages/puter/src/backend/src/services/User.d.ts' {
+ export interface IUser {
+ stripe_customer_id?: string;
+ }
+}
\ No newline at end of file
diff --git a/extensions/fsv2/src/index.ts b/extensions/fsv2/src/index.ts
new file mode 100644
index 0000000000..f8784d3da8
--- /dev/null
+++ b/extensions/fsv2/src/index.ts
@@ -0,0 +1,20 @@
+import type { DynamoKVStore } from '@heyputer/backend/src/services/DynamoKVStore/DynamoKVStore.js';
+import { FSController } from './controllers/FSController.js';
+import { FSEntryCacheInvalidationEventHandler } from './eventHandlers/FSEntryCacheInvalidationEventHandler.js';
+import { FSEntryRepository } from './repositories/FSEntryRepository.js';
+import { S3StorageProvider } from './repositories/S3FileStorageRepository.js';
+import { FSEntryService } from './services/FSEntryService.js';
+
+const databaseService = extension.import('service:database');
+const { cache, s3ClientProvider } = extension.import('data');
+const eventService = extension.import('service:event');
+const kvStore = extension.import('service:puter-kvstore') as DynamoKVStore;
+const filesystemDb = databaseService;
+
+const fsEntryRepository = new FSEntryRepository(filesystemDb, cache, kvStore);
+const s3StorageProvider = new S3StorageProvider(s3ClientProvider);
+const fsEntryService = new FSEntryService(fsEntryRepository, s3StorageProvider);
+
+const fsController = new FSController(fsEntryService, eventService);
+(fsController as unknown as { registerRoutes: () => void }).registerRoutes();
+new FSEntryCacheInvalidationEventHandler(fsEntryRepository);
diff --git a/extensions/fsv2/src/repositories/FSEntryRepository.ts b/extensions/fsv2/src/repositories/FSEntryRepository.ts
new file mode 100644
index 0000000000..5d7984801b
--- /dev/null
+++ b/extensions/fsv2/src/repositories/FSEntryRepository.ts
@@ -0,0 +1,1362 @@
+import type { BaseDatabaseAccessService } from '@heyputer/backend/src/services/database/BaseDatabaseAccessService.js';
+import type { DynamoKVStore } from '@heyputer/backend/src/services/DynamoKVStore/DynamoKVStore.js';
+import type { Cluster } from 'ioredis';
+import { posix as pathPosix } from 'node:path';
+import { v4 as uuidv4 } from 'uuid';
+import {
+ FSEntry,
+ FSEntryCreateInput,
+ PendingUploadCreateInput,
+ PendingUploadSession,
+} from '../types/FSEntry.js';
+import { runWithConcurrencyLimit } from '../utils/concurrency.js';
+import {
+ normalizePendingUploadSession,
+ PendingUploadSessionStatus,
+ toPendingUploadSession,
+ toPendingUploadSessionExpiresAtSeconds,
+ toPendingUploadSessionKey,
+ withPendingUploadSessionStatus,
+} from './pendingUploadSessionHelpers.js';
+import type {
+ FSEntryRow,
+ NormalizedEntryWrite,
+ ReadEntriesByPathsOptions,
+} from './types.js';
+
+const { HttpError } = extension.import('extensionController');
+
+const ENTRY_CACHE_TTL_SECONDS = 60;
+const BULK_QUERY_CHUNK_SIZE = 200;
+const DEFAULT_DB_CHUNK_CONCURRENCY = 4;
+
+export class FSEntryRepository {
+ #db: BaseDatabaseAccessService;
+ #cache: Cluster;
+ #kvStore: DynamoKVStore;
+
+ constructor (db: BaseDatabaseAccessService, cache: Cluster, kvStore: DynamoKVStore) {
+ this.#db = db;
+ this.#cache = cache;
+ this.#kvStore = kvStore;
+ }
+
+ #insertIgnoreIntoFsentriesSql (): string {
+ return this.#db.case({
+ sqlite: 'INSERT OR IGNORE INTO fsentries',
+ otherwise: 'INSERT IGNORE INTO fsentries',
+ });
+ }
+
+ #normalizePath (path: string): string {
+ const trimmed = path.trim();
+ if ( trimmed.length === 0 ) {
+ throw new HttpError(400, 'Path cannot be empty');
+ }
+
+ let normalized = pathPosix.normalize(trimmed);
+ if ( ! normalized.startsWith('/') ) {
+ normalized = `/${normalized}`;
+ }
+ if ( normalized.length > 1 && normalized.endsWith('/') ) {
+ normalized = normalized.slice(0, -1);
+ }
+
+ return normalized;
+ }
+
+ #toBoolean (value: number | boolean | null | undefined): boolean {
+ if ( typeof value === 'boolean' ) {
+ return value;
+ }
+ return Number(value ?? 0) === 1;
+ }
+
+ #toNullableBoolean (value: number | boolean | null | undefined): boolean | null {
+ if ( value === null || value === undefined ) {
+ return null;
+ }
+ return this.#toBoolean(value);
+ }
+
+ #mapFSEntryRow (row: FSEntryRow): FSEntry {
+ return {
+ id: Number(row.id),
+ uuid: row.uuid,
+ uid: row.uuid,
+ userId: Number(row.user_id),
+ parentId: row.parent_id === null ? null : Number(row.parent_id),
+ parentUid: row.parent_uid,
+ path: row.path,
+ name: row.name,
+ isDir: this.#toBoolean(row.is_dir),
+ bucket: row.bucket,
+ bucketRegion: row.bucket_region,
+ publicToken: row.public_token,
+ fileRequestToken: row.file_request_token,
+ isShortcut: this.#toBoolean(row.is_shortcut),
+ shortcutTo: row.shortcut_to,
+ associatedAppId: row.associated_app_id,
+ layout: row.layout,
+ sortBy: row.sort_by,
+ sortOrder: row.sort_order,
+ isPublic: this.#toNullableBoolean(row.is_public),
+ thumbnail: row.thumbnail,
+ immutable: this.#toBoolean(row.immutable),
+ metadata: row.metadata,
+ modified: Number(row.modified),
+ created: row.created === null ? null : Number(row.created),
+ accessed: row.accessed === null ? null : Number(row.accessed),
+ size: row.size === null ? null : Number(row.size),
+ symlinkPath: row.symlink_path,
+ isSymlink: this.#toBoolean(row.is_symlink),
+ };
+ }
+
+ #entryCacheKeys (entry: FSEntry): string[] {
+ return [
+ `prodfsv2:fsentry:id:${entry.id}`,
+ `prodfsv2:fsentry:uuid:${entry.uuid}`,
+ `prodfsv2:fsentry:path:${entry.userId}:${entry.path}`,
+ `prodfsv2:fsentry:path:any:${entry.path}`,
+ ];
+ }
+
+ async #readEntryFromCache (cacheKey: string): Promise {
+ try {
+ const cached = await this.#cache.get(cacheKey);
+ if ( ! cached ) {
+ return null;
+ }
+ return JSON.parse(cached) as FSEntry;
+ } catch {
+ return null;
+ }
+ }
+
+ async #writeEntryToCache (entry: FSEntry): Promise {
+ try {
+ const serialized = JSON.stringify(entry);
+ await Promise.all(this.#entryCacheKeys(entry).map((cacheKey) => {
+ return this.#cache.setex(cacheKey, ENTRY_CACHE_TTL_SECONDS, serialized);
+ }));
+ } catch {
+ // Best effort cache write.
+ }
+ }
+
+ async #invalidateEntryCache (entry: FSEntry): Promise {
+ try {
+ const keys = this.#entryCacheKeys(entry);
+ if ( keys.length > 0 ) {
+ await this.#cache.del(...keys);
+ }
+ } catch {
+ // Best effort cache invalidation.
+ }
+ }
+
+ async invalidateEntryCacheByPathForUser (userId: number, path: string): Promise {
+ const normalizedPath = this.#normalizePath(path);
+ const cacheKeys: string[] = [
+ `prodfsv2:fsentry:path:${userId}:${normalizedPath}`,
+ `prodfsv2:fsentry:path:any:${normalizedPath}`,
+ ];
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE user_id = ? AND path = ? LIMIT 1',
+ [userId, normalizedPath],
+ ) as FSEntryRow[];
+ const row = rows[0];
+
+ if ( row ) {
+ const entry = this.#mapFSEntryRow(row);
+ await this.#invalidateEntryCache(entry);
+ return;
+ }
+
+ try {
+ await this.#cache.del(...cacheKeys);
+ } catch {
+ // Best effort cache invalidation.
+ }
+ }
+
+ async invalidateEntryCacheByUuid (uuid: string): Promise {
+ if ( typeof uuid !== 'string' || uuid.length === 0 ) {
+ return;
+ }
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE uuid = ? LIMIT 1',
+ [uuid],
+ ) as FSEntryRow[];
+ const row = rows[0];
+
+ if ( row ) {
+ const entry = this.#mapFSEntryRow(row);
+ await this.#invalidateEntryCache(entry);
+ return;
+ }
+
+ const cached = await this.#readEntryFromCache(`prodfsv2:fsentry:uuid:${uuid}`);
+ if ( cached ) {
+ await this.#invalidateEntryCache(cached);
+ return;
+ }
+
+ try {
+ await this.#cache.del(`prodfsv2:fsentry:uuid:${uuid}`);
+ } catch {
+ // Best effort cache invalidation.
+ }
+ }
+
+ #chunk (values: T[], size: number): T[][] {
+ if ( values.length === 0 ) {
+ return [];
+ }
+ const chunks: T[][] = [];
+ for ( let index = 0; index < values.length; index += size ) {
+ chunks.push(values.slice(index, index + size));
+ }
+ return chunks;
+ }
+
+ async #writePendingUploadSessions (sessions: PendingUploadSession[], operationName: string): Promise {
+ if ( sessions.length === 0 ) {
+ return;
+ }
+
+ try {
+ await this.#kvStore.batchPut({
+ items: sessions.map((session) => ({
+ key: toPendingUploadSessionKey(session.sessionId),
+ value: session,
+ expireAt: toPendingUploadSessionExpiresAtSeconds(session.expiresAt),
+ })),
+ });
+ } catch ( error ) {
+ if ( error instanceof Error ) {
+ throw error;
+ }
+ throw new Error(`Failed to ${operationName}`);
+ }
+ }
+
+ async #getPendingUploadSessionsBySessionIds (
+ sessionIds: string[],
+ ): Promise> {
+ const uniqueSessionIds = Array.from(new Set(sessionIds));
+ const sessionsById = new Map();
+ if ( uniqueSessionIds.length === 0 ) {
+ return sessionsById;
+ }
+
+ const rawValues = await this.#kvStore.get({
+ key: uniqueSessionIds.map((sessionId) => toPendingUploadSessionKey(sessionId)),
+ });
+ if ( ! Array.isArray(rawValues) ) {
+ return sessionsById;
+ }
+
+ for ( let index = 0; index < uniqueSessionIds.length; index++ ) {
+ const sessionId = uniqueSessionIds[index];
+ const rawValue = rawValues[index];
+ if ( ! sessionId ) {
+ continue;
+ }
+
+ const normalizedSession = normalizePendingUploadSession(rawValue, sessionId);
+ if ( normalizedSession ) {
+ sessionsById.set(sessionId, normalizedSession);
+ }
+ }
+
+ return sessionsById;
+ }
+
+ async #markPendingSessionsWithStatus (
+ sessionIds: string[],
+ status: PendingUploadSessionStatus,
+ reason: string | null,
+ ): Promise {
+ if ( sessionIds.length === 0 ) {
+ return;
+ }
+
+ const sessionsById = await this.#getPendingUploadSessionsBySessionIds(sessionIds);
+ const now = Date.now();
+ const updatedSessions = Array.from(new Set(sessionIds))
+ .map((sessionId) => {
+ const session = sessionsById.get(sessionId);
+ if ( ! session ) {
+ return null;
+ }
+
+ return withPendingUploadSessionStatus(session, status, reason, now);
+ })
+ .filter((session): session is PendingUploadSession => Boolean(session));
+
+ await this.#writePendingUploadSessions(
+ updatedSessions,
+ `mark pending upload sessions as ${status}`,
+ );
+ }
+
+ async #readEntriesByPathsForUser (
+ userId: number,
+ paths: string[],
+ options: ReadEntriesByPathsOptions = {},
+ ): Promise> {
+ const useTryHardRead = Boolean(options.useTryHardRead);
+ const skipCache = Boolean(options.skipCache);
+ const normalizedPaths = Array.from(new Set(paths
+ .map((path) => this.#normalizePath(path))
+ .filter((path) => path.length > 0)));
+ const entriesByPath = new Map();
+ if ( normalizedPaths.length === 0 ) {
+ return entriesByPath;
+ }
+
+ const missingPaths: string[] = [];
+ if ( skipCache ) {
+ missingPaths.push(...normalizedPaths);
+ } else {
+ const cacheReads = await Promise.all(normalizedPaths.map(async (path) => {
+ const cacheKey = `prodfsv2:fsentry:path:${userId}:${path}`;
+ const cachedEntry = await this.#readEntryFromCache(cacheKey);
+ return { path, cachedEntry };
+ }));
+
+ for ( const cacheRead of cacheReads ) {
+ if ( cacheRead.cachedEntry ) {
+ entriesByPath.set(cacheRead.path, cacheRead.cachedEntry);
+ } else {
+ missingPaths.push(cacheRead.path);
+ }
+ }
+ }
+
+ const chunks = this.#chunk(missingPaths, BULK_QUERY_CHUNK_SIZE);
+ const chunkResults = await runWithConcurrencyLimit(
+ chunks,
+ DEFAULT_DB_CHUNK_CONCURRENCY,
+ async (chunk) => {
+ if ( chunk.length === 0 ) {
+ return [];
+ }
+
+ const placeholders = chunk.map(() => '?').join(', ');
+ const rows = (useTryHardRead ? await this.#db.tryHardRead(
+ `SELECT * FROM fsentries WHERE user_id = ? AND path IN (${placeholders})`,
+ [userId, ...chunk],
+ ) : await this.#db.read(
+ `SELECT * FROM fsentries WHERE user_id = ? AND path IN (${placeholders})`,
+ [userId, ...chunk],
+ )) as FSEntryRow[];
+
+ const entries = rows.map((row) => this.#mapFSEntryRow(row));
+ if ( entries.length > 0 ) {
+ await Promise.all(entries.map((entry) => this.#writeEntryToCache(entry)));
+ }
+ return entries;
+ },
+ );
+ for ( const chunkEntries of chunkResults ) {
+ for ( const entry of chunkEntries ) {
+ entriesByPath.set(entry.path, entry);
+ }
+ }
+
+ return entriesByPath;
+ }
+
+ #pathDepth (path: string): number {
+ return path.split('/').filter(Boolean).length;
+ }
+
+ async #ensureDirectoryPathsForUser (
+ userId: number,
+ requiredPaths: string[],
+ ): Promise<{
+ requiredEntryMap: Map;
+ createdEntryMap: Map;
+ }> {
+ const normalizedRequiredPaths = Array.from(new Set(requiredPaths
+ .map((path) => this.#normalizePath(path))
+ .filter((path) => path !== '/')));
+ const requiredEntryMap = new Map();
+ const createdEntryMap = new Map();
+ if ( normalizedRequiredPaths.length === 0 ) {
+ return {
+ requiredEntryMap,
+ createdEntryMap,
+ };
+ }
+
+ const candidateDirSet = new Set();
+ for ( const requiredPath of normalizedRequiredPaths ) {
+ let cursor = requiredPath;
+ while ( cursor !== '/' ) {
+ candidateDirSet.add(cursor);
+ cursor = pathPosix.dirname(cursor);
+ }
+ }
+
+ const candidatePaths = Array.from(candidateDirSet);
+ const allEntries = await this.#readEntriesByPathsForUser(userId, candidatePaths);
+ for ( const path of candidatePaths ) {
+ const entry = allEntries.get(path);
+ if ( entry && !entry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${path}`);
+ }
+ }
+
+ const missingPaths = candidatePaths
+ .filter((path) => !allEntries.has(path))
+ .sort((pathA, pathB) => this.#pathDepth(pathA) - this.#pathDepth(pathB));
+ if ( missingPaths.length > 0 ) {
+ const uniqueDepths = Array.from(new Set(missingPaths.map((path) => this.#pathDepth(path))))
+ .sort((depthA, depthB) => depthA - depthB);
+
+ for ( const depth of uniqueDepths ) {
+ const pathsAtDepth = missingPaths.filter((path) => this.#pathDepth(path) === depth);
+ if ( pathsAtDepth.length === 0 ) {
+ continue;
+ }
+
+ const now = Math.floor(Date.now() / 1000);
+ const insertRows: unknown[] = [];
+ const valuePlaceholders: string[] = [];
+ const expectedUuidByPath = new Map();
+ for ( const dirPath of pathsAtDepth ) {
+ const parentPath = pathPosix.dirname(dirPath);
+ const parentEntry = parentPath === '/'
+ ? null
+ : allEntries.get(parentPath);
+ if ( parentPath !== '/' && !parentEntry ) {
+ throw new Error(`Parent directory not resolved while creating ${dirPath}`);
+ }
+ if ( parentEntry && !parentEntry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${parentPath}`);
+ }
+
+ const expectedUuid = uuidv4();
+ expectedUuidByPath.set(dirPath, expectedUuid);
+ valuePlaceholders.push('(?, ?, ?, ?, ?, ?, 1, ?, ?, ?, 0, 0)');
+ insertRows.push(
+ expectedUuid,
+ userId,
+ parentEntry ? parentEntry.id : null,
+ parentEntry ? parentEntry.uuid : null,
+ pathPosix.basename(dirPath),
+ dirPath,
+ now,
+ now,
+ now,
+ );
+ }
+
+ try {
+ await this.#db.write(
+ `${this.#insertIgnoreIntoFsentriesSql()} (
+ uuid,
+ user_id,
+ parent_id,
+ parent_uid,
+ name,
+ path,
+ is_dir,
+ created,
+ modified,
+ accessed,
+ immutable,
+ size
+ ) VALUES ${valuePlaceholders.join(', ')}`,
+ insertRows,
+ );
+ } catch {
+ // Concurrent create may have already inserted some/all rows.
+ }
+
+ const insertedEntries = await this.#readEntriesByPathsForUser(
+ userId,
+ pathsAtDepth,
+ { useTryHardRead: true },
+ );
+ for ( const path of pathsAtDepth ) {
+ let insertedEntry = insertedEntries.get(path);
+ if ( ! insertedEntry ) {
+ insertedEntry = await this.#ensureDirectoryPath(path, userId, true);
+ }
+ if ( ! insertedEntry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${path}`);
+ }
+ if ( expectedUuidByPath.get(path) === insertedEntry.uuid ) {
+ createdEntryMap.set(path, insertedEntry);
+ }
+ allEntries.set(path, insertedEntry);
+ }
+ }
+ }
+
+ for ( const requiredPath of normalizedRequiredPaths ) {
+ const entry = allEntries.get(requiredPath);
+ if ( ! entry ) {
+ throw new Error(`Failed to resolve directory path: ${requiredPath}`);
+ }
+ if ( ! entry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${requiredPath}`);
+ }
+ requiredEntryMap.set(requiredPath, entry);
+ }
+
+ return {
+ requiredEntryMap,
+ createdEntryMap,
+ };
+ }
+
+ async #getEntryByPathAndUser (path: string, userId: number): Promise {
+ const normalizedPath = this.#normalizePath(path);
+ const cacheKey = `prodfsv2:fsentry:path:${userId}:${normalizedPath}`;
+ const cached = await this.#readEntryFromCache(cacheKey);
+ if ( cached ) {
+ return cached;
+ }
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE path = ? AND user_id = ? LIMIT 1',
+ [normalizedPath, userId],
+ ) as FSEntryRow[];
+ const row = rows[0];
+ if ( ! row ) {
+ return null;
+ }
+ const entry = this.#mapFSEntryRow(row);
+ await this.#writeEntryToCache(entry);
+ return entry;
+ }
+
+ async #ensureDirectoryPath (path: string, userId: number, createPaths: boolean): Promise {
+ const normalizedPath = this.#normalizePath(path);
+
+ const existingEntry = await this.#getEntryByPathAndUser(normalizedPath, userId);
+ if ( existingEntry ) {
+ if ( ! existingEntry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${normalizedPath}`);
+ }
+ return existingEntry;
+ }
+
+ if ( ! createPaths ) {
+ throw new HttpError(404, `Parent path does not exist: ${normalizedPath}`);
+ }
+
+ if ( normalizedPath === '/' ) {
+ throw new HttpError(400, 'Cannot create root directory');
+ }
+
+ const parentPath = pathPosix.dirname(normalizedPath);
+ const parentEntry = parentPath === '/'
+ ? null
+ : await this.#ensureDirectoryPath(parentPath, userId, true);
+ const dirName = pathPosix.basename(normalizedPath);
+ const now = Math.floor(Date.now() / 1000);
+
+ try {
+ await this.#db.write(
+ `${this.#insertIgnoreIntoFsentriesSql()} (
+ uuid,
+ user_id,
+ parent_id,
+ parent_uid,
+ name,
+ path,
+ is_dir,
+ created,
+ modified,
+ accessed,
+ immutable,
+ size
+ ) VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?, ?, 0, 0)`,
+ [
+ uuidv4(),
+ userId,
+ parentEntry ? parentEntry.id : null,
+ parentEntry ? parentEntry.uuid : null,
+ dirName,
+ normalizedPath,
+ now,
+ now,
+ now,
+ ],
+ );
+ } catch {
+ // If another request created it first, we'll fetch it below.
+ }
+
+ const resolvedEntries = await this.#readEntriesByPathsForUser(
+ userId,
+ [normalizedPath],
+ { useTryHardRead: true },
+ );
+ const resolvedEntry = resolvedEntries.get(normalizedPath) ?? null;
+ if ( ! resolvedEntry ) {
+ throw new Error(`Failed to resolve directory path: ${normalizedPath}`);
+ }
+ if ( ! resolvedEntry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${normalizedPath}`);
+ }
+
+ return resolvedEntry;
+ }
+
+ #serializeMetadata (input: FSEntryCreateInput): string | null {
+ if ( typeof input.metadata === 'string' ) {
+ return input.metadata;
+ }
+
+ const metadataObject: Record =
+ input.metadata && typeof input.metadata === 'object'
+ ? { ...input.metadata }
+ : {};
+
+ if ( input.contentType ) {
+ metadataObject.contentType = input.contentType;
+ }
+ if ( input.checksumSha256 ) {
+ metadataObject.checksumSha256 = input.checksumSha256;
+ }
+
+ if ( Object.keys(metadataObject).length === 0 ) {
+ return null;
+ }
+
+ return JSON.stringify(metadataObject);
+ }
+
+ async getEntryByPath (path: string): Promise {
+ const normalizedPath = this.#normalizePath(path);
+ const cacheKey = `prodfsv2:fsentry:path:any:${normalizedPath}`;
+ const cached = await this.#readEntryFromCache(cacheKey);
+ if ( cached ) {
+ return cached;
+ }
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE path = ? LIMIT 1',
+ [normalizedPath],
+ ) as FSEntryRow[];
+ const row = rows[0];
+ if ( ! row ) {
+ return null;
+ }
+ const entry = this.#mapFSEntryRow(row);
+ await this.#writeEntryToCache(entry);
+ return entry;
+ }
+
+ async getEntriesByPaths (paths: string[]): Promise> {
+ const normalizedPaths = Array.from(new Set(
+ paths.map((path) => this.#normalizePath(path)).filter((path) => path.length > 0),
+ ));
+ const entriesByPath = new Map();
+ if ( normalizedPaths.length === 0 ) {
+ return entriesByPath;
+ }
+
+ const missingPaths: string[] = [];
+ const cacheReads = await Promise.all(normalizedPaths.map(async (path) => {
+ const cacheKey = `prodfsv2:fsentry:path:any:${path}`;
+ const cachedEntry = await this.#readEntryFromCache(cacheKey);
+ return { path, cachedEntry };
+ }));
+ for ( const { path, cachedEntry } of cacheReads ) {
+ if ( cachedEntry ) {
+ entriesByPath.set(path, cachedEntry);
+ } else {
+ missingPaths.push(path);
+ }
+ }
+
+ if ( missingPaths.length > 0 ) {
+ const chunks = this.#chunk(missingPaths, BULK_QUERY_CHUNK_SIZE);
+ const chunkResults = await runWithConcurrencyLimit(
+ chunks,
+ DEFAULT_DB_CHUNK_CONCURRENCY,
+ async (chunk) => {
+ if ( chunk.length === 0 ) {
+ return [];
+ }
+ const placeholders = chunk.map(() => '?').join(', ');
+ const rows = await this.#db.read(
+ `SELECT * FROM fsentries WHERE path IN (${placeholders})`,
+ chunk,
+ ) as FSEntryRow[];
+ const entries = rows.map((row) => this.#mapFSEntryRow(row));
+ await Promise.all(entries.map((entry) => this.#writeEntryToCache(entry)));
+ return entries;
+ },
+ );
+ for ( const chunkEntries of chunkResults ) {
+ for ( const entry of chunkEntries ) {
+ entriesByPath.set(entry.path, entry);
+ }
+ }
+ }
+
+ return entriesByPath;
+ }
+
+ async getEntryByUuid (id: string): Promise {
+ const cacheKey = `prodfsv2:fsentry:uuid:${id}`;
+ const cached = await this.#readEntryFromCache(cacheKey);
+ if ( cached ) {
+ return cached;
+ }
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE uuid = ? LIMIT 1',
+ [id],
+ ) as FSEntryRow[];
+ const row = rows[0];
+ if ( ! row ) {
+ return null;
+ }
+ const entry = this.#mapFSEntryRow(row);
+ await this.#writeEntryToCache(entry);
+ return entry;
+ }
+
+ async getEntryById (id: number): Promise {
+ const cacheKey = `prodfsv2:fsentry:id:${id}`;
+ const cached = await this.#readEntryFromCache(cacheKey);
+ if ( cached ) {
+ return cached;
+ }
+
+ const rows = await this.#db.read(
+ 'SELECT * FROM fsentries WHERE id = ? LIMIT 1',
+ [id],
+ ) as FSEntryRow[];
+ const row = rows[0];
+ if ( ! row ) {
+ return null;
+ }
+ const entry = this.#mapFSEntryRow(row);
+ await this.#writeEntryToCache(entry);
+ return entry;
+ }
+
+ async updateEntryThumbnailByUuidForUser (userId: number, uuid: string, thumbnail: string | null): Promise {
+ const now = Math.floor(Date.now() / 1000);
+ const writeResult = await this.#db.write(
+ `UPDATE fsentries
+ SET thumbnail = ?,
+ modified = ?,
+ accessed = ?
+ WHERE uuid = ? AND user_id = ?`,
+ [thumbnail, now, now, uuid, userId],
+ );
+ if ( typeof writeResult === 'object' && writeResult !== null ) {
+ const writeResultRecord = writeResult as Record;
+ const anyRowsAffected = writeResultRecord.anyRowsAffected;
+ if ( typeof anyRowsAffected === 'boolean' && !anyRowsAffected ) {
+ throw new HttpError(404, 'File entry was not found for thumbnail update');
+ }
+
+ const affectedRowsRaw = writeResultRecord.affectedRows;
+ const affectedRows = Number(affectedRowsRaw);
+ if (
+ affectedRowsRaw !== undefined
+ && Number.isFinite(affectedRows)
+ && affectedRows <= 0
+ ) {
+ throw new HttpError(404, 'File entry was not found for thumbnail update');
+ }
+ }
+
+ const refreshedRows = await this.#db.tryHardRead(
+ 'SELECT * FROM fsentries WHERE uuid = ? AND user_id = ? LIMIT 1',
+ [uuid, userId],
+ ) as FSEntryRow[];
+ const refreshedRow = refreshedRows[0];
+ if ( ! refreshedRow ) {
+ throw new HttpError(404, 'File entry was not found for thumbnail update');
+ }
+
+ const updatedEntry = this.#mapFSEntryRow(refreshedRow);
+ await this.#invalidateEntryCache(updatedEntry);
+ await this.#writeEntryToCache(updatedEntry);
+ return updatedEntry;
+ }
+
+ async resolveParentDirectory (userId: number, parentPath: string, createPaths: boolean): Promise {
+ return this.#ensureDirectoryPath(parentPath, userId, createPaths);
+ }
+
+ async getEntryByPathForUser (
+ path: string,
+ userId: number,
+ options: ReadEntriesByPathsOptions = {},
+ ): Promise {
+ if ( !options.useTryHardRead && !options.skipCache ) {
+ return this.#getEntryByPathAndUser(path, userId);
+ }
+
+ const normalizedPath = this.#normalizePath(path);
+ const entriesByPath = await this.#readEntriesByPathsForUser(
+ userId,
+ [normalizedPath],
+ options,
+ );
+ return entriesByPath.get(normalizedPath) ?? null;
+ }
+
+ async getEntriesByPathsForUser (
+ userId: number,
+ paths: string[],
+ options: ReadEntriesByPathsOptions = {},
+ ): Promise<(FSEntry | null)[]> {
+ const entriesByPath = await this.#readEntriesByPathsForUser(userId, paths, options);
+ return paths.map((path) => {
+ const normalizedPath = this.#normalizePath(path);
+ return entriesByPath.get(normalizedPath) ?? null;
+ });
+ }
+
+ async resolveParentDirectoriesBatch (
+ userId: number,
+ requests: { parentPath: string; createPaths: boolean }[],
+ ): Promise {
+ const { parentEntries } = await this.resolveParentDirectoriesBatchWithCreated(userId, requests);
+ return parentEntries;
+ }
+
+ async resolveParentDirectoriesBatchWithCreated (
+ userId: number,
+ requests: { parentPath: string; createPaths: boolean }[],
+ ): Promise<{
+ parentEntries: FSEntry[];
+ createdDirectoryEntries: FSEntry[];
+ }> {
+ if ( requests.length === 0 ) {
+ return {
+ parentEntries: [],
+ createdDirectoryEntries: [],
+ };
+ }
+
+ const parentPathsToEnsure = requests
+ .filter((request) => request.createPaths)
+ .map((request) => request.parentPath);
+ const { createdEntryMap } = await this.#ensureDirectoryPathsForUser(userId, parentPathsToEnsure);
+
+ const allParentPaths = requests.map((request) => request.parentPath);
+ const parentEntriesByPath = await this.#readEntriesByPathsForUser(userId, allParentPaths);
+ const parentEntries = allParentPaths.map((path) => {
+ const normalizedPath = this.#normalizePath(path);
+ const parentEntry = parentEntriesByPath.get(normalizedPath);
+ if ( ! parentEntry ) {
+ throw new HttpError(404, `Parent path does not exist: ${normalizedPath}`);
+ }
+ if ( ! parentEntry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${normalizedPath}`);
+ }
+ return parentEntry;
+ });
+
+ return {
+ parentEntries,
+ createdDirectoryEntries: Array.from(createdEntryMap.values()),
+ };
+ }
+
+ async ensureDirectoriesForUser (
+ userId: number,
+ requests: { path: string; createPaths: boolean }[],
+ ): Promise {
+ const { entries } = await this.ensureDirectoriesForUserWithCreated(userId, requests);
+ return entries;
+ }
+
+ async ensureDirectoriesForUserWithCreated (
+ userId: number,
+ requests: { path: string; createPaths: boolean }[],
+ ): Promise<{
+ entries: FSEntry[];
+ createdDirectoryEntries: FSEntry[];
+ }> {
+ if ( requests.length === 0 ) {
+ return {
+ entries: [],
+ createdDirectoryEntries: [],
+ };
+ }
+
+ const normalizedRequests = requests.map((request) => {
+ const normalizedPath = this.#normalizePath(request.path);
+ if ( normalizedPath === '/' ) {
+ throw new HttpError(400, 'Cannot create root directory');
+ }
+ return {
+ path: normalizedPath,
+ createPaths: request.createPaths,
+ };
+ });
+
+ const pathsToEnsure = normalizedRequests
+ .filter((request) => request.createPaths)
+ .map((request) => request.path);
+ const { createdEntryMap } = await this.#ensureDirectoryPathsForUser(userId, pathsToEnsure);
+
+ const allPaths = normalizedRequests.map((request) => request.path);
+ const entriesByPath = await this.#readEntriesByPathsForUser(userId, allPaths);
+
+ const entries = normalizedRequests.map((request) => {
+ const entry = entriesByPath.get(request.path);
+ if ( ! entry ) {
+ throw new HttpError(404, `Directory path does not exist: ${request.path}`);
+ }
+ if ( ! entry.isDir ) {
+ throw new HttpError(409, `Path is not a directory: ${request.path}`);
+ }
+ return entry;
+ });
+
+ return {
+ entries,
+ createdDirectoryEntries: Array.from(createdEntryMap.values()),
+ };
+ }
+
+ async createEntry (fsEntry: FSEntryCreateInput, createPaths = true): Promise {
+ const [entry] = await this.batchCreateEntries([fsEntry], createPaths);
+ if ( ! entry ) {
+ throw new Error('Failed to create entry');
+ }
+ return entry;
+ }
+
+ async batchCreateEntries (entries: FSEntryCreateInput[], createPaths = true): Promise {
+ if ( entries.length === 0 ) {
+ return [];
+ }
+
+ const normalizedEntries: NormalizedEntryWrite[] = entries.map((entryInput, index) => {
+ const targetPath = this.#normalizePath(entryInput.path);
+ if ( targetPath === '/' ) {
+ throw new HttpError(400, 'Cannot write to root path');
+ }
+
+ const parentPath = this.#normalizePath(pathPosix.dirname(targetPath));
+ if ( parentPath === '/' ) {
+ throw new HttpError(400, 'Cannot write directly under root path');
+ }
+
+ const size = Number(entryInput.size);
+ if ( Number.isNaN(size) || size < 0 ) {
+ throw new HttpError(400, `Invalid size for path ${targetPath}`);
+ }
+
+ return {
+ index,
+ input: entryInput,
+ userId: entryInput.userId,
+ targetPath,
+ parentPath,
+ fileName: pathPosix.basename(targetPath),
+ metadataJson: this.#serializeMetadata(entryInput),
+ bucket: entryInput.bucket ?? null,
+ bucketRegion: entryInput.bucketRegion ?? null,
+ size,
+ createPaths: entryInput.createMissingParents ?? createPaths,
+ };
+ });
+
+ const duplicatePathSet = new Set();
+ for ( const normalizedEntry of normalizedEntries ) {
+ const dedupeKey = `${normalizedEntry.userId}:${normalizedEntry.targetPath}`;
+ if ( duplicatePathSet.has(dedupeKey) ) {
+ throw new HttpError(409, `Batch contains duplicate target path: ${normalizedEntry.targetPath}`);
+ }
+ duplicatePathSet.add(dedupeKey);
+ }
+
+ const entriesByUser = new Map();
+ for ( const normalizedEntry of normalizedEntries ) {
+ const userEntries = entriesByUser.get(normalizedEntry.userId) ?? [];
+ userEntries.push(normalizedEntry);
+ entriesByUser.set(normalizedEntry.userId, userEntries);
+ }
+
+ const resultsByIndex = new Map();
+ for ( const [userId, userEntries] of entriesByUser ) {
+ const parentEntries = await this.resolveParentDirectoriesBatch(
+ userId,
+ userEntries.map((entry) => ({
+ parentPath: entry.parentPath,
+ createPaths: entry.createPaths,
+ })),
+ );
+ const parentByPath = new Map();
+ for ( const parentEntry of parentEntries ) {
+ parentByPath.set(parentEntry.path, parentEntry);
+ }
+
+ const existingEntriesByPath = await this.#readEntriesByPathsForUser(
+ userId,
+ userEntries.map((entry) => entry.targetPath),
+ {
+ useTryHardRead: true,
+ skipCache: true,
+ },
+ );
+
+ const now = Math.floor(Date.now() / 1000);
+ const updateOperations: Array<{
+ existingEntry: FSEntry;
+ updatedEntry: FSEntry;
+ promise: Promise;
+ }> = [];
+ const updatedResultsByIndex = new Map();
+ const insertCandidates: NormalizedEntryWrite[] = [];
+
+ for ( const entry of userEntries ) {
+ const parentEntry = parentByPath.get(entry.parentPath);
+ if ( ! parentEntry ) {
+ throw new Error(`Failed to resolve parent directory for ${entry.targetPath}`);
+ }
+
+ const existingEntry = existingEntriesByPath.get(entry.targetPath);
+ if ( existingEntry ) {
+ if ( ! entry.input.overwrite ) {
+ throw new HttpError(409, `Entry already exists at ${entry.targetPath}`);
+ }
+ if ( existingEntry.isDir ) {
+ throw new HttpError(409, `Cannot overwrite a directory at ${entry.targetPath}`);
+ }
+
+ const updatedEntry = {
+ ...existingEntry,
+ bucket: entry.bucket,
+ bucketRegion: entry.bucketRegion,
+ parentId: parentEntry.id,
+ parentUid: parentEntry.uuid,
+ associatedAppId: entry.input.associatedAppId ?? null,
+ isPublic: entry.input.isPublic === undefined ? null : Boolean(entry.input.isPublic),
+ thumbnail: entry.input.thumbnail ?? null,
+ immutable: Boolean(entry.input.immutable),
+ name: entry.fileName,
+ path: entry.targetPath,
+ metadata: entry.metadataJson,
+ modified: now,
+ accessed: now,
+ size: entry.size,
+ };
+ updateOperations.push({
+ existingEntry,
+ updatedEntry,
+ promise: this.#db.write(
+ `UPDATE fsentries
+ SET bucket = ?,
+ bucket_region = ?,
+ parent_id = ?,
+ parent_uid = ?,
+ associated_app_id = ?,
+ is_public = ?,
+ thumbnail = ?,
+ immutable = ?,
+ name = ?,
+ path = ?,
+ metadata = ?,
+ modified = ?,
+ accessed = ?,
+ size = ?
+ WHERE id = ?`,
+ [
+ entry.bucket,
+ entry.bucketRegion,
+ parentEntry.id,
+ parentEntry.uuid,
+ entry.input.associatedAppId ?? null,
+ entry.input.isPublic === undefined ? null : (entry.input.isPublic ? 1 : 0),
+ entry.input.thumbnail ?? null,
+ entry.input.immutable ? 1 : 0,
+ entry.fileName,
+ entry.targetPath,
+ entry.metadataJson,
+ now,
+ now,
+ entry.size,
+ existingEntry.id,
+ ],
+ ),
+ });
+ updatedResultsByIndex.set(entry.index, updatedEntry);
+ continue;
+ }
+
+ insertCandidates.push(entry);
+ }
+
+ if ( updateOperations.length > 0 ) {
+ const updateResults = await Promise.allSettled(updateOperations.map((operation) => operation.promise));
+ const successfulUpdateOperations = updateResults.flatMap((result, index) => {
+ if ( result.status !== 'fulfilled' ) {
+ return [];
+ }
+ const operation = updateOperations[index];
+ return operation ? [operation] : [];
+ });
+ if ( successfulUpdateOperations.length > 0 ) {
+ await Promise.all(successfulUpdateOperations.map((operation) => {
+ return this.#invalidateEntryCache(operation.existingEntry);
+ }));
+ await Promise.all(successfulUpdateOperations.map((operation) => {
+ return this.#writeEntryToCache(operation.updatedEntry);
+ }));
+ }
+
+ const failedUpdate = updateResults.find((result) => result.status === 'rejected');
+ if ( failedUpdate?.status === 'rejected' ) {
+ throw (failedUpdate.reason instanceof Error
+ ? failedUpdate.reason
+ : new Error('Failed to update fsentries batch'));
+ }
+ }
+
+ const insertChunks = this.#chunk(insertCandidates, BULK_QUERY_CHUNK_SIZE);
+ await runWithConcurrencyLimit(
+ insertChunks,
+ DEFAULT_DB_CHUNK_CONCURRENCY,
+ async (insertChunk) => {
+ if ( insertChunk.length === 0 ) {
+ return;
+ }
+
+ const valuePlaceholders: string[] = [];
+ const values: unknown[] = [];
+ for ( const entry of insertChunk ) {
+ const parentEntry = parentByPath.get(entry.parentPath);
+ if ( ! parentEntry ) {
+ throw new Error(`Failed to resolve parent directory for ${entry.targetPath}`);
+ }
+
+ valuePlaceholders.push('(?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
+ values.push(
+ entry.input.uuid,
+ entry.bucket,
+ entry.bucketRegion,
+ userId,
+ parentEntry.id,
+ parentEntry.uuid,
+ entry.input.associatedAppId ?? null,
+ entry.input.isPublic === undefined ? null : (entry.input.isPublic ? 1 : 0),
+ entry.input.thumbnail ?? null,
+ entry.input.immutable ? 1 : 0,
+ entry.fileName,
+ entry.targetPath,
+ entry.metadataJson,
+ now,
+ now,
+ now,
+ entry.size,
+ );
+ }
+
+ await this.#db.write(
+ `INSERT INTO fsentries (
+ uuid,
+ bucket,
+ bucket_region,
+ user_id,
+ parent_id,
+ parent_uid,
+ associated_app_id,
+ is_dir,
+ is_public,
+ thumbnail,
+ immutable,
+ name,
+ path,
+ metadata,
+ modified,
+ created,
+ accessed,
+ size
+ ) VALUES ${valuePlaceholders.join(', ')}`,
+ values,
+ );
+ },
+ );
+
+ const insertedEntriesByUuid = new Map();
+ if ( insertCandidates.length > 0 ) {
+ const insertUuidChunks = this.#chunk(
+ insertCandidates.map((entry) => entry.input.uuid),
+ BULK_QUERY_CHUNK_SIZE,
+ );
+
+ const insertedChunkResults = await runWithConcurrencyLimit(
+ insertUuidChunks,
+ DEFAULT_DB_CHUNK_CONCURRENCY,
+ async (insertUuidChunk) => {
+ if ( insertUuidChunk.length === 0 ) {
+ return [];
+ }
+
+ const placeholders = insertUuidChunk.map(() => '?').join(', ');
+ const rows = await this.#db.tryHardRead(
+ `SELECT * FROM fsentries WHERE user_id = ? AND uuid IN (${placeholders})`,
+ [userId, ...insertUuidChunk],
+ ) as FSEntryRow[];
+
+ const insertedEntries = rows.map((row) => this.#mapFSEntryRow(row));
+ if ( insertedEntries.length > 0 ) {
+ await Promise.all(insertedEntries.map((entry) => this.#writeEntryToCache(entry)));
+ }
+ return insertedEntries;
+ },
+ );
+ for ( const insertedEntries of insertedChunkResults ) {
+ for ( const insertedEntry of insertedEntries ) {
+ insertedEntriesByUuid.set(insertedEntry.uuid, insertedEntry);
+ }
+ }
+ }
+
+ for ( const entry of userEntries ) {
+ const updatedResult = updatedResultsByIndex.get(entry.index);
+ if ( updatedResult ) {
+ resultsByIndex.set(entry.index, updatedResult);
+ continue;
+ }
+
+ const insertedResult = insertedEntriesByUuid.get(entry.input.uuid);
+ if ( insertedResult ) {
+ resultsByIndex.set(entry.index, insertedResult);
+ continue;
+ }
+
+ throw new Error(`Failed to load final entry for ${entry.targetPath}`);
+ }
+ }
+
+ const createdEntries: FSEntry[] = [];
+ for ( let index = 0; index < entries.length; index++ ) {
+ const entry = resultsByIndex.get(index);
+ if ( ! entry ) {
+ throw new Error(`Failed to resolve entry result at index ${index}`);
+ }
+ createdEntries.push(entry);
+ }
+ return createdEntries;
+ }
+
+ async createPendingEntry (entry: PendingUploadCreateInput): Promise {
+ const [createdEntry] = await this.batchCreatePendingEntries([entry]);
+ if ( ! createdEntry ) {
+ throw new Error('Failed to create pending upload entry');
+ }
+ return createdEntry;
+ }
+
+ async batchCreatePendingEntries (entries: PendingUploadCreateInput[]): Promise {
+ if ( entries.length === 0 ) {
+ return [];
+ }
+ const now = Date.now();
+ const pendingSessions = entries.map((entry) => toPendingUploadSession(entry, now));
+ await this.#writePendingUploadSessions(pendingSessions, 'create pending upload sessions');
+ return pendingSessions;
+ }
+
+ async getPendingEntryBySessionId (sessionId: string): Promise {
+ const value = await this.#kvStore.get({
+ key: toPendingUploadSessionKey(sessionId),
+ });
+ return normalizePendingUploadSession(value, sessionId);
+ }
+
+ async getPendingEntriesBySessionIds (sessionIds: string[]): Promise<(PendingUploadSession | null)[]> {
+ if ( sessionIds.length === 0 ) {
+ return [];
+ }
+
+ const entriesBySessionId = await this.#getPendingUploadSessionsBySessionIds(sessionIds);
+ return sessionIds.map((sessionId) => entriesBySessionId.get(sessionId) ?? null);
+ }
+
+ async markPendingEntryCompleted (sessionId: string): Promise {
+ await this.#markPendingSessionsWithStatus([sessionId], 'completed', null);
+ }
+
+ async markPendingEntryFailed (sessionId: string, reason: string): Promise {
+ await this.#markPendingSessionsWithStatus([sessionId], 'failed', reason);
+ }
+
+ async markPendingEntriesFailed (sessionIds: string[], reason: string): Promise {
+ await this.#markPendingSessionsWithStatus(sessionIds, 'failed', reason);
+ }
+
+ async abortPendingEntry (sessionId: string, reason: string): Promise {
+ await this.#markPendingSessionsWithStatus([sessionId], 'aborted', reason);
+ }
+
+ async completePendingEntry (sessionId: string, finalData: FSEntryCreateInput): Promise {
+ const [completedEntry] = await this.batchCompletePendingEntries([{ sessionId, finalData }]);
+ if ( ! completedEntry ) {
+ throw new Error('Failed to complete pending entry');
+ }
+ return completedEntry;
+ }
+
+ async batchCompletePendingEntries (
+ entries: { sessionId: string; finalData: FSEntryCreateInput }[],
+ ): Promise {
+ if ( entries.length === 0 ) {
+ return [];
+ }
+
+ const completedEntries = await this.batchCreateEntries(
+ entries.map((entry) => entry.finalData),
+ true,
+ );
+
+ await this.#markPendingSessionsWithStatus(
+ entries.map((entry) => entry.sessionId),
+ 'completed',
+ null,
+ );
+
+ return completedEntries;
+ }
+
+ async getUserStorageAllowance (userId: number): Promise<{ curr: number; max: number }> {
+ const [usageRows, userRows] = await Promise.all([
+ this.#db.read(
+ 'SELECT COALESCE(SUM(size), 0) AS totalUsage FROM fsentries WHERE user_id = ?',
+ [userId],
+ ) as Promise<{ totalUsage: number }[]>,
+ this.#db.read(
+ 'SELECT free_storage AS freeStorage FROM user WHERE id = ? LIMIT 1',
+ [userId],
+ ) as Promise<{ freeStorage: number | null }[]>,
+ ]);
+ const usageRow = usageRows[0];
+ const userRow = userRows[0];
+
+ const curr = Number(usageRow?.totalUsage ?? 0);
+ let max = Number(userRow?.freeStorage ?? global_config.storage_capacity ?? 0);
+
+ if ( ! global_config.is_storage_limited ) {
+ const availableDeviceStorage = Number(global_config.available_device_storage ?? 0);
+ max = availableDeviceStorage > 0 ? availableDeviceStorage : Number.MAX_SAFE_INTEGER;
+ }
+
+ return { curr, max };
+ }
+}
diff --git a/extensions/fsv2/src/repositories/S3FileStorageRepository.ts b/extensions/fsv2/src/repositories/S3FileStorageRepository.ts
new file mode 100644
index 0000000000..453874aa39
--- /dev/null
+++ b/extensions/fsv2/src/repositories/S3FileStorageRepository.ts
@@ -0,0 +1,383 @@
+import {
+ AbortMultipartUploadCommand,
+ CompleteMultipartUploadCommand,
+ CreateMultipartUploadCommand,
+ DeleteObjectCommand,
+ PutObjectCommand,
+ type S3Client,
+ UploadPartCommand,
+} from '@aws-sdk/client-s3';
+import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
+import type { s3ClientProvider } from '@heyputer/backend/src/clients/s3/s3ClientProvider.js';
+import { Readable } from 'node:stream';
+import type {
+ MultipartCompleteInput,
+ ServerUploadInput,
+ SignedMultipartPartUrlsInput,
+ SignedUploadInput,
+ SignedUploadPart,
+ SignedUploadResult,
+} from './s3Types.js';
+
+export class S3StorageProvider {
+
+ #s3ClientProvider: typeof s3ClientProvider;
+
+ constructor (s3Provider: typeof s3ClientProvider) {
+ this.#s3ClientProvider = s3Provider;
+ }
+
+ #getClientForRegion (region: string): S3Client {
+ return this.#s3ClientProvider.get(region);
+ }
+
+ getMaxSingleUploadSize (): number {
+ return this.#s3ClientProvider.maxSingleUploadSize;
+ }
+
+ getMultipartPartSize (): number {
+ return this.#s3ClientProvider.partSize;
+ }
+
+ #resolveMultipartPartSize (requestedPartSize?: number): number {
+ return Math.max(
+ this.getMaxSingleUploadSize(),
+ requestedPartSize ?? this.getMultipartPartSize(),
+ );
+ }
+
+ async createSignedUploadUrl (fileMetadata: SignedUploadInput, region: string): Promise {
+ const [result] = await this.batchCreateSignedUploadUrls([fileMetadata], region);
+ if ( ! result ) {
+ throw new Error('Failed to create signed upload url');
+ }
+ return result;
+ }
+
+ async batchCreateSignedUploadUrls (filesMetadata: SignedUploadInput[], region: string): Promise {
+ const client = this.#getClientForRegion(region);
+ const now = Date.now();
+ const settledResults = await Promise.allSettled(filesMetadata.map(async (fileMetadata) => {
+ const expiresInSeconds = Math.max(60, Math.min(60 * 60, fileMetadata.expiresInSeconds));
+ const expiresAt = now + expiresInSeconds * 1000;
+ const maxSingleUploadSize = this.getMaxSingleUploadSize();
+ const shouldUseSingleUpload = fileMetadata.uploadMode === 'single'
+ && fileMetadata.size <= maxSingleUploadSize;
+
+ if ( shouldUseSingleUpload ) {
+ const command = new PutObjectCommand({
+ Bucket: fileMetadata.bucket,
+ Key: fileMetadata.objectKey,
+ ContentType: fileMetadata.contentType,
+ });
+ const url = await getSignedUrl(client, command, { expiresIn: expiresInSeconds });
+ return {
+ uploadMode: 'single' as const,
+ expiresAt,
+ url,
+ };
+ }
+
+ const multipartPartSize = this.#resolveMultipartPartSize(fileMetadata.multipartPartSize);
+ const multipartPartCount = Math.max(1, Math.ceil(fileMetadata.size / multipartPartSize));
+ let multipartUploadId: string | undefined;
+
+ try {
+ const multipartResult = await client.send(new CreateMultipartUploadCommand({
+ Bucket: fileMetadata.bucket,
+ Key: fileMetadata.objectKey,
+ ContentType: fileMetadata.contentType,
+ }));
+
+ if ( ! multipartResult.UploadId ) {
+ throw new Error('Failed to initialize multipart upload');
+ }
+
+ multipartUploadId = multipartResult.UploadId;
+ const partUrls = await this.createSignedMultipartPartUrls({
+ bucket: fileMetadata.bucket,
+ objectKey: fileMetadata.objectKey,
+ multipartUploadId,
+ partNumbers: Array.from({ length: multipartPartCount }, (_, index) => index + 1),
+ expiresInSeconds,
+ }, region);
+
+ return {
+ uploadMode: 'multipart' as const,
+ expiresAt,
+ multipartUploadId,
+ multipartPartSize,
+ multipartPartCount,
+ multipartPartUrls: partUrls,
+ };
+ } catch ( error ) {
+ if ( multipartUploadId ) {
+ try {
+ await this.abortMutipartUpload(
+ multipartUploadId,
+ region,
+ fileMetadata.bucket,
+ fileMetadata.objectKey,
+ );
+ } catch {
+ // Best effort cleanup for partially initialized multipart uploads.
+ }
+ }
+ throw error;
+ }
+ }));
+
+ const failedResults = settledResults.filter((result) => result.status === 'rejected');
+ if ( failedResults.length > 0 ) {
+ await Promise.allSettled(settledResults.map((result, index) => {
+ if ( result.status !== 'fulfilled' ) {
+ return Promise.resolve();
+ }
+ if ( result.value.uploadMode !== 'multipart' || !result.value.multipartUploadId ) {
+ return Promise.resolve();
+ }
+ const fileMetadata = filesMetadata[index];
+ if ( ! fileMetadata ) {
+ return Promise.resolve();
+ }
+ return this.abortMutipartUpload(
+ result.value.multipartUploadId,
+ region,
+ fileMetadata.bucket,
+ fileMetadata.objectKey,
+ );
+ }));
+
+ const firstFailure = failedResults[0]?.reason;
+ if ( firstFailure instanceof Error ) {
+ throw firstFailure;
+ }
+ throw new Error('Failed to create signed upload urls');
+ }
+
+ return settledResults.map((result) => {
+ if ( result.status !== 'fulfilled' ) {
+ throw new Error('Failed to create signed upload urls');
+ }
+ return result.value;
+ });
+ }
+
+ async createSignedMultipartPartUrls (
+ input: SignedMultipartPartUrlsInput,
+ region: string,
+ ): Promise {
+ const client = this.#getClientForRegion(region);
+ const expiresInSeconds = Math.max(60, Math.min(60 * 60, input.expiresInSeconds));
+
+ return Promise.all(input.partNumbers.map(async (partNumber) => {
+ const command = new UploadPartCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: input.multipartUploadId,
+ PartNumber: partNumber,
+ });
+ const url = await getSignedUrl(client, command, {
+ expiresIn: expiresInSeconds,
+ });
+ return {
+ partNumber,
+ url,
+ };
+ }));
+ }
+
+ async completeMultipartUpload (input: MultipartCompleteInput, region: string): Promise {
+ const client = this.#getClientForRegion(region);
+ await client.send(new CompleteMultipartUploadCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: input.multipartUploadId,
+ MultipartUpload: {
+ Parts: [...input.parts]
+ .sort((partA, partB) => partA.partNumber - partB.partNumber)
+ .map((part) => ({
+ PartNumber: part.partNumber,
+ ETag: part.etag,
+ })),
+ },
+ }));
+ }
+
+ async abortMutipartUpload (uploadId: string, region: string, bucket: string, objectKey: string): Promise {
+ const client = this.#getClientForRegion(region);
+ await client.send(new AbortMultipartUploadCommand({
+ Bucket: bucket,
+ Key: objectKey,
+ UploadId: uploadId,
+ }));
+ }
+
+ async uploadFromServer (input: ServerUploadInput, region: string): Promise {
+ const client = this.#getClientForRegion(region);
+ const maxSingleUploadSize = this.getMaxSingleUploadSize();
+ const resolvedContentLength = this.#resolveContentLength(input);
+ const shouldUseMultipart = input.body instanceof Readable
+ ? resolvedContentLength === undefined || resolvedContentLength > maxSingleUploadSize
+ : resolvedContentLength !== undefined && resolvedContentLength > maxSingleUploadSize;
+
+ if ( ! shouldUseMultipart ) {
+ await client.send(new PutObjectCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ ContentType: input.contentType,
+ Body: input.body,
+ ...(input.contentLength !== undefined ? { ContentLength: input.contentLength } : {}),
+ }));
+ return;
+ }
+
+ await this.#uploadFromServerMultipart(input, region, this.#resolveMultipartPartSize());
+ }
+
+ async deleteObject (bucket: string, objectKey: string, region: string): Promise {
+ const client = this.#getClientForRegion(region);
+ await client.send(new DeleteObjectCommand({
+ Bucket: bucket,
+ Key: objectKey,
+ }));
+ }
+
+ #resolveContentLength (input: ServerUploadInput): number | undefined {
+ if ( Number.isFinite(input.contentLength) && Number(input.contentLength) >= 0 ) {
+ return Number(input.contentLength);
+ }
+ if ( Number.isFinite(input.sizeHint) && Number(input.sizeHint) >= 0 ) {
+ return Number(input.sizeHint);
+ }
+ if ( Buffer.isBuffer(input.body) || input.body instanceof Uint8Array ) {
+ return input.body.byteLength;
+ }
+ if ( typeof input.body === 'string' ) {
+ return Buffer.byteLength(input.body);
+ }
+ return undefined;
+ }
+
+ #toBuffer (chunk: unknown): Buffer {
+ if ( Buffer.isBuffer(chunk) ) {
+ return chunk;
+ }
+ if ( chunk instanceof Uint8Array ) {
+ return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
+ }
+ if ( typeof chunk === 'string' ) {
+ return Buffer.from(chunk);
+ }
+ throw new Error('Unsupported chunk type for multipart upload');
+ }
+
+ async #uploadFromServerMultipart (
+ input: ServerUploadInput,
+ region: string,
+ partSize: number,
+ ): Promise {
+ const client = this.#getClientForRegion(region);
+ const createResult = await client.send(new CreateMultipartUploadCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ ContentType: input.contentType,
+ }));
+
+ const uploadId = createResult.UploadId;
+ if ( ! uploadId ) {
+ throw new Error('Failed to initialize multipart upload');
+ }
+
+ const completedParts: Array<{ ETag: string; PartNumber: number; }> = [];
+ let partNumber = 1;
+
+ const uploadPart = async (partBody: Buffer) => {
+ const uploadPartResult = await client.send(new UploadPartCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: uploadId,
+ PartNumber: partNumber,
+ Body: partBody,
+ ContentLength: partBody.byteLength,
+ }));
+ if ( ! uploadPartResult.ETag ) {
+ throw new Error(`Multipart upload returned no ETag for part ${partNumber}`);
+ }
+ completedParts.push({
+ ETag: uploadPartResult.ETag,
+ PartNumber: partNumber,
+ });
+ partNumber++;
+ };
+
+ try {
+ if ( Buffer.isBuffer(input.body) || input.body instanceof Uint8Array ) {
+ const bufferBody = this.#toBuffer(input.body);
+ for ( let offset = 0; offset < bufferBody.byteLength; offset += partSize ) {
+ const partBody = bufferBody.subarray(offset, offset + partSize);
+ await uploadPart(partBody);
+ }
+ } else if ( typeof input.body === 'string' ) {
+ const bufferBody = Buffer.from(input.body);
+ for ( let offset = 0; offset < bufferBody.byteLength; offset += partSize ) {
+ const partBody = bufferBody.subarray(offset, offset + partSize);
+ await uploadPart(partBody);
+ }
+ } else if ( input.body instanceof Readable ) {
+ let pendingChunk: Buffer = Buffer.alloc(0);
+ for await ( const chunk of input.body ) {
+ const chunkBuffer = this.#toBuffer(chunk);
+ if ( chunkBuffer.byteLength === 0 ) {
+ continue;
+ }
+ pendingChunk = pendingChunk.byteLength === 0
+ ? chunkBuffer
+ : Buffer.concat([pendingChunk, chunkBuffer]);
+ while ( pendingChunk.byteLength >= partSize ) {
+ const partBody = pendingChunk.subarray(0, partSize);
+ await uploadPart(partBody);
+ pendingChunk = pendingChunk.subarray(partSize);
+ }
+ }
+ if ( pendingChunk.byteLength > 0 ) {
+ await uploadPart(pendingChunk);
+ }
+ } else {
+ throw new Error('Unsupported body type for multipart upload');
+ }
+
+ if ( completedParts.length === 0 ) {
+ await client.send(new AbortMultipartUploadCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: uploadId,
+ }));
+ await client.send(new PutObjectCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ ContentType: input.contentType,
+ Body: Buffer.alloc(0),
+ ContentLength: 0,
+ }));
+ return;
+ }
+
+ await client.send(new CompleteMultipartUploadCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: uploadId,
+ MultipartUpload: {
+ Parts: completedParts,
+ },
+ }));
+ } catch ( error ) {
+ await client.send(new AbortMultipartUploadCommand({
+ Bucket: input.bucket,
+ Key: input.objectKey,
+ UploadId: uploadId,
+ })).catch(() => undefined);
+ throw error;
+ }
+ }
+}
diff --git a/extensions/fsv2/src/repositories/pendingUploadSessionHelpers.ts b/extensions/fsv2/src/repositories/pendingUploadSessionHelpers.ts
new file mode 100644
index 0000000000..df839233ca
--- /dev/null
+++ b/extensions/fsv2/src/repositories/pendingUploadSessionHelpers.ts
@@ -0,0 +1,133 @@
+import {
+ PendingUploadCreateInput,
+ PendingUploadSession,
+} from '../types/FSEntry.js';
+
+export type PendingUploadSessionStatus = 'pending' | 'completed' | 'failed' | 'aborted';
+
+export const PENDING_UPLOAD_SESSION_KEY_PREFIX = 'prodfsv2:upload-session:';
+
+export function toPendingUploadSessionKey (sessionId: string): string {
+ return `${PENDING_UPLOAD_SESSION_KEY_PREFIX}${sessionId}`;
+}
+
+export function toPendingUploadSessionExpiresAtSeconds (expiresAtMs: number): number {
+ return Math.max(1, Math.ceil(expiresAtMs / 1000));
+}
+
+export function toPendingUploadSession (
+ input: PendingUploadCreateInput,
+ now: number,
+): PendingUploadSession {
+ return {
+ id: 0,
+ sessionId: input.sessionId,
+ userId: input.userId,
+ appId: input.appId,
+ parentUid: input.parentUid,
+ parentPath: input.parentPath,
+ targetName: input.targetName,
+ targetPath: input.targetPath,
+ overwriteTargetUid: input.overwriteTargetUid,
+ contentType: input.contentType,
+ size: input.size,
+ checksumSha256: input.checksumSha256,
+ uploadMode: input.uploadMode,
+ multipartUploadId: input.multipartUploadId,
+ multipartPartSize: input.multipartPartSize,
+ multipartPartCount: input.multipartPartCount,
+ storageProvider: input.storageProvider,
+ bucket: input.bucket,
+ bucketRegion: input.bucketRegion,
+ objectKey: input.objectKey,
+ status: 'pending',
+ failureReason: null,
+ metadataJson: input.metadataJson,
+ createdAt: now,
+ updatedAt: now,
+ expiresAt: input.expiresAt,
+ consumedAt: null,
+ completedAt: null,
+ };
+}
+
+export function isPendingUploadSession (value: unknown): value is PendingUploadSession {
+ if ( !value || typeof value !== 'object' || Array.isArray(value) ) {
+ return false;
+ }
+
+ const candidate = value as Record;
+ return (
+ typeof candidate.sessionId === 'string'
+ && typeof candidate.userId === 'number'
+ && typeof candidate.status === 'string'
+ && typeof candidate.expiresAt === 'number'
+ && typeof candidate.objectKey === 'string'
+ && typeof candidate.parentPath === 'string'
+ && typeof candidate.targetPath === 'string'
+ );
+}
+
+export function normalizePendingUploadSession (
+ value: unknown,
+ sessionId: string,
+): PendingUploadSession | null {
+ if ( ! isPendingUploadSession(value) ) {
+ return null;
+ }
+
+ const record = value as PendingUploadSession & {
+ id?: unknown;
+ failureReason?: unknown;
+ createdAt?: unknown;
+ updatedAt?: unknown;
+ consumedAt?: unknown;
+ completedAt?: unknown;
+ };
+ const createdAt = typeof record.createdAt === 'number' ? record.createdAt : Date.now();
+ const updatedAt = typeof record.updatedAt === 'number' ? record.updatedAt : createdAt;
+
+ return {
+ ...record,
+ id: typeof record.id === 'number' ? record.id : 0,
+ sessionId,
+ failureReason: typeof record.failureReason === 'string' ? record.failureReason : null,
+ createdAt,
+ updatedAt,
+ consumedAt: typeof record.consumedAt === 'number' ? record.consumedAt : null,
+ completedAt: typeof record.completedAt === 'number' ? record.completedAt : null,
+ };
+}
+
+export function withPendingUploadSessionStatus (
+ session: PendingUploadSession,
+ status: PendingUploadSessionStatus,
+ reason: string | null,
+ now: number,
+): PendingUploadSession {
+ if ( status === 'completed' ) {
+ return {
+ ...session,
+ status,
+ failureReason: null,
+ updatedAt: now,
+ consumedAt: now,
+ completedAt: now,
+ };
+ }
+
+ if ( status === 'failed' || status === 'aborted' ) {
+ return {
+ ...session,
+ status,
+ failureReason: reason,
+ updatedAt: now,
+ };
+ }
+
+ return {
+ ...session,
+ status,
+ updatedAt: now,
+ };
+}
diff --git a/extensions/fsv2/src/repositories/s3Types.ts b/extensions/fsv2/src/repositories/s3Types.ts
new file mode 100644
index 0000000000..2cdb0c2a33
--- /dev/null
+++ b/extensions/fsv2/src/repositories/s3Types.ts
@@ -0,0 +1,55 @@
+import type { Readable } from 'node:stream';
+
+export interface SignedUploadInput {
+ bucket: string;
+ objectKey: string;
+ size: number;
+ contentType: string;
+ uploadMode: 'single' | 'multipart';
+ expiresInSeconds: number;
+ multipartPartSize?: number;
+}
+
+export interface SignedUploadPart {
+ partNumber: number;
+ url: string;
+}
+
+export interface SignedUploadResult {
+ uploadMode: 'single' | 'multipart';
+ expiresAt: number;
+ url?: string;
+ multipartUploadId?: string;
+ multipartPartSize?: number;
+ multipartPartCount?: number;
+ multipartPartUrls?: SignedUploadPart[];
+}
+
+export interface MultipartCompletePart {
+ partNumber: number;
+ etag: string;
+}
+
+export interface MultipartCompleteInput {
+ bucket: string;
+ objectKey: string;
+ multipartUploadId: string;
+ parts: MultipartCompletePart[];
+}
+
+export interface SignedMultipartPartUrlsInput {
+ bucket: string;
+ objectKey: string;
+ multipartUploadId: string;
+ partNumbers: number[];
+ expiresInSeconds: number;
+}
+
+export interface ServerUploadInput {
+ bucket: string;
+ objectKey: string;
+ contentType: string;
+ body: Buffer | Uint8Array | string | Readable;
+ contentLength?: number;
+ sizeHint?: number;
+}
diff --git a/extensions/fsv2/src/repositories/types.ts b/extensions/fsv2/src/repositories/types.ts
new file mode 100644
index 0000000000..0d3e944b16
--- /dev/null
+++ b/extensions/fsv2/src/repositories/types.ts
@@ -0,0 +1,51 @@
+import type { FSEntryCreateInput } from '../types/FSEntry.js';
+
+export interface FSEntryRow {
+ id: number;
+ uuid: string;
+ bucket: string | null;
+ bucket_region: string | null;
+ public_token: string | null;
+ file_request_token: string | null;
+ is_shortcut: number | boolean;
+ shortcut_to: number | null;
+ user_id: number;
+ parent_id: number | null;
+ parent_uid: string | null;
+ associated_app_id: number | null;
+ is_dir: number | boolean;
+ layout: string | null;
+ sort_by: 'name' | 'modified' | 'type' | 'size' | null;
+ sort_order: 'asc' | 'desc' | null;
+ is_public: number | boolean | null;
+ thumbnail: string | null;
+ immutable: number | boolean;
+ name: string;
+ metadata: string | null;
+ modified: number;
+ created: number | null;
+ accessed: number | null;
+ size: number | null;
+ symlink_path: string | null;
+ is_symlink: number | boolean;
+ path: string;
+}
+
+export interface NormalizedEntryWrite {
+ index: number;
+ input: FSEntryCreateInput;
+ userId: number;
+ targetPath: string;
+ parentPath: string;
+ fileName: string;
+ metadataJson: string | null;
+ bucket: string | null;
+ bucketRegion: string | null;
+ size: number;
+ createPaths: boolean;
+}
+
+export interface ReadEntriesByPathsOptions {
+ useTryHardRead?: boolean;
+ skipCache?: boolean;
+}
diff --git a/extensions/fsv2/src/services/FSEntryService.ts b/extensions/fsv2/src/services/FSEntryService.ts
new file mode 100644
index 0000000000..447e736fea
--- /dev/null
+++ b/extensions/fsv2/src/services/FSEntryService.ts
@@ -0,0 +1,1779 @@
+import { posix as pathPosix } from 'node:path';
+import { createHash } from 'node:crypto';
+import { Readable, Transform } from 'node:stream';
+import type { TransformCallback } from 'node:stream';
+import { v4 as uuidv4 } from 'uuid';
+import { FSEntryRepository } from '../repositories/FSEntryRepository.js';
+import { S3StorageProvider } from '../repositories/S3FileStorageRepository.js';
+import type {
+ MultipartCompletePart,
+ SignedUploadResult,
+} from '../repositories/s3Types.js';
+import {
+ FSEntry,
+ FSEntryCreateInput,
+ FSEntryWriteInput,
+ PendingUploadCreateInput,
+ PendingUploadSession,
+} from '../types/FSEntry.js';
+import {
+ BinaryPayload,
+ CompleteWriteRequest,
+ CompleteWriteResponse,
+ SignMultipartPartsRequest,
+ SignMultipartPartsResponse,
+ SignedWriteRequest,
+ SignedWriteResponse,
+ UploadMode,
+ WriteRequest,
+ WriteResponse,
+} from '../types/requests.js';
+import type {
+ BatchWritePrepareRequest,
+ NormalizedWriteInput,
+ PreparedBatchWrite,
+ UploadedBatchWriteItem,
+ UploadPayload,
+ UploadPreparedBatchItemInput,
+ UploadProgressTrackerLike,
+} from './types.js';
+import { runWithConcurrencyLimitSettled } from '../utils/concurrency.js';
+
+const { HttpError } = extension.import('extensionController');
+
+const DEFAULT_CONTENT_TYPE = 'application/octet-stream';
+const DEFAULT_SIGNED_UPLOAD_EXPIRY_SECONDS = 60 * 15;
+
+interface WriteTargetResolutionInput {
+ index: number;
+ normalizedInput: NormalizedWriteInput;
+}
+
+interface WriteTargetResolutionResult {
+ index: number;
+ normalizedInput: NormalizedWriteInput;
+ existingEntry: FSEntry | null;
+ wasOverwrite: boolean;
+}
+
+interface SignedMultipartCleanupTarget {
+ bucket: string;
+ bucketRegion: string;
+ objectKey: string;
+ signedUploadResult: SignedUploadResult;
+}
+
+interface StartSignedWriteResult {
+ response: SignedWriteResponse;
+ createdDirectoryEntries: FSEntry[];
+}
+
+interface BatchStartSignedWriteResult {
+ responses: SignedWriteResponse[];
+ createdDirectoryEntries: FSEntry[];
+}
+
+export class FSEntryService {
+ #fsEntryRepository: FSEntryRepository;
+ #s3StorageProvider: S3StorageProvider;
+
+ constructor (
+ fsEntryRepository: FSEntryRepository,
+ s3StorageProvider: S3StorageProvider,
+ ) {
+ this.#fsEntryRepository = fsEntryRepository;
+ this.#s3StorageProvider = s3StorageProvider;
+ }
+
+ #normalizePath (path: string): string {
+ const trimmedPath = path.trim();
+ if ( trimmedPath.length === 0 ) {
+ throw new HttpError(400, 'Path cannot be empty');
+ }
+ if ( trimmedPath === '~' || trimmedPath.startsWith('~/') ) {
+ throw new HttpError(400, 'Home path must be resolved before write');
+ }
+
+ let normalizedPath = pathPosix.normalize(trimmedPath);
+ if ( ! normalizedPath.startsWith('/') ) {
+ normalizedPath = `/${normalizedPath}`;
+ }
+ if ( normalizedPath.length > 1 && normalizedPath.endsWith('/') ) {
+ normalizedPath = normalizedPath.slice(0, -1);
+ }
+ return normalizedPath;
+ }
+
+ #resolveBucket (metadata: FSEntryWriteInput): string {
+ const bucket = metadata.bucket ?? global_config.s3_bucket ?? 'puter-local';
+ if ( typeof bucket !== 'string' || bucket.length === 0 ) {
+ throw new HttpError(500, 'Missing S3 bucket configuration');
+ }
+ return bucket;
+ }
+
+ #resolveBucketRegion (metadata: FSEntryWriteInput): string {
+ const bucketRegion = metadata.bucketRegion
+ ?? global_config.s3_region
+ ?? global_config.region
+ ?? 'us-west-2';
+
+ if ( typeof bucketRegion !== 'string' || bucketRegion.length === 0 ) {
+ throw new HttpError(500, 'Missing S3 region configuration');
+ }
+
+ return bucketRegion;
+ }
+
+ #normalizeWriteInput (userId: number, metadata: FSEntryWriteInput): NormalizedWriteInput {
+ const normalizedPath = this.#normalizePath(metadata.path);
+ if ( normalizedPath === '/' ) {
+ throw new HttpError(400, 'Cannot write to root path');
+ }
+
+ const size = Number(metadata.size);
+ if ( Number.isNaN(size) || size < 0 ) {
+ throw new HttpError(400, 'Invalid file size');
+ }
+
+ const metadataRecord = metadata as unknown as Record;
+ const dedupeName = Boolean(
+ metadata.dedupeName
+ ?? metadataRecord.dedupe_name,
+ );
+
+ return {
+ userId,
+ path: normalizedPath,
+ size,
+ contentType: metadata.contentType ?? DEFAULT_CONTENT_TYPE,
+ checksumSha256: metadata.checksumSha256,
+ metadata: metadata.metadata,
+ thumbnail: metadata.thumbnail,
+ associatedAppId: metadata.associatedAppId,
+ overwrite: Boolean(metadata.overwrite),
+ dedupeName,
+ createMissingParents: Boolean(metadata.createMissingParents),
+ immutable: Boolean(metadata.immutable),
+ isPublic: metadata.isPublic,
+ multipartPartSize: metadata.multipartPartSize,
+ bucket: this.#resolveBucket(metadata),
+ bucketRegion: this.#resolveBucketRegion(metadata),
+ };
+ }
+
+ async #findDedupedPath (
+ targetPath: string,
+ reservedPaths: Set,
+ loadExistingEntry: (path: string) => Promise,
+ ): Promise {
+ const parentPath = pathPosix.dirname(targetPath);
+ const extension = pathPosix.extname(targetPath);
+ const fileName = pathPosix.basename(targetPath, extension);
+
+ for ( let suffix = 1; suffix < 100_000; suffix++ ) {
+ const dedupedPath = pathPosix.join(parentPath, `${fileName} (${suffix})${extension}`);
+ if ( reservedPaths.has(dedupedPath) ) {
+ continue;
+ }
+ const existingEntry = await loadExistingEntry(dedupedPath);
+ if ( ! existingEntry ) {
+ return dedupedPath;
+ }
+ }
+
+ throw new HttpError(409, 'Unable to resolve deduped file path');
+ }
+
+ async #resolveWriteTargets (
+ userId: number,
+ inputs: WriteTargetResolutionInput[],
+ ): Promise {
+ const reservedPaths = new Set();
+ const existingEntryCache = new Map>();
+ const initialPaths = Array.from(new Set(inputs.map((input) => input.normalizedInput.path)));
+ const initialEntries = await this.#fsEntryRepository.getEntriesByPathsForUser(
+ userId,
+ initialPaths,
+ {
+ useTryHardRead: true,
+ skipCache: true,
+ },
+ );
+ for ( let index = 0; index < initialPaths.length; index++ ) {
+ const path = initialPaths[index];
+ if ( ! path ) {
+ continue;
+ }
+ existingEntryCache.set(path, Promise.resolve(initialEntries[index] ?? null));
+ }
+
+ const loadExistingEntry = async (path: string): Promise => {
+ const cachedPromise = existingEntryCache.get(path);
+ if ( cachedPromise ) {
+ return await cachedPromise;
+ }
+
+ const readPromise = this.#fsEntryRepository.getEntryByPathForUser(path, userId, {
+ useTryHardRead: true,
+ skipCache: true,
+ });
+ existingEntryCache.set(path, readPromise);
+ return await readPromise;
+ };
+
+ const results: WriteTargetResolutionResult[] = [];
+ for ( const input of inputs ) {
+ let normalizedInput = input.normalizedInput;
+ let existingEntry = await loadExistingEntry(normalizedInput.path);
+ const pathReservedInBatch = reservedPaths.has(normalizedInput.path);
+
+ if ( pathReservedInBatch || existingEntry ) {
+ if ( normalizedInput.dedupeName ) {
+ const dedupedPath = await this.#findDedupedPath(
+ normalizedInput.path,
+ reservedPaths,
+ loadExistingEntry,
+ );
+ normalizedInput = {
+ ...normalizedInput,
+ path: dedupedPath,
+ };
+ existingEntry = await loadExistingEntry(dedupedPath);
+ } else if ( pathReservedInBatch ) {
+ throw new HttpError(409, `Batch contains duplicate target path: ${normalizedInput.path}`);
+ }
+ }
+
+ if ( existingEntry && existingEntry.isDir ) {
+ throw new HttpError(409, 'Cannot overwrite an existing directory');
+ }
+ if ( existingEntry && !normalizedInput.overwrite ) {
+ throw new HttpError(409, 'A file already exists at this path and overwrite was not requested');
+ }
+
+ reservedPaths.add(normalizedInput.path);
+ results.push({
+ index: input.index,
+ normalizedInput,
+ existingEntry,
+ wasOverwrite: Boolean(existingEntry),
+ });
+ }
+
+ return results;
+ }
+
+ #toCreateInput (normalizedInput: NormalizedWriteInput, objectKey: string): FSEntryCreateInput {
+ return {
+ userId: normalizedInput.userId,
+ uuid: objectKey,
+ path: normalizedInput.path,
+ size: normalizedInput.size,
+ contentType: normalizedInput.contentType,
+ checksumSha256: normalizedInput.checksumSha256,
+ metadata: normalizedInput.metadata,
+ thumbnail: normalizedInput.thumbnail,
+ associatedAppId: normalizedInput.associatedAppId,
+ overwrite: normalizedInput.overwrite,
+ createMissingParents: normalizedInput.createMissingParents,
+ immutable: normalizedInput.immutable,
+ isPublic: normalizedInput.isPublic,
+ multipartPartSize: normalizedInput.multipartPartSize,
+ bucket: normalizedInput.bucket,
+ bucketRegion: normalizedInput.bucketRegion,
+ };
+ }
+
+ #determineUploadMode (requestUploadMode: UploadMode | 'auto' | undefined, size: number): UploadMode {
+ const maxSingleUploadSize = this.#s3StorageProvider.getMaxSingleUploadSize();
+ if ( requestUploadMode === 'multipart' ) {
+ return 'multipart';
+ }
+ if ( requestUploadMode === 'single' ) {
+ return size > maxSingleUploadSize ? 'multipart' : 'single';
+ }
+ return size > maxSingleUploadSize ? 'multipart' : 'single';
+ }
+
+ #resolveStorageMax (
+ allowanceMax: number,
+ storageAllowanceMaxOverride?: number,
+ ): number {
+ if ( allowanceMax === Number.MAX_SAFE_INTEGER ) {
+ return allowanceMax;
+ }
+ if ( storageAllowanceMaxOverride === undefined ) {
+ return allowanceMax;
+ }
+ if ( !Number.isFinite(storageAllowanceMaxOverride) || storageAllowanceMaxOverride < 0 ) {
+ return allowanceMax;
+ }
+ return Math.max(allowanceMax, storageAllowanceMaxOverride);
+ }
+
+ async #assertStorageAllowance (
+ userId: number,
+ incomingSize: number,
+ existingSize = 0,
+ storageAllowanceMaxOverride?: number,
+ ): Promise {
+ const allowance = await this.#fsEntryRepository.getUserStorageAllowance(userId);
+ const maxStorage = this.#resolveStorageMax(allowance.max, storageAllowanceMaxOverride);
+ if ( maxStorage === Number.MAX_SAFE_INTEGER ) {
+ return;
+ }
+
+ const projectedUsage = allowance.curr - existingSize + incomingSize;
+ if ( projectedUsage > maxStorage ) {
+ throw new HttpError(413, 'Storage limit reached');
+ }
+ }
+
+ async #assertStorageAllowanceForBatch (
+ userId: number,
+ sizeChanges: Array<{ incomingSize: number; existingSize: number }>,
+ storageAllowanceMaxOverride?: number,
+ ): Promise {
+ if ( sizeChanges.length === 0 ) {
+ return;
+ }
+
+ const allowance = await this.#fsEntryRepository.getUserStorageAllowance(userId);
+ const maxStorage = this.#resolveStorageMax(allowance.max, storageAllowanceMaxOverride);
+ if ( maxStorage === Number.MAX_SAFE_INTEGER ) {
+ return;
+ }
+
+ let projectedUsage = allowance.curr;
+ for ( const sizeChange of sizeChanges ) {
+ projectedUsage = projectedUsage - sizeChange.existingSize + sizeChange.incomingSize;
+ }
+
+ if ( projectedUsage > maxStorage ) {
+ throw new HttpError(413, 'Storage limit reached');
+ }
+ }
+
+ #toErrorMessage (error: unknown): string {
+ if ( error instanceof Error ) {
+ return error.message;
+ }
+ return 'Unknown error';
+ }
+
+ #toError (error: unknown, fallbackMessage: string): Error {
+ if ( error instanceof Error ) {
+ return error;
+ }
+ return new Error(fallbackMessage);
+ }
+
+ #toMultipartParts (parts: CompleteWriteRequest['parts']): MultipartCompletePart[] {
+ if ( !parts || parts.length === 0 ) {
+ return [];
+ }
+ return parts.map((part) => ({
+ partNumber: Number(part.partNumber),
+ etag: part.etag,
+ }));
+ }
+
+ #parseSessionMetadata (session: PendingUploadSession): FSEntryCreateInput {
+ if ( ! session.metadataJson ) {
+ throw new HttpError(500, 'Upload session metadata is missing');
+ }
+
+ const parsedMetadata = JSON.parse(session.metadataJson) as FSEntryCreateInput;
+ return {
+ ...parsedMetadata,
+ userId: session.userId,
+ uuid: session.objectKey,
+ path: session.targetPath,
+ size: session.size,
+ contentType: session.contentType,
+ checksumSha256: session.checksumSha256 ?? undefined,
+ bucket: session.bucket ?? undefined,
+ bucketRegion: session.bucketRegion ?? undefined,
+ overwrite: Boolean(session.overwriteTargetUid),
+ };
+ }
+
+ #isBinaryPayload (value: unknown): value is BinaryPayload {
+ return Boolean(
+ value
+ && typeof value === 'object'
+ && 'base64' in value
+ && typeof (value as BinaryPayload).base64 === 'string',
+ );
+ }
+
+ #isNodeStream (value: unknown): value is Readable {
+ return Boolean(value && typeof value === 'object' && typeof (value as Readable).pipe === 'function');
+ }
+
+ #isWebReadableStream (value: unknown): value is ReadableStream {
+ return Boolean(value && typeof value === 'object' && typeof (value as ReadableStream).getReader === 'function');
+ }
+
+ #createCountingStream (
+ source: Readable,
+ uploadTracker?: UploadProgressTrackerLike,
+ ): { stream: Readable; uploadedSize: () => number; contentHashSha256: () => string } {
+ let uploadedBytes = 0;
+ const hash = createHash('sha256');
+ const countingStream = new Transform({
+ transform (chunk: unknown, _encoding: string, callback: TransformCallback) {
+ let chunkLength = 0;
+ if ( Buffer.isBuffer(chunk) || chunk instanceof Uint8Array ) {
+ chunkLength = chunk.byteLength;
+ hash.update(chunk);
+ } else if ( typeof chunk === 'string' ) {
+ chunkLength = Buffer.byteLength(chunk);
+ hash.update(chunk);
+ }
+ uploadedBytes += chunkLength;
+ if ( chunkLength > 0 && uploadTracker ) {
+ uploadTracker.add(chunkLength);
+ }
+ callback(null, chunk as Buffer | Uint8Array | string);
+ },
+ });
+
+ source.on('error', (error) => {
+ countingStream.destroy(error);
+ });
+ source.pipe(countingStream);
+
+ return {
+ stream: countingStream,
+ uploadedSize: () => uploadedBytes,
+ contentHashSha256: () => hash.digest('hex'),
+ };
+ }
+
+ async #toUploadBody (
+ content: WriteRequest['fileContent'],
+ encoding: WriteRequest['encoding'],
+ uploadTracker?: UploadProgressTrackerLike,
+ ): Promise {
+ if ( Buffer.isBuffer(content) ) {
+ const hash = createHash('sha256');
+ hash.update(content);
+ return {
+ body: content,
+ contentLength: content.byteLength,
+ uploadedSize: () => content.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ if ( this.#isBinaryPayload(content) ) {
+ const buffer = Buffer.from(content.base64, 'base64');
+ const hash = createHash('sha256');
+ hash.update(buffer);
+ return {
+ body: buffer,
+ contentLength: buffer.byteLength,
+ uploadedSize: () => buffer.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ if ( typeof content === 'string' ) {
+ if ( encoding === 'base64' ) {
+ const buffer = Buffer.from(content, 'base64');
+ const hash = createHash('sha256');
+ hash.update(buffer);
+ return {
+ body: buffer,
+ contentLength: buffer.byteLength,
+ uploadedSize: () => buffer.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ const buffer = Buffer.from(content, encoding ?? 'utf8');
+ const hash = createHash('sha256');
+ hash.update(buffer);
+ return {
+ body: buffer,
+ contentLength: buffer.byteLength,
+ uploadedSize: () => buffer.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ if ( content instanceof Uint8Array ) {
+ const hash = createHash('sha256');
+ hash.update(content);
+ return {
+ body: content,
+ contentLength: content.byteLength,
+ uploadedSize: () => content.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ if ( content instanceof ArrayBuffer ) {
+ const buffer = Buffer.from(content);
+ const hash = createHash('sha256');
+ hash.update(buffer);
+ return {
+ body: buffer,
+ contentLength: buffer.byteLength,
+ uploadedSize: () => buffer.byteLength,
+ contentHashSha256: hash.digest('hex'),
+ };
+ }
+ if ( this.#isNodeStream(content) ) {
+ const streamPayload = this.#createCountingStream(content, uploadTracker);
+ return {
+ body: streamPayload.stream,
+ uploadedSize: streamPayload.uploadedSize,
+ contentHashSha256: null,
+ finalizeContentHashSha256: () => streamPayload.contentHashSha256(),
+ };
+ }
+ if ( this.#isWebReadableStream(content) ) {
+ const reader = content.getReader();
+ const asyncIterable = {
+ async *[Symbol.asyncIterator] (): AsyncGenerator {
+ while ( true ) {
+ const readResult = await reader.read();
+ if ( readResult.done ) {
+ return;
+ }
+ if ( readResult.value ) {
+ yield readResult.value;
+ }
+ }
+ },
+ };
+ const streamPayload = this.#createCountingStream(
+ Readable.from(asyncIterable),
+ uploadTracker,
+ );
+ return {
+ body: streamPayload.stream,
+ uploadedSize: streamPayload.uploadedSize,
+ contentHashSha256: null,
+ finalizeContentHashSha256: () => streamPayload.contentHashSha256(),
+ };
+ }
+ if ( content instanceof Blob ) {
+ const reader = content.stream().getReader();
+ const asyncIterable = {
+ async *[Symbol.asyncIterator] (): AsyncGenerator {
+ while ( true ) {
+ const readResult = await reader.read();
+ if ( readResult.done ) {
+ return;
+ }
+ if ( readResult.value ) {
+ yield readResult.value;
+ }
+ }
+ },
+ };
+ const streamPayload = this.#createCountingStream(
+ Readable.from(asyncIterable),
+ uploadTracker,
+ );
+ return {
+ body: streamPayload.stream,
+ contentLength: Number.isFinite(content.size) ? content.size : undefined,
+ uploadedSize: streamPayload.uploadedSize,
+ contentHashSha256: null,
+ finalizeContentHashSha256: () => streamPayload.contentHashSha256(),
+ };
+ }
+
+ throw new HttpError(400, 'Unsupported file content payload');
+ }
+
+ async #cleanupPreparedBatchUploads (
+ preparedBatch: PreparedBatchWrite,
+ uploadedItems: UploadedBatchWriteItem[],
+ ): Promise {
+ const cleanupTargets = uploadedItems.map((uploadedItem) => {
+ const preparedItem = preparedBatch.itemsByIndex.get(uploadedItem.index);
+ if ( !preparedItem || preparedItem.wasOverwrite ) {
+ return null;
+ }
+
+ return {
+ bucket: preparedItem.normalizedInput.bucket,
+ bucketRegion: preparedItem.normalizedInput.bucketRegion,
+ objectKey: uploadedItem.objectKey,
+ };
+ }).filter((target): target is {
+ bucket: string;
+ bucketRegion: string;
+ objectKey: string;
+ } => Boolean(target));
+
+ if ( cleanupTargets.length === 0 ) {
+ return;
+ }
+
+ const cleanupResults = await Promise.allSettled(cleanupTargets.map((target) => {
+ return this.#s3StorageProvider.deleteObject(
+ target.bucket,
+ target.objectKey,
+ target.bucketRegion,
+ );
+ }));
+
+ const cleanupFailures = cleanupResults.filter((result) => result.status === 'rejected');
+ if ( cleanupFailures.length > 0 ) {
+ console.error('prodfsv2 failed to clean up batch upload objects', cleanupFailures);
+ }
+ }
+
+ getMaxSingleUploadSize (): number {
+ return this.#s3StorageProvider.getMaxSingleUploadSize();
+ }
+
+ async #cleanupSignedMultipartUploads (uploads: SignedMultipartCleanupTarget[]): Promise {
+ if ( uploads.length === 0 ) {
+ return;
+ }
+
+ const cleanupResults = await Promise.allSettled(uploads.map((upload) => {
+ if ( upload.signedUploadResult.uploadMode !== 'multipart' || !upload.signedUploadResult.multipartUploadId ) {
+ return Promise.resolve();
+ }
+
+ return this.#s3StorageProvider.abortMutipartUpload(
+ upload.signedUploadResult.multipartUploadId,
+ upload.bucketRegion,
+ upload.bucket,
+ upload.objectKey,
+ );
+ }));
+
+ const cleanupFailures = cleanupResults.filter((result) => result.status === 'rejected');
+ if ( cleanupFailures.length > 0 ) {
+ console.error('prodfsv2 failed to abort signed multipart uploads', cleanupFailures);
+ }
+ }
+
+ #toSignedMultipartCleanupTargets (
+ items: Array<{
+ index: number;
+ normalizedInput: NormalizedWriteInput;
+ }>,
+ objectKeys: string[],
+ signedResultsByIndex: Map,
+ ): SignedMultipartCleanupTarget[] {
+ return items.map((item, index) => {
+ const signedUploadResult = signedResultsByIndex.get(item.index);
+ const objectKey = objectKeys[index];
+ if ( !signedUploadResult || !objectKey ) {
+ return null;
+ }
+
+ return {
+ bucket: item.normalizedInput.bucket,
+ bucketRegion: item.normalizedInput.bucketRegion,
+ objectKey,
+ signedUploadResult,
+ };
+ }).filter((upload): upload is SignedMultipartCleanupTarget => Boolean(upload));
+ }
+
+ #toSignedWriteResponse (
+ sessionId: string,
+ normalizedInput: NormalizedWriteInput,
+ objectKey: string,
+ signedUploadResult: SignedUploadResult,
+ ): SignedWriteResponse {
+ return {
+ sessionId,
+ uploadMode: signedUploadResult.uploadMode,
+ objectKey,
+ bucket: normalizedInput.bucket,
+ bucketRegion: normalizedInput.bucketRegion,
+ contentType: normalizedInput.contentType,
+ expiresAt: signedUploadResult.expiresAt,
+ ...(signedUploadResult.url ? { url: signedUploadResult.url } : {}),
+ ...(signedUploadResult.multipartUploadId ? { multipartUploadId: signedUploadResult.multipartUploadId } : {}),
+ ...(signedUploadResult.multipartPartSize ? { multipartPartSize: signedUploadResult.multipartPartSize } : {}),
+ ...(signedUploadResult.multipartPartCount ? { multipartPartCount: signedUploadResult.multipartPartCount } : {}),
+ ...(signedUploadResult.multipartPartUrls ? { multipartPartUrls: signedUploadResult.multipartPartUrls } : {}),
+ };
+ }
+
+ #toDirectorySignedWriteResponse (
+ fsEntry: FSEntry,
+ directoryCreated: boolean,
+ ): SignedWriteResponse {
+ return {
+ sessionId: '',
+ uploadMode: 'single',
+ objectKey: fsEntry.uuid,
+ bucket: fsEntry.bucket ?? '',
+ bucketRegion: fsEntry.bucketRegion ?? '',
+ contentType: 'inode/directory',
+ expiresAt: Date.now(),
+ directoryCreated,
+ fsEntry,
+ };
+ }
+
+ async entryExistsByPath (path: string): Promise {
+ const entry = await this.#fsEntryRepository.getEntryByPath(path);
+ return entry !== null;
+ }
+
+ async getAncestorChain (path: string): Promise> {
+ const paths: string[] = [];
+ let cursor = this.#normalizePath(path);
+ while ( cursor !== '/' ) {
+ paths.push(cursor);
+ cursor = pathPosix.dirname(cursor);
+ }
+
+ const entriesByPath = await this.#fsEntryRepository.getEntriesByPaths(paths);
+
+ const ancestors: Array<{ uid: string; path: string }> = [];
+ for ( const p of paths ) {
+ const entry = entriesByPath.get(p);
+ if ( entry ) {
+ ancestors.push({ uid: entry.uid, path: entry.path });
+ }
+ }
+ return ancestors;
+ }
+
+ async prepareBatchWrites (
+ userId: number,
+ writeRequests: BatchWritePrepareRequest[],
+ storageAllowanceMax?: number,
+ ): Promise {
+ if ( writeRequests.length === 0 ) {
+ return {
+ userId,
+ items: [],
+ itemsByIndex: new Map(),
+ ...(storageAllowanceMax !== undefined ? { storageAllowanceMax } : {}),
+ };
+ }
+
+ const normalizedRequests = writeRequests.map((writeRequest, index) => {
+ const normalizedInput = this.#normalizeWriteInput(userId, writeRequest.fileMetadata);
+ const requestedThumbnail = writeRequest.thumbnailData ?? normalizedInput.thumbnail ?? null;
+ normalizedInput.thumbnail = null;
+ return {
+ index,
+ normalizedInput,
+ requestedThumbnail,
+ guiMetadata: writeRequest.guiMetadata,
+ };
+ });
+
+ const resolvedTargets = await this.#resolveWriteTargets(
+ userId,
+ normalizedRequests.map((request) => ({
+ index: request.index,
+ normalizedInput: request.normalizedInput,
+ })),
+ );
+ const resolvedTargetMap = new Map(
+ resolvedTargets.map((resolvedTarget) => [resolvedTarget.index, resolvedTarget]),
+ );
+ const resolvedRequests = normalizedRequests.map((request) => {
+ const resolvedTarget = resolvedTargetMap.get(request.index);
+ if ( ! resolvedTarget ) {
+ throw new Error(`Failed to resolve write target for index ${request.index}`);
+ }
+ return {
+ ...request,
+ normalizedInput: resolvedTarget.normalizedInput,
+ existingEntry: resolvedTarget.existingEntry,
+ wasOverwrite: resolvedTarget.wasOverwrite,
+ };
+ });
+
+ await this.#fsEntryRepository.resolveParentDirectoriesBatch(
+ userId,
+ resolvedRequests.map((item) => ({
+ parentPath: pathPosix.dirname(item.normalizedInput.path),
+ createPaths: item.normalizedInput.createMissingParents,
+ })),
+ );
+
+ const items = resolvedRequests.map((item) => ({
+ index: item.index,
+ normalizedInput: item.normalizedInput,
+ existingEntry: item.existingEntry,
+ objectKey: item.existingEntry?.uuid ?? uuidv4(),
+ wasOverwrite: item.wasOverwrite,
+ requestedThumbnail: item.requestedThumbnail,
+ guiMetadata: item.guiMetadata,
+ }));
+ const itemsByIndex = new Map();
+ for ( const item of items ) {
+ itemsByIndex.set(item.index, item);
+ }
+
+ return {
+ userId,
+ items,
+ itemsByIndex,
+ ...(storageAllowanceMax !== undefined ? { storageAllowanceMax } : {}),
+ };
+ }
+
+ async assertStorageAllowanceForPreparedBatch (
+ preparedBatch: PreparedBatchWrite,
+ uploadedItems?: UploadedBatchWriteItem[],
+ storageAllowanceMaxOverride?: number,
+ ): Promise {
+ if ( preparedBatch.items.length === 0 ) {
+ return;
+ }
+
+ const uploadedItemMap = new Map();
+ if ( uploadedItems ) {
+ for ( const uploadedItem of uploadedItems ) {
+ uploadedItemMap.set(uploadedItem.index, uploadedItem);
+ }
+ }
+
+ const sizeChanges = preparedBatch.items.map((item) => {
+ const uploadedItem = uploadedItemMap.get(item.index);
+ return {
+ incomingSize: uploadedItem ? uploadedItem.uploadedSize : item.normalizedInput.size,
+ existingSize: item.existingEntry?.size ?? 0,
+ };
+ });
+
+ const storageAllowanceMax = storageAllowanceMaxOverride ?? preparedBatch.storageAllowanceMax;
+ await this.#assertStorageAllowanceForBatch(preparedBatch.userId, sizeChanges, storageAllowanceMax);
+ }
+
+ async uploadPreparedBatchItem (
+ input: UploadPreparedBatchItemInput,
+ ): Promise {
+ const preparedItem = input.preparedBatch.itemsByIndex.get(input.itemIndex);
+ if ( ! preparedItem ) {
+ throw new HttpError(400, `Batch metadata was not found for index ${input.itemIndex}`);
+ }
+
+ const uploadBody = await this.#toUploadBody(
+ input.fileContent,
+ input.encoding,
+ input.uploadTracker,
+ );
+
+ await this.#s3StorageProvider.uploadFromServer({
+ bucket: preparedItem.normalizedInput.bucket,
+ objectKey: preparedItem.objectKey,
+ contentType: preparedItem.normalizedInput.contentType,
+ body: uploadBody.body,
+ ...(uploadBody.contentLength !== undefined ? { contentLength: uploadBody.contentLength } : {}),
+ ...(Number.isFinite(preparedItem.normalizedInput.size)
+ ? { sizeHint: preparedItem.normalizedInput.size }
+ : {}),
+ }, preparedItem.normalizedInput.bucketRegion);
+
+ const uploadedSize = uploadBody.uploadedSize();
+ if ( input.uploadTracker ) {
+ const currentTrackedSize = Number(input.uploadTracker.progress ?? 0);
+ if ( uploadedSize > currentTrackedSize ) {
+ input.uploadTracker.add(uploadedSize - currentTrackedSize);
+ }
+ }
+
+ return {
+ index: preparedItem.index,
+ objectKey: preparedItem.objectKey,
+ uploadedSize,
+ contentHashSha256: uploadBody.finalizeContentHashSha256
+ ? uploadBody.finalizeContentHashSha256()
+ : uploadBody.contentHashSha256,
+ };
+ }
+
+ async finalizePreparedBatchWrites (
+ preparedBatch: PreparedBatchWrite,
+ uploadedItems: UploadedBatchWriteItem[],
+ ): Promise {
+ try {
+ if ( preparedBatch.items.length !== uploadedItems.length ) {
+ throw new HttpError(400, 'Some batch files were missing upload content');
+ }
+
+ await this.assertStorageAllowanceForPreparedBatch(preparedBatch, uploadedItems);
+
+ const uploadedItemMap = new Map();
+ for ( const uploadedItem of uploadedItems ) {
+ uploadedItemMap.set(uploadedItem.index, uploadedItem);
+ }
+
+ const createInputs = preparedBatch.items.map((item) => {
+ const uploadedItem = uploadedItemMap.get(item.index);
+ if ( ! uploadedItem ) {
+ throw new HttpError(400, `Missing uploaded file content for index ${item.index}`);
+ }
+ item.normalizedInput.size = uploadedItem.uploadedSize;
+ return this.#toCreateInput(item.normalizedInput, uploadedItem.objectKey);
+ });
+
+ const fsEntries = await this.#fsEntryRepository.batchCreateEntries(createInputs, true);
+ return preparedBatch.items.map((item, index) => {
+ const fsEntry = fsEntries[index];
+ if ( ! fsEntry ) {
+ throw new Error(`Failed to resolve batch write result at index ${index}`);
+ }
+ const uploadedItem = uploadedItemMap.get(item.index);
+ return {
+ fsEntry,
+ wasOverwrite: item.wasOverwrite,
+ requestedThumbnail: item.requestedThumbnail,
+ contentHashSha256: uploadedItem?.contentHashSha256 ?? null,
+ };
+ });
+ } catch ( error ) {
+ await this.#cleanupPreparedBatchUploads(preparedBatch, uploadedItems);
+ throw error;
+ }
+ }
+
+ async startUrlWrite (
+ userId: number,
+ signedWriteRequest: SignedWriteRequest,
+ storageAllowanceMax?: number,
+ ): Promise {
+ const result = await this.startUrlWriteWithCreatedDirectories(
+ userId,
+ signedWriteRequest,
+ storageAllowanceMax,
+ );
+ return result.response;
+ }
+
+ async startUrlWriteWithCreatedDirectories (
+ userId: number,
+ signedWriteRequest: SignedWriteRequest,
+ storageAllowanceMax?: number,
+ ): Promise {
+ let normalizedInput = this.#normalizeWriteInput(userId, signedWriteRequest.fileMetadata);
+ if ( signedWriteRequest.directory ) {
+ const {
+ entries,
+ createdDirectoryEntries,
+ } = await this.#fsEntryRepository.ensureDirectoriesForUserWithCreated(
+ userId,
+ [{
+ path: normalizedInput.path,
+ createPaths: normalizedInput.createMissingParents,
+ }],
+ );
+ const [directoryEntry] = entries;
+ if ( ! directoryEntry ) {
+ throw new Error('Failed to resolve directory entry after start write');
+ }
+ const createdDirectoryPathSet = new Set(createdDirectoryEntries.map((entry) => entry.path));
+ return {
+ response: this.#toDirectorySignedWriteResponse(
+ directoryEntry,
+ createdDirectoryPathSet.has(normalizedInput.path),
+ ),
+ createdDirectoryEntries,
+ };
+ }
+
+ const [resolvedTarget] = await this.#resolveWriteTargets(userId, [{
+ index: 0,
+ normalizedInput,
+ }]);
+ if ( ! resolvedTarget ) {
+ throw new Error('Failed to resolve write target');
+ }
+ normalizedInput = resolvedTarget.normalizedInput;
+ const existingEntry = resolvedTarget.existingEntry;
+
+ const existingSize = existingEntry?.size ?? 0;
+ const parentPath = pathPosix.dirname(normalizedInput.path);
+ const [, {
+ parentEntries,
+ createdDirectoryEntries,
+ }] = await Promise.all([
+ this.#assertStorageAllowance(userId, normalizedInput.size, existingSize, storageAllowanceMax),
+ this.#fsEntryRepository.resolveParentDirectoriesBatchWithCreated(
+ userId,
+ [{
+ parentPath,
+ createPaths: normalizedInput.createMissingParents,
+ }],
+ ),
+ ]);
+ const [parentEntry] = parentEntries;
+ if ( ! parentEntry ) {
+ throw new Error('Failed to resolve parent directory for signed write');
+ }
+
+ const objectKey = existingEntry?.uuid ?? uuidv4();
+ const uploadMode = this.#determineUploadMode(signedWriteRequest.uploadMode, normalizedInput.size);
+ const expiresInSeconds = signedWriteRequest.expiresInSeconds ?? DEFAULT_SIGNED_UPLOAD_EXPIRY_SECONDS;
+ const createInput = this.#toCreateInput(normalizedInput, objectKey);
+
+ const signedUploadResult = await this.#s3StorageProvider.createSignedUploadUrl({
+ bucket: normalizedInput.bucket,
+ objectKey,
+ size: normalizedInput.size,
+ contentType: normalizedInput.contentType,
+ uploadMode,
+ expiresInSeconds,
+ multipartPartSize: normalizedInput.multipartPartSize,
+ }, normalizedInput.bucketRegion);
+
+ const sessionId = uuidv4();
+ const pendingUploadInput: PendingUploadCreateInput = {
+ sessionId,
+ userId,
+ appId: normalizedInput.associatedAppId ?? null,
+ parentUid: parentEntry.uuid,
+ parentPath: parentEntry.path,
+ targetName: pathPosix.basename(normalizedInput.path),
+ targetPath: normalizedInput.path,
+ overwriteTargetUid: existingEntry?.uuid ?? null,
+ contentType: normalizedInput.contentType,
+ size: normalizedInput.size,
+ checksumSha256: normalizedInput.checksumSha256 ?? null,
+ uploadMode,
+ multipartUploadId: signedUploadResult.multipartUploadId ?? null,
+ multipartPartSize: signedUploadResult.multipartPartSize ?? null,
+ multipartPartCount: signedUploadResult.multipartPartCount ?? null,
+ storageProvider: 's3',
+ bucket: normalizedInput.bucket,
+ bucketRegion: normalizedInput.bucketRegion,
+ objectKey,
+ metadataJson: JSON.stringify(createInput),
+ expiresAt: signedUploadResult.expiresAt,
+ };
+
+ try {
+ await this.#fsEntryRepository.createPendingEntry(pendingUploadInput);
+ } catch ( error ) {
+ await this.#cleanupSignedMultipartUploads([{
+ bucket: normalizedInput.bucket,
+ bucketRegion: normalizedInput.bucketRegion,
+ objectKey,
+ signedUploadResult,
+ }]);
+ throw error;
+ }
+
+ return {
+ response: this.#toSignedWriteResponse(sessionId, normalizedInput, objectKey, signedUploadResult),
+ createdDirectoryEntries,
+ };
+ }
+
+ async batchStartUrlWrites (
+ userId: number,
+ signedWriteRequests: SignedWriteRequest[],
+ storageAllowanceMax?: number,
+ ): Promise {
+ const result = await this.batchStartUrlWritesWithCreatedDirectories(
+ userId,
+ signedWriteRequests,
+ storageAllowanceMax,
+ );
+ return result.responses;
+ }
+
+ async batchStartUrlWritesWithCreatedDirectories (
+ userId: number,
+ signedWriteRequests: SignedWriteRequest[],
+ storageAllowanceMax?: number,
+ ): Promise {
+ if ( signedWriteRequests.length === 0 ) {
+ return {
+ responses: [],
+ createdDirectoryEntries: [],
+ };
+ }
+
+ const normalizedRequests = signedWriteRequests.map((signedWriteRequest, index) => ({
+ index,
+ request: signedWriteRequest,
+ isDirectory: Boolean(signedWriteRequest.directory),
+ normalizedInput: this.#normalizeWriteInput(userId, signedWriteRequest.fileMetadata),
+ }));
+ const responsesByIndex = new Map();
+ const createdDirectoryEntriesByPath = new Map();
+
+ const directoryItems = normalizedRequests.filter((item) => item.isDirectory);
+ const directoryPathSet = new Set();
+ for ( const directoryItem of directoryItems ) {
+ const targetPath = directoryItem.normalizedInput.path;
+ if ( directoryPathSet.has(targetPath) ) {
+ throw new HttpError(409, `Batch contains duplicate target path: ${targetPath}`);
+ }
+ directoryPathSet.add(targetPath);
+ }
+ if ( directoryItems.length > 0 ) {
+ const {
+ entries: ensuredDirectoryEntries,
+ createdDirectoryEntries,
+ } = await this.#fsEntryRepository.ensureDirectoriesForUserWithCreated(
+ userId,
+ directoryItems.map((item) => ({
+ path: item.normalizedInput.path,
+ createPaths: item.normalizedInput.createMissingParents,
+ })),
+ );
+ for ( const createdDirectoryEntry of createdDirectoryEntries ) {
+ createdDirectoryEntriesByPath.set(createdDirectoryEntry.path, createdDirectoryEntry);
+ }
+
+ for ( let index = 0; index < directoryItems.length; index++ ) {
+ const item = directoryItems[index];
+ const directoryEntry = ensuredDirectoryEntries[index];
+ if ( !item || !directoryEntry ) {
+ throw new Error('Failed to build directory response from batch start data');
+ }
+ responsesByIndex.set(
+ item.index,
+ this.#toDirectorySignedWriteResponse(
+ directoryEntry,
+ createdDirectoryEntriesByPath.has(item.normalizedInput.path),
+ ),
+ );
+ }
+ }
+
+ const fileItems = normalizedRequests.filter((item) => !item.isDirectory);
+ if ( fileItems.length > 0 ) {
+ const resolvedTargets = await this.#resolveWriteTargets(
+ userId,
+ fileItems.map((item) => ({
+ index: item.index,
+ normalizedInput: item.normalizedInput,
+ })),
+ );
+ const resolvedTargetMap = new Map(
+ resolvedTargets.map((resolvedTarget) => [resolvedTarget.index, resolvedTarget]),
+ );
+ const resolvedFileItems = fileItems.map((item) => {
+ const resolvedTarget = resolvedTargetMap.get(item.index);
+ if ( ! resolvedTarget ) {
+ throw new Error(`Failed to resolve write target for batch index ${item.index}`);
+ }
+
+ return {
+ ...item,
+ normalizedInput: resolvedTarget.normalizedInput,
+ existingEntry: resolvedTarget.existingEntry,
+ };
+ });
+
+ const allowanceChecks: Array<{ incomingSize: number; existingSize: number }> = [];
+ for ( const item of resolvedFileItems ) {
+ allowanceChecks.push({
+ incomingSize: item.normalizedInput.size,
+ existingSize: item.existingEntry?.size ?? 0,
+ });
+ }
+ const [, {
+ parentEntries,
+ createdDirectoryEntries: createdParentDirectoryEntries,
+ }] = await Promise.all([
+ this.#assertStorageAllowanceForBatch(userId, allowanceChecks, storageAllowanceMax),
+ this.#fsEntryRepository.resolveParentDirectoriesBatchWithCreated(
+ userId,
+ resolvedFileItems.map((item) => ({
+ parentPath: pathPosix.dirname(item.normalizedInput.path),
+ createPaths: item.normalizedInput.createMissingParents,
+ })),
+ ),
+ ]);
+ for ( const createdParentDirectoryEntry of createdParentDirectoryEntries ) {
+ createdDirectoryEntriesByPath.set(createdParentDirectoryEntry.path, createdParentDirectoryEntry);
+ }
+
+ const objectKeys = resolvedFileItems.map((item) => {
+ return item.existingEntry?.uuid ?? uuidv4();
+ });
+ const uploadModes = resolvedFileItems.map((item) => {
+ return this.#determineUploadMode(item.request.uploadMode, item.normalizedInput.size);
+ });
+ const sessionIds = resolvedFileItems.map(() => uuidv4());
+
+ const signedResultsByIndex = new Map();
+ const writesByRegion = new Map>();
+ for ( let index = 0; index < resolvedFileItems.length; index++ ) {
+ const item = resolvedFileItems[index];
+ const objectKey = objectKeys[index];
+ const uploadMode = uploadModes[index];
+ if ( !item || !objectKey || !uploadMode ) {
+ throw new Error('Failed to build batch signed upload request');
+ }
+ const regionEntries = writesByRegion.get(item.normalizedInput.bucketRegion) ?? [];
+ regionEntries.push({
+ requestIndex: item.index,
+ input: {
+ bucket: item.normalizedInput.bucket,
+ objectKey,
+ size: item.normalizedInput.size,
+ contentType: item.normalizedInput.contentType,
+ uploadMode,
+ expiresInSeconds: item.request.expiresInSeconds ?? DEFAULT_SIGNED_UPLOAD_EXPIRY_SECONDS,
+ multipartPartSize: item.normalizedInput.multipartPartSize,
+ },
+ });
+ writesByRegion.set(item.normalizedInput.bucketRegion, regionEntries);
+ }
+
+ const regionResults = await Promise.allSettled(Array.from(writesByRegion.entries()).map(async ([region, regionWrites]) => {
+ const signedResults = await this.#s3StorageProvider.batchCreateSignedUploadUrls(
+ regionWrites.map((item) => item.input),
+ region,
+ );
+ for ( let index = 0; index < regionWrites.length; index++ ) {
+ const regionWrite = regionWrites[index];
+ const signedResult = signedResults[index];
+ if ( !regionWrite || !signedResult ) {
+ throw new Error('Failed to map signed upload result to request');
+ }
+ signedResultsByIndex.set(regionWrite.requestIndex, signedResult);
+ }
+ }));
+ const signedMultipartCleanupTargets = this.#toSignedMultipartCleanupTargets(
+ resolvedFileItems,
+ objectKeys,
+ signedResultsByIndex,
+ );
+
+ const failedRegionResult = regionResults.find((result) => result.status === 'rejected');
+ if ( failedRegionResult?.status === 'rejected' ) {
+ await this.#cleanupSignedMultipartUploads(signedMultipartCleanupTargets);
+
+ throw this.#toError(failedRegionResult.reason, 'Failed to create batch signed upload urls');
+ }
+
+ try {
+ const pendingInputs: PendingUploadCreateInput[] = [];
+ for ( let index = 0; index < resolvedFileItems.length; index++ ) {
+ const item = resolvedFileItems[index];
+ const parentEntry = parentEntries[index];
+ const objectKey = objectKeys[index];
+ const sessionId = sessionIds[index];
+ const uploadMode = uploadModes[index];
+ const existingEntry = item?.existingEntry;
+ if ( !item || !parentEntry || !objectKey || !sessionId || !uploadMode ) {
+ throw new Error('Failed to build pending upload input from batch start data');
+ }
+ const signedUploadResult = signedResultsByIndex.get(item.index);
+ if ( ! signedUploadResult ) {
+ throw new Error('Failed to resolve signed upload result for batch start data');
+ }
+
+ const createInput = this.#toCreateInput(item.normalizedInput, objectKey);
+ pendingInputs.push({
+ sessionId,
+ userId,
+ appId: item.normalizedInput.associatedAppId ?? null,
+ parentUid: parentEntry.uuid,
+ parentPath: parentEntry.path,
+ targetName: pathPosix.basename(item.normalizedInput.path),
+ targetPath: item.normalizedInput.path,
+ overwriteTargetUid: existingEntry?.uuid ?? null,
+ contentType: item.normalizedInput.contentType,
+ size: item.normalizedInput.size,
+ checksumSha256: item.normalizedInput.checksumSha256 ?? null,
+ uploadMode,
+ multipartUploadId: signedUploadResult.multipartUploadId ?? null,
+ multipartPartSize: signedUploadResult.multipartPartSize ?? null,
+ multipartPartCount: signedUploadResult.multipartPartCount ?? null,
+ storageProvider: 's3',
+ bucket: item.normalizedInput.bucket,
+ bucketRegion: item.normalizedInput.bucketRegion,
+ objectKey,
+ metadataJson: JSON.stringify(createInput),
+ expiresAt: signedUploadResult.expiresAt,
+ });
+ }
+
+ await this.#fsEntryRepository.batchCreatePendingEntries(pendingInputs);
+
+ for ( let index = 0; index < resolvedFileItems.length; index++ ) {
+ const item = resolvedFileItems[index];
+ const sessionId = sessionIds[index];
+ const objectKey = objectKeys[index];
+ if ( !item || !sessionId || !objectKey ) {
+ throw new Error('Failed to build signed write response from batch start data');
+ }
+ const signedUploadResult = signedResultsByIndex.get(item.index);
+ if ( ! signedUploadResult ) {
+ throw new Error('Failed to resolve signed upload result for batch response data');
+ }
+ responsesByIndex.set(item.index, this.#toSignedWriteResponse(
+ sessionId,
+ item.normalizedInput,
+ objectKey,
+ signedUploadResult,
+ ));
+ }
+ } catch ( error ) {
+ await this.#cleanupSignedMultipartUploads(signedMultipartCleanupTargets);
+ throw error;
+ }
+ }
+
+ const responses = normalizedRequests.map((request) => {
+ const response = responsesByIndex.get(request.index);
+ if ( ! response ) {
+ throw new Error(`Failed to resolve signed batch response for index ${request.index}`);
+ }
+ return response;
+ });
+ return {
+ responses,
+ createdDirectoryEntries: Array.from(createdDirectoryEntriesByPath.values()),
+ };
+ }
+
+ async signMultipartParts (
+ userId: number,
+ request: SignMultipartPartsRequest,
+ ): Promise {
+ if ( ! request?.uploadId ) {
+ throw new HttpError(400, 'Missing uploadId');
+ }
+ if ( !Array.isArray(request.partNumbers) || request.partNumbers.length === 0 ) {
+ throw new HttpError(400, 'Missing partNumbers');
+ }
+
+ const uniquePartNumbers = Array.from(new Set(request.partNumbers.map((value) => Number(value))));
+ if ( uniquePartNumbers.some((partNumber) => !Number.isInteger(partNumber) || partNumber <= 0) ) {
+ throw new HttpError(400, 'Invalid partNumbers');
+ }
+
+ const session = await this.#fsEntryRepository.getPendingEntryBySessionId(request.uploadId);
+ if ( ! session ) {
+ throw new HttpError(404, 'Upload session was not found');
+ }
+ if ( session.userId !== userId ) {
+ throw new HttpError(403, 'Upload session access denied');
+ }
+ if ( session.status !== 'pending' ) {
+ throw new HttpError(409, `Upload session is not pending (status=${session.status})`);
+ }
+ if ( session.expiresAt < Date.now() ) {
+ await this.#fsEntryRepository.markPendingEntryFailed(session.sessionId, 'Upload session expired');
+ throw new HttpError(400, 'Upload session expired');
+ }
+ if ( session.uploadMode !== 'multipart' ) {
+ throw new HttpError(400, 'Upload session is not multipart');
+ }
+ if ( ! session.multipartUploadId ) {
+ throw new HttpError(400, 'Multipart upload id missing from session');
+ }
+ const multipartPartCount = session.multipartPartCount;
+ if (
+ multipartPartCount !== null
+ && uniquePartNumbers.some((partNumber) => partNumber > multipartPartCount)
+ ) {
+ throw new HttpError(400, 'Part number exceeds multipart part count');
+ }
+ if ( !session.bucket || !session.bucketRegion ) {
+ throw new HttpError(500, 'Upload session storage metadata is missing');
+ }
+
+ const expiresInSeconds = request.expiresInSeconds ?? DEFAULT_SIGNED_UPLOAD_EXPIRY_SECONDS;
+ const multipartPartUrls = await this.#s3StorageProvider.createSignedMultipartPartUrls({
+ bucket: session.bucket,
+ objectKey: session.objectKey,
+ multipartUploadId: session.multipartUploadId,
+ partNumbers: uniquePartNumbers,
+ expiresInSeconds,
+ }, session.bucketRegion);
+
+ const expiresAt = Date.now() + Math.max(60, Math.min(60 * 60, expiresInSeconds)) * 1000;
+
+ return {
+ uploadId: session.sessionId,
+ multipartUploadId: session.multipartUploadId,
+ objectKey: session.objectKey,
+ bucket: session.bucket,
+ bucketRegion: session.bucketRegion,
+ expiresAt,
+ multipartPartUrls,
+ };
+ }
+
+ async completeUrlWrite (userId: number, completeWriteRequest: CompleteWriteRequest): Promise {
+ const session = await this.#fsEntryRepository.getPendingEntryBySessionId(completeWriteRequest.uploadId);
+ if ( ! session ) {
+ throw new HttpError(404, 'Upload session was not found');
+ }
+ if ( session.userId !== userId ) {
+ throw new HttpError(403, 'Upload session access denied');
+ }
+ if ( session.status !== 'pending' ) {
+ throw new HttpError(409, `Upload session is not pending (status=${session.status})`);
+ }
+ if ( session.expiresAt < Date.now() ) {
+ await this.#fsEntryRepository.markPendingEntryFailed(session.sessionId, 'Upload session expired');
+ throw new HttpError(400, 'Upload session expired');
+ }
+
+ const createInput = this.#parseSessionMetadata(session);
+ const requestedThumbnail = completeWriteRequest.thumbnailData ?? createInput.thumbnail ?? null;
+ createInput.thumbnail = null;
+
+ try {
+ if ( session.uploadMode === 'multipart' ) {
+ if ( ! session.multipartUploadId ) {
+ throw new HttpError(400, 'Multipart upload id missing from session');
+ }
+
+ const completeParts = this.#toMultipartParts(completeWriteRequest.parts);
+ if ( completeParts.length === 0 ) {
+ throw new HttpError(400, 'Multipart upload completion requires parts');
+ }
+
+ await this.#s3StorageProvider.completeMultipartUpload({
+ bucket: session.bucket ?? createInput.bucket ?? this.#resolveBucket(createInput),
+ objectKey: session.objectKey,
+ multipartUploadId: session.multipartUploadId,
+ parts: completeParts,
+ }, session.bucketRegion ?? createInput.bucketRegion ?? this.#resolveBucketRegion(createInput));
+ }
+
+ const fsEntry = await this.#fsEntryRepository.completePendingEntry(session.sessionId, createInput);
+ return {
+ sessionId: session.sessionId,
+ fsEntry,
+ wasOverwrite: Boolean(session.overwriteTargetUid),
+ requestedThumbnail,
+ };
+ } catch ( error ) {
+ await this.#fsEntryRepository.markPendingEntryFailed(
+ session.sessionId,
+ error instanceof Error ? error.message : 'Unknown error while completing upload',
+ );
+ throw error;
+ }
+ }
+
+ async batchCompleteUrlWrite (
+ userId: number,
+ completeWriteRequests: CompleteWriteRequest[],
+ ): Promise {
+ if ( completeWriteRequests.length === 0 ) {
+ return [];
+ }
+
+ const uploadIds = completeWriteRequests.map((request) => request.uploadId);
+ const uniqueUploadIds = new Set(uploadIds);
+ if ( uniqueUploadIds.size !== uploadIds.length ) {
+ throw new HttpError(409, 'Batch contains duplicate upload session ids');
+ }
+
+ const sessions = await this.#fsEntryRepository.getPendingEntriesBySessionIds(uploadIds);
+ const completionItems: Array<{
+ index: number;
+ request: CompleteWriteRequest;
+ session: PendingUploadSession;
+ finalData: FSEntryCreateInput;
+ requestedThumbnail: string | null | undefined;
+ }> = [];
+ const expiredSessionIds: string[] = [];
+
+ for ( let index = 0; index < completeWriteRequests.length; index++ ) {
+ const request = completeWriteRequests[index];
+ const session = sessions[index];
+ if ( !request || !session ) {
+ throw new HttpError(404, 'Upload session was not found');
+ }
+ if ( session.userId !== userId ) {
+ throw new HttpError(403, 'Upload session access denied');
+ }
+ if ( session.status !== 'pending' ) {
+ throw new HttpError(409, `Upload session is not pending (status=${session.status})`);
+ }
+ if ( session.expiresAt < Date.now() ) {
+ expiredSessionIds.push(session.sessionId);
+ continue;
+ }
+
+ const finalData = this.#parseSessionMetadata(session);
+ const requestedThumbnail = request.thumbnailData ?? finalData.thumbnail ?? null;
+ finalData.thumbnail = null;
+ completionItems.push({
+ index,
+ request,
+ session,
+ finalData,
+ requestedThumbnail,
+ });
+ }
+
+ if ( expiredSessionIds.length > 0 ) {
+ await this.#fsEntryRepository.markPendingEntriesFailed(expiredSessionIds, 'Upload session expired');
+ throw new HttpError(400, 'Upload session expired');
+ }
+
+ const multipartItems = completionItems.filter((item) => item.session.uploadMode === 'multipart');
+ const multipartCompletions = await Promise.allSettled(multipartItems.map(async (item) => {
+ if ( ! item.session.multipartUploadId ) {
+ throw new HttpError(400, 'Multipart upload id missing from session');
+ }
+
+ const completeParts = this.#toMultipartParts(item.request.parts);
+ if ( completeParts.length === 0 ) {
+ throw new HttpError(400, 'Multipart upload completion requires parts');
+ }
+
+ await this.#s3StorageProvider.completeMultipartUpload({
+ bucket: item.session.bucket ?? item.finalData.bucket ?? this.#resolveBucket(item.finalData),
+ objectKey: item.session.objectKey,
+ multipartUploadId: item.session.multipartUploadId,
+ parts: completeParts,
+ }, item.session.bucketRegion ?? item.finalData.bucketRegion ?? this.#resolveBucketRegion(item.finalData));
+ }));
+
+ const failedMultipartItems: Array<{ sessionId: string; reason: unknown }> = [];
+ for ( let index = 0; index < multipartCompletions.length; index++ ) {
+ const completion = multipartCompletions[index];
+ const multipartItem = multipartItems[index];
+ if ( completion?.status === 'rejected' && multipartItem ) {
+ failedMultipartItems.push({
+ sessionId: multipartItem.session.sessionId,
+ reason: completion.reason,
+ });
+ }
+ }
+
+ if ( failedMultipartItems.length > 0 ) {
+ await Promise.all(failedMultipartItems.map((item) => {
+ return this.#fsEntryRepository.markPendingEntryFailed(item.sessionId, this.#toErrorMessage(item.reason));
+ }));
+
+ const firstReason = failedMultipartItems[0]?.reason;
+ if ( firstReason instanceof HttpError ) {
+ throw firstReason;
+ }
+ if ( firstReason instanceof Error ) {
+ throw firstReason;
+ }
+ throw new Error('Failed to complete multipart upload');
+ }
+
+ const completedEntries = await this.#fsEntryRepository.batchCompletePendingEntries(
+ completionItems.map((item) => ({
+ sessionId: item.session.sessionId,
+ finalData: item.finalData,
+ })),
+ );
+
+ const responseByIndex = new Map();
+ for ( let index = 0; index < completionItems.length; index++ ) {
+ const completionItem = completionItems[index];
+ const completedEntry = completedEntries[index];
+ if ( !completionItem || !completedEntry ) {
+ throw new Error('Failed to build completed batch write response');
+ }
+
+ responseByIndex.set(completionItem.index, {
+ sessionId: completionItem.session.sessionId,
+ fsEntry: completedEntry,
+ wasOverwrite: Boolean(completionItem.session.overwriteTargetUid),
+ requestedThumbnail: completionItem.requestedThumbnail,
+ });
+ }
+
+ const response: CompleteWriteResponse[] = [];
+ for ( let index = 0; index < completeWriteRequests.length; index++ ) {
+ const result = responseByIndex.get(index);
+ if ( ! result ) {
+ throw new Error(`Failed to resolve completed batch response for index ${index}`);
+ }
+ response.push(result);
+ }
+ return response;
+ }
+
+ async abortUrlWrite (userId: number, uploadId: string): Promise {
+ const session = await this.#fsEntryRepository.getPendingEntryBySessionId(uploadId);
+ if ( ! session ) {
+ return;
+ }
+ if ( session.userId !== userId ) {
+ throw new HttpError(403, 'Upload session access denied');
+ }
+
+ try {
+ const bucket = session.bucket;
+ const bucketRegion = session.bucketRegion;
+ if ( bucket && bucketRegion ) {
+ if ( session.uploadMode === 'multipart' && session.multipartUploadId ) {
+ await this.#s3StorageProvider.abortMutipartUpload(
+ session.multipartUploadId,
+ bucketRegion,
+ bucket,
+ session.objectKey,
+ );
+ } else {
+ await this.#s3StorageProvider.deleteObject(bucket, session.objectKey, bucketRegion);
+ }
+ }
+ } finally {
+ await this.#fsEntryRepository.abortPendingEntry(session.sessionId, 'Upload aborted by caller');
+ }
+ }
+
+ async write (
+ userId: number,
+ writeRequest: WriteRequest,
+ uploadTracker?: UploadProgressTrackerLike,
+ storageAllowanceMax?: number,
+ ): Promise {
+
+ let normalizedInput = this.#normalizeWriteInput(userId, writeRequest.fileMetadata);
+ const [resolvedTarget] = await this.#resolveWriteTargets(userId, [{
+ index: 0,
+ normalizedInput,
+ }]);
+ if ( ! resolvedTarget ) {
+ throw new Error('Failed to resolve write target');
+ }
+ normalizedInput = resolvedTarget.normalizedInput;
+ const existingEntry = resolvedTarget.existingEntry;
+ const requestedThumbnail = writeRequest.thumbnailData ?? normalizedInput.thumbnail ?? null;
+ normalizedInput.thumbnail = null;
+
+ const existingSize = existingEntry?.size ?? 0;
+ await this.#assertStorageAllowance(userId, normalizedInput.size, existingSize, storageAllowanceMax);
+
+ const uploadBody = await this.#toUploadBody(
+ writeRequest.fileContent,
+ writeRequest.encoding,
+ uploadTracker,
+ );
+ const objectKey = existingEntry?.uuid ?? uuidv4();
+ await this.#s3StorageProvider.uploadFromServer({
+ bucket: normalizedInput.bucket,
+ objectKey,
+ contentType: normalizedInput.contentType,
+ body: uploadBody.body,
+ ...(uploadBody.contentLength !== undefined ? { contentLength: uploadBody.contentLength } : {}),
+ ...(Number.isFinite(normalizedInput.size)
+ ? { sizeHint: normalizedInput.size }
+ : {}),
+ }, normalizedInput.bucketRegion);
+
+ const uploadedSize = uploadBody.uploadedSize();
+ if ( uploadTracker ) {
+ const currentTrackedSize = Number(uploadTracker.progress ?? 0);
+ if ( uploadedSize > currentTrackedSize ) {
+ uploadTracker.add(uploadedSize - currentTrackedSize);
+ }
+ }
+ if ( uploadedSize > normalizedInput.size ) {
+ await this.#assertStorageAllowance(userId, uploadedSize, existingSize, storageAllowanceMax);
+ }
+ normalizedInput.size = uploadedSize;
+ const contentHashSha256 = uploadBody.finalizeContentHashSha256
+ ? uploadBody.finalizeContentHashSha256()
+ : uploadBody.contentHashSha256;
+
+ const createInput = this.#toCreateInput(normalizedInput, objectKey);
+ const fsEntry = await this.#fsEntryRepository.createEntry(
+ createInput,
+ normalizedInput.createMissingParents,
+ );
+
+ return {
+ fsEntry,
+ wasOverwrite: Boolean(existingEntry),
+ requestedThumbnail,
+ contentHashSha256,
+ };
+ }
+
+ async batchWrites (
+ userId: number,
+ writeRequests: WriteRequest[],
+ storageAllowanceMax?: number,
+ ): Promise {
+ if ( writeRequests.length === 0 ) {
+ return [];
+ }
+ const preparedBatch = await this.prepareBatchWrites(
+ userId,
+ writeRequests.map((writeRequest) => ({
+ fileMetadata: writeRequest.fileMetadata,
+ thumbnailData: writeRequest.thumbnailData,
+ guiMetadata: writeRequest.guiMetadata,
+ })),
+ storageAllowanceMax,
+ );
+ await this.assertStorageAllowanceForPreparedBatch(preparedBatch, undefined, storageAllowanceMax);
+
+ const uploadResults = await runWithConcurrencyLimitSettled(
+ writeRequests,
+ 8,
+ async (writeRequest, index) => {
+ return this.uploadPreparedBatchItem({
+ preparedBatch,
+ itemIndex: index,
+ fileContent: writeRequest.fileContent,
+ encoding: writeRequest.encoding,
+ });
+ },
+ );
+ const uploadedItems = uploadResults
+ .filter((result): result is PromiseFulfilledResult => result.status === 'fulfilled')
+ .map((result) => result.value);
+ const failedUpload = uploadResults.find((result) => result.status === 'rejected');
+ if ( failedUpload?.status === 'rejected' ) {
+ await this.#cleanupPreparedBatchUploads(preparedBatch, uploadedItems);
+ throw this.#toError(failedUpload.reason, 'Failed to upload batch write item');
+ }
+
+ return this.finalizePreparedBatchWrites(preparedBatch, uploadedItems);
+ }
+
+ async cleanupPreparedBatchUploads (
+ preparedBatch: PreparedBatchWrite,
+ uploadedItems: UploadedBatchWriteItem[],
+ ): Promise {
+ await this.#cleanupPreparedBatchUploads(preparedBatch, uploadedItems);
+ }
+
+ async updateEntryThumbnail (
+ userId: number,
+ entryUuid: string,
+ thumbnail: string | null,
+ ): Promise {
+ if ( typeof entryUuid !== 'string' || entryUuid.length === 0 ) {
+ throw new HttpError(400, 'Invalid file entry identifier for thumbnail update');
+ }
+
+ return this.#fsEntryRepository.updateEntryThumbnailByUuidForUser(
+ userId,
+ entryUuid,
+ thumbnail,
+ );
+ }
+
+ async getUsersStorageAllowance (userId: string | number): Promise<{ curr: number; max: number }> {
+ const numericUserId = typeof userId === 'string' ? Number(userId) : userId;
+ if ( Number.isNaN(numericUserId) ) {
+ throw new HttpError(400, 'Invalid user id');
+ }
+ return this.#fsEntryRepository.getUserStorageAllowance(numericUserId);
+ }
+}
diff --git a/extensions/fsv2/src/services/types.ts b/extensions/fsv2/src/services/types.ts
new file mode 100644
index 0000000000..e3651959eb
--- /dev/null
+++ b/extensions/fsv2/src/services/types.ts
@@ -0,0 +1,76 @@
+import type { Readable } from 'node:stream';
+import type { FSEntry, FSEntryWriteInput } from '../types/FSEntry.js';
+import type { WriteGuiMetadata, WriteRequest } from '../types/requests.js';
+
+export interface NormalizedWriteInput {
+ userId: number;
+ path: string;
+ size: number;
+ contentType: string;
+ checksumSha256: string | undefined;
+ metadata: string | Record | null | undefined;
+ thumbnail: string | null | undefined;
+ associatedAppId: number | null | undefined;
+ overwrite: boolean;
+ dedupeName: boolean;
+ createMissingParents: boolean;
+ immutable: boolean;
+ isPublic: boolean | null | undefined;
+ multipartPartSize: number | undefined;
+ bucket: string;
+ bucketRegion: string;
+}
+
+export interface UploadPayload {
+ body: Buffer | Uint8Array | string | Readable;
+ contentLength?: number;
+ uploadedSize: () => number;
+ contentHashSha256: string | null;
+ finalizeContentHashSha256?: () => string | null;
+}
+
+export interface UploadProgressTrackerLike {
+ total: number;
+ progress: number;
+ setTotal: (total: number) => void;
+ add: (amount: number) => void;
+ subscribe?: (callback: (delta: number) => void) => unknown;
+}
+
+export interface BatchWritePrepareRequest {
+ fileMetadata: FSEntryWriteInput;
+ thumbnailData?: string;
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface PreparedBatchWriteItem {
+ index: number;
+ normalizedInput: NormalizedWriteInput;
+ existingEntry: FSEntry | null;
+ objectKey: string;
+ wasOverwrite: boolean;
+ requestedThumbnail: string | null | undefined;
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface PreparedBatchWrite {
+ userId: number;
+ items: PreparedBatchWriteItem[];
+ itemsByIndex: Map;
+ storageAllowanceMax?: number;
+}
+
+export interface UploadedBatchWriteItem {
+ index: number;
+ objectKey: string;
+ uploadedSize: number;
+ contentHashSha256: string | null;
+}
+
+export interface UploadPreparedBatchItemInput {
+ preparedBatch: PreparedBatchWrite;
+ itemIndex: number;
+ fileContent: WriteRequest['fileContent'];
+ encoding?: WriteRequest['encoding'];
+ uploadTracker?: UploadProgressTrackerLike;
+}
diff --git a/extensions/fsv2/src/types/FSEntry.ts b/extensions/fsv2/src/types/FSEntry.ts
new file mode 100644
index 0000000000..bb7a8c0b6a
--- /dev/null
+++ b/extensions/fsv2/src/types/FSEntry.ts
@@ -0,0 +1,109 @@
+export interface FSEntry {
+ id: number;
+ uuid: string;
+ uid: string;
+ userId: number;
+ parentId: number | null;
+ parentUid: string | null;
+ path: string;
+ name: string;
+ isDir: boolean;
+ bucket: string | null;
+ bucketRegion: string | null;
+ publicToken: string | null;
+ fileRequestToken: string | null;
+ isShortcut: boolean;
+ shortcutTo: number | null;
+ associatedAppId: number | null;
+ layout: string | null;
+ sortBy: 'name' | 'modified' | 'type' | 'size' | null;
+ sortOrder: 'asc' | 'desc' | null;
+ isPublic: boolean | null;
+ thumbnail: string | null;
+ immutable: boolean;
+ metadata: string | null;
+ modified: number;
+ created: number | null;
+ accessed: number | null;
+ size: number | null;
+ symlinkPath: string | null;
+ isSymlink: boolean;
+}
+
+export interface FSEntryWriteInput {
+ path: string;
+ size: number;
+ contentType?: string;
+ checksumSha256?: string;
+ metadata?: string | Record | null;
+ thumbnail?: string | null;
+ associatedAppId?: number | null;
+ overwrite?: boolean;
+ dedupeName?: boolean;
+ createMissingParents?: boolean;
+ immutable?: boolean;
+ isPublic?: boolean | null;
+ multipartPartSize?: number;
+ bucket?: string;
+ bucketRegion?: string;
+}
+
+export interface FSEntryCreateInput extends FSEntryWriteInput {
+ userId: number;
+ uuid: string;
+}
+
+export interface PendingUploadSession {
+ id: number;
+ sessionId: string;
+ userId: number;
+ appId: number | null;
+ parentUid: string;
+ parentPath: string;
+ targetName: string;
+ targetPath: string;
+ overwriteTargetUid: string | null;
+ contentType: string;
+ size: number;
+ checksumSha256: string | null;
+ uploadMode: 'single' | 'multipart';
+ multipartUploadId: string | null;
+ multipartPartSize: number | null;
+ multipartPartCount: number | null;
+ storageProvider: string;
+ bucket: string | null;
+ bucketRegion: string | null;
+ objectKey: string;
+ status: string;
+ failureReason: string | null;
+ metadataJson: string | null;
+ createdAt: number;
+ updatedAt: number;
+ expiresAt: number;
+ consumedAt: number | null;
+ completedAt: number | null;
+}
+
+export interface PendingUploadCreateInput {
+ sessionId: string;
+ userId: number;
+ appId: number | null;
+ parentUid: string;
+ parentPath: string;
+ targetName: string;
+ targetPath: string;
+ overwriteTargetUid: string | null;
+ contentType: string;
+ size: number;
+ checksumSha256: string | null;
+ uploadMode: 'single' | 'multipart';
+ multipartUploadId: string | null;
+ multipartPartSize: number | null;
+ multipartPartCount: number | null;
+ storageProvider: string;
+ bucket: string;
+ bucketRegion: string;
+ objectKey: string;
+ metadataJson: string;
+ expiresAt: number;
+}
diff --git a/extensions/fsv2/src/types/requests.ts b/extensions/fsv2/src/types/requests.ts
new file mode 100644
index 0000000000..59f2ef406b
--- /dev/null
+++ b/extensions/fsv2/src/types/requests.ts
@@ -0,0 +1,103 @@
+import { FSEntry, FSEntryWriteInput } from './FSEntry.js';
+import type { Readable } from 'node:stream';
+
+export type UploadMode = 'single' | 'multipart';
+
+export interface WriteGuiMetadata {
+ originalClientSocketId?: string;
+ socketId?: string;
+ operationId?: string;
+ itemUploadId?: string;
+}
+
+export interface ThumbnailUploadMetadata {
+ contentType: string;
+ size?: number;
+}
+
+export interface SignedWriteRequest {
+ fileMetadata: FSEntryWriteInput;
+ directory?: boolean;
+ uploadMode?: UploadMode | 'auto';
+ expiresInSeconds?: number;
+ thumbnailMetadata?: ThumbnailUploadMetadata;
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface SignedUploadPart {
+ partNumber: number;
+ url: string;
+}
+
+export interface SignedWriteResponse {
+ sessionId: string;
+ uploadMode: UploadMode;
+ objectKey: string;
+ bucket: string;
+ bucketRegion: string;
+ contentType: string;
+ expiresAt: number;
+ url?: string;
+ multipartUploadId?: string;
+ multipartPartSize?: number;
+ multipartPartCount?: number;
+ multipartPartUrls?: SignedUploadPart[];
+ directoryCreated?: boolean;
+ fsEntry?: FSEntry;
+ thumbnailUploadUrl?: string;
+ thumbnailUrl?: string;
+}
+
+export interface SignMultipartPartsRequest {
+ uploadId: string;
+ partNumbers: number[];
+ expiresInSeconds?: number;
+}
+
+export interface SignMultipartPartsResponse {
+ uploadId: string;
+ multipartUploadId: string;
+ objectKey: string;
+ bucket: string;
+ bucketRegion: string;
+ expiresAt: number;
+ multipartPartUrls: SignedUploadPart[];
+}
+
+export interface CompleteMultipartPart {
+ partNumber: number;
+ etag: string;
+}
+
+export interface CompleteWriteRequest {
+ uploadId: string;
+ thumbnailData?: string;
+ parts?: CompleteMultipartPart[];
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface CompleteWriteResponse {
+ sessionId: string;
+ fsEntry: FSEntry;
+ wasOverwrite: boolean;
+ requestedThumbnail?: string | null;
+}
+
+export interface BinaryPayload {
+ base64: string;
+}
+
+export interface WriteRequest {
+ fileMetadata: FSEntryWriteInput;
+ fileContent: Buffer | Readable | ReadableStream | string | Blob | File | Uint8Array | ArrayBuffer | BinaryPayload;
+ encoding?: 'utf8' | 'base64' | 'ascii' | 'latin1' | 'utf16le' | 'hex';
+ thumbnailData?: string;
+ guiMetadata?: WriteGuiMetadata;
+}
+
+export interface WriteResponse {
+ fsEntry: FSEntry;
+ wasOverwrite: boolean;
+ requestedThumbnail?: string | null;
+ contentHashSha256?: string | null;
+}
diff --git a/extensions/fsv2/src/utils/concurrency.ts b/extensions/fsv2/src/utils/concurrency.ts
new file mode 100644
index 0000000000..fa67445ad0
--- /dev/null
+++ b/extensions/fsv2/src/utils/concurrency.ts
@@ -0,0 +1,77 @@
+export async function runWithConcurrencyLimit (
+ values: TInput[],
+ concurrency: number,
+ worker: (value: TInput, index: number) => Promise,
+): Promise {
+ if ( values.length === 0 ) {
+ return [];
+ }
+
+ const limit = Math.max(1, concurrency);
+ const results = new Array(values.length);
+ let nextIndex = 0;
+
+ const runWorker = async () => {
+ while ( true ) {
+ const index = nextIndex;
+ if ( index >= values.length ) {
+ return;
+ }
+ nextIndex++;
+ const value = values[index];
+ if ( value === undefined ) {
+ throw new Error(`Missing value at index ${index}`);
+ }
+ results[index] = await worker(value, index);
+ }
+ };
+
+ const workerCount = Math.min(limit, values.length);
+ await Promise.all(Array.from({ length: workerCount }, () => runWorker()));
+ return results;
+}
+
+export async function runWithConcurrencyLimitSettled (
+ values: TInput[],
+ concurrency: number,
+ worker: (value: TInput, index: number) => Promise,
+): Promise[]> {
+ if ( values.length === 0 ) {
+ return [];
+ }
+
+ const limit = Math.max(1, concurrency);
+ const results = new Array>(values.length);
+ let nextIndex = 0;
+
+ const runWorker = async () => {
+ while ( true ) {
+ const index = nextIndex;
+ if ( index >= values.length ) {
+ return;
+ }
+ nextIndex++;
+ const value = values[index];
+ if ( value === undefined ) {
+ throw new Error(`Missing value at index ${index}`);
+ }
+
+ try {
+ const output = await worker(value, index);
+ results[index] = {
+ status: 'fulfilled',
+ value: output,
+ };
+ } catch ( error ) {
+ results[index] = {
+ status: 'rejected',
+ reason: error,
+ };
+ }
+ }
+ };
+
+ const workerCount = Math.min(limit, values.length);
+ await Promise.all(Array.from({ length: workerCount }, () => runWorker()));
+ return results;
+}
diff --git a/extensions/fsv2/tsconfig.json b/extensions/fsv2/tsconfig.json
new file mode 100644
index 0000000000..358d469bd3
--- /dev/null
+++ b/extensions/fsv2/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "removeComments": true,
+ "noEmitOnError": true,
+ "noImplicitAny": false,
+ "allowJs": true,
+ "checkJs": false,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/installedApps/package.json b/extensions/installedApps/package.json
new file mode 100644
index 0000000000..0f5a2f7cfc
--- /dev/null
+++ b/extensions/installedApps/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@puter/extension-controller",
+ "version": "1.0.0",
+ "description": "",
+ "main": "src/index.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@types/express": "^4.17.21",
+ "@types/node": "^24.9.1",
+ "ts-node": "^10.9.2",
+ "typescript": "^5.9.3"
+ },
+ "dependencies": {
+ "http-status-codes": "^2.3.0",
+ "stripe": "^19.1.0"
+ }
+}
\ No newline at end of file
diff --git a/extensions/installedApps/src/controllers/InstalledAppsController.ts b/extensions/installedApps/src/controllers/InstalledAppsController.ts
new file mode 100644
index 0000000000..c24062639f
--- /dev/null
+++ b/extensions/installedApps/src/controllers/InstalledAppsController.ts
@@ -0,0 +1,73 @@
+import type { BaseDatabaseAccessService } from '@heyputer/backend/src/services/database/BaseDatabaseAccessService.js';
+import { Request, Response } from 'express';
+import type { } from '../../../api.js';
+
+const { Controller, Get, ExtensionController, HttpError } = extension.import('extensionController');
+
+const getAppIconUrl = extension.import('core').util.helpers.get_app_icon_url;
+
+@Controller('/installedApps')
+export class InstalledAppsController extends ExtensionController {
+
+ static ALLOWED_ORDER_BY = ['id', 'name', 'uid', 'title', 'installed_at'];
+ static ORDER_BY_FIELD_MAP: Record = {
+ id: 'apps.id',
+ name: 'apps.name',
+ uid: 'apps.uid',
+ title: 'apps.title',
+ installed_at: 'installed_at',
+ };
+ #db: BaseDatabaseAccessService;
+ constructor (db: BaseDatabaseAccessService) {
+ super();
+ this.#db = db;
+ }
+
+ @Get('/', { subdomain: 'api' })
+ async getInstalledApps (req: Request, res: Response): Promise {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw new HttpError(401, 'actor not found in context');
+ }
+ if ( actor.type.app ) {
+ throw new HttpError(403, 'Apps are not allowed to access this resource');
+ }
+ req.query.orderBy ??= 'installed_at';
+ if ( ! InstalledAppsController.ALLOWED_ORDER_BY.includes(req.query.orderBy) ) {
+ throw new HttpError(400, `Invalid orderBy field. Allowed fields are: ${InstalledAppsController.ALLOWED_ORDER_BY.join(', ')}`);
+ }
+
+ const page = Math.max(req.query.page || 1, 1);
+ const limit = Math.min(Math.max(req.query.limit || 100, 1), 100);
+ const offset = (page - 1) * limit;
+ const orderByField = InstalledAppsController.ORDER_BY_FIELD_MAP[req.query.orderBy];
+ const sortDirection = req.query.desc ? 'DESC' : 'ASC';
+
+ const installedApps = await this.#db.read(
+ `SELECT
+ apps.name,
+ apps.uid,
+ apps.title,
+ apps.description,
+ apps.icon,
+ MIN(perm.dt) AS installed_at
+ FROM apps
+ LEFT JOIN user_to_app_permissions AS perm ON apps.id = perm.app_id
+ WHERE perm.user_id = ?
+ GROUP BY apps.id, apps.name, apps.uid, apps.title, apps.description
+ ORDER BY ${orderByField} ${sortDirection}
+ LIMIT ?
+ OFFSET ?`,
+ [actor.type.user.id, limit, offset],
+ ) as {
+ name: string;
+ uid: string;
+ title: string;
+ description: string;
+ installed_at: Date;
+ last_opened: Date | null;
+ }[];
+
+ res.send(installedApps.map((app) => ({ ...app, iconUrl: getAppIconUrl(app) })));
+ }
+}
diff --git a/extensions/installedApps/src/index.ts b/extensions/installedApps/src/index.ts
new file mode 100644
index 0000000000..859f22a103
--- /dev/null
+++ b/extensions/installedApps/src/index.ts
@@ -0,0 +1,5 @@
+import { InstalledAppsController } from './controllers/InstalledAppsController.js';
+
+const installedAppsController = new InstalledAppsController(extension.import('data').db);
+
+installedAppsController.registerRoutes();
\ No newline at end of file
diff --git a/extensions/installedApps/tsconfig.json b/extensions/installedApps/tsconfig.json
new file mode 100644
index 0000000000..c9cbd48a9b
--- /dev/null
+++ b/extensions/installedApps/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "noEmitOnError": true,
+ "noImplicitAny": false,
+ "allowJs": true,
+ "checkJs": false,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/jsconfig.json b/extensions/jsconfig.json
new file mode 100644
index 0000000000..c04279b518
--- /dev/null
+++ b/extensions/jsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "node16",
+ "moduleResolution": "node16",
+ "rootDir": ".",
+ "paths": {
+ "../src/*": [
+ "../src/*"
+ ]
+ },
+ "allowJs": true,
+ "checkJs": true
+ },
+ "include": [
+ "./**/*.js",
+ "./**/*.d.ts"
+, "../src/backend/src/deprecated/filesystem/PuterS3StorageStrategy.js" ]
+}
\ No newline at end of file
diff --git a/extensions/legacyFileSystem/PuterFSProvider.js b/extensions/legacyFileSystem/PuterFSProvider.js
new file mode 100644
index 0000000000..8fe9d65ede
--- /dev/null
+++ b/extensions/legacyFileSystem/PuterFSProvider.js
@@ -0,0 +1,1098 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+const STUCK_STATUS_TIMEOUT = 10 * 1000;
+const STUCK_ALARM_TIMEOUT = 20 * 1000;
+
+// Temporary limit
+const MAX_DIRECTORY_DEPTH = 35;
+
+import crypto from 'node:crypto';
+import path_ from 'node:path';
+import { v4 as uuidv4 } from 'uuid';
+
+const { db } = extension.import('data');
+
+const svc_metering = extension.import('service:meteringService');
+const svc_fs = extension.import('service:filesystem');
+const { stuck_detector_stream, hashing_stream } = extension.import('core').util.streamutil;
+
+// TODO: filesystem providers should not need to call EventService
+const svc_event = extension.import('service:event');
+
+// TODO: filesystem providers REALLY SHOULD NOT implement ACL logic!
+const svc_acl = extension.import('service:acl');
+
+// TODO: these services ought to be part of this extension
+const svc_size = extension.import('service:sizeService');
+const svc_resource = extension.import('service:resourceService');
+
+// TODO: depending on mountpoint service will not be necessary
+// once the storage provider is moved to this extension
+const svc_mountpoint = extension.import('service:mountpoint');
+
+const {
+ APIError,
+ Actor,
+ Context,
+ UserActorType,
+ TDetachable,
+ MultiDetachable,
+} = extension.import('core');
+
+const {
+ get_user,
+} = extension.import('core').util.helpers;
+
+const {
+ ParallelTasks,
+ getTracer,
+} = extension.import('core').util.otelutil;
+
+const {
+ TYPE_DIRECTORY,
+} = extension.import('core').fs;
+
+const {
+ NodeChildSelector,
+ NodeUIDSelector,
+ NodeInternalIDSelector,
+ NodeRawEntrySelector,
+} = extension.import('core').fs.selectors;
+
+const {
+ FSNodeContext,
+ capabilities,
+} = extension.import('fs');
+
+const {
+ // MODE_READ,
+ MODE_WRITE,
+} = extension.import('fs').lock;
+
+// ^ Yep I know, import('fs') and import('core').fs is confusing and
+// redundant... this will be cleaned up as the new API is developed
+
+const {
+ // MODE_READ,
+ RESOURCE_STATUS_PENDING_CREATE,
+} = extension.import('fs').resource;
+
+const {
+ UploadProgressTracker,
+} = extension.import('fs').util;
+
+export default class PuterFSProvider {
+ constructor ({ fsEntryController, storageController }) {
+ this.fsEntryController = fsEntryController;
+ this.storageController = storageController;
+ this.name = 'puterfs';
+ }
+
+ // #region depth limit helpers
+ /**
+ * Number of path segments (directory depth). Root or empty path = 0.
+ * @param {string} path
+ * @returns {number}
+ */
+ #pathDepth (path) {
+ if ( !path || typeof path !== 'string' ) return 0;
+ return path_.normalize(path).split(path_.sep).filter(Boolean).length;
+ }
+
+ /**
+ * Max relative depth of the source tree (0 for a file, 1+ for directory tree).
+ * Used to enforce MAX_DIRECTORY_DEPTH when moving or copying.
+ * @param {FSNode} node
+ * @returns {Promise}
+ */
+ async #getSourceTreeMaxRelativeDepth (node) {
+ await node.fetchEntry();
+ if ( ! node.entry.is_dir ) return 0;
+ const child_uuids = await this.fsEntryController.fast_get_direct_descendants(await node.get('uid'));
+ let max = 0;
+ for ( const child_uuid of child_uuids ) {
+ const child_node = await svc_fs.node(new NodeUIDSelector(child_uuid));
+ const child_relative = 1 + await this.#getSourceTreeMaxRelativeDepth(child_node);
+ max = Math.max(max, child_relative);
+ }
+ return max;
+ }
+
+ /**
+ * Throws if destination depth plus source tree depth would exceed MAX_DIRECTORY_DEPTH.
+ * @param {number} destinationPathDepth
+ * @param {FSNode} sourceNode
+ */
+ async #assertDepthLimitForTreeOp (destinationPathDepth, sourceNode) {
+ const source_relative = await this.#getSourceTreeMaxRelativeDepth(sourceNode);
+ const max_depth = destinationPathDepth + source_relative;
+ if ( max_depth > MAX_DIRECTORY_DEPTH ) {
+ throw APIError.create('directory_depth_limit_exceeded', null, {
+ limit: MAX_DIRECTORY_DEPTH,
+ would_be: max_depth,
+ });
+ }
+ }
+ // #endregion
+
+ // TODO: should this be a static member instead?
+ get_capabilities () {
+ return new Set([
+ capabilities.THUMBNAIL,
+ capabilities.UPDATE_THUMBNAIL,
+ capabilities.UUID,
+ capabilities.OPERATION_TRACE,
+ capabilities.READDIR_UUID_MODE,
+ capabilities.READDIRSTAT_UUID,
+ capabilities.PUTER_SHORTCUT,
+
+ capabilities.COPY_TREE,
+ capabilities.GET_RECURSIVE_SIZE,
+
+ capabilities.READ,
+ capabilities.WRITE,
+ capabilities.CASE_SENSITIVE,
+ capabilities.SYMLINK,
+ capabilities.TRASH,
+ ]);
+ }
+
+ // #region PuterOnly
+ async update_thumbnail ({ context, node, thumbnail }) {
+ const {
+ actor: inputActor,
+ } = context.values;
+ const actor = inputActor ?? Context.get('actor');
+
+ context = context ?? Context.get();
+ const services = context.get('services');
+
+ // TODO: this ACL check should not be here, but there's no LL method yet
+ // and it's possible we will never implement the thumbnail
+ // capability for any other filesystem type
+
+ const svc_acl = services.get('acl');
+ if ( ! await svc_acl.check(actor, node, 'write') ) {
+ throw await svc_acl.get_safe_acl_error(actor, node, 'write');
+ }
+
+ const uid = await node.get('uid');
+
+ const entryOp = await this.fsEntryController.update(uid, {
+ thumbnail,
+ });
+
+ (async () => {
+ await entryOp.awaitDone();
+ svc_event.emit('fs.write.file', {
+ node,
+ context,
+ });
+ })();
+
+ return node;
+ }
+
+ async puter_shortcut ({ parent, name, user, target }) {
+ const user_id = user?.id ?? Context.get('actor')?.type?.user?.id;
+ await target.fetchEntry({ thumbnail: true });
+
+ const ts = Math.round(Date.now() / 1000);
+ const uid = uuidv4();
+
+ svc_resource.register({
+ uid,
+ status: RESOURCE_STATUS_PENDING_CREATE,
+ });
+
+ const raw_fsentry = {
+ is_shortcut: 1,
+ shortcut_to: target.mysql_id,
+ is_dir: target.entry.is_dir,
+ thumbnail: target.entry.thumbnail,
+ uuid: uid,
+ parent_uid: await parent.get('uid'),
+ path: path_.join(await parent.get('path'), name),
+ user_id: user_id,
+ name,
+ created: ts,
+ updated: ts,
+ modified: ts,
+ immutable: false,
+ };
+
+ const entryOp = await this.fsEntryController.insert(raw_fsentry);
+
+ (async () => {
+ await entryOp.awaitDone();
+ svc_resource.free(uid);
+ })();
+
+ const node = await svc_fs.node(new NodeUIDSelector(uid));
+
+ svc_event.emit('fs.create.shortcut', {
+ node,
+ context: Context.get(),
+ });
+
+ return node;
+ }
+ // #endregion
+
+ // #region Optimization
+ /**
+ * The readdirstat_uuid operation is only available for filesystem
+ * immplementations with READDIR_UUID_MODE enabled. This implements
+ * an optimized readdir operation when the UUID is already known.
+ * @param {*} param0
+ */
+ async readdirstat_uuid ({
+ uuid,
+ options = {},
+ }) {
+ const entries = await this.fsEntryController.get_descendants_full(uuid, options);
+ const nodes = Promise.all(Array.prototype.map.call(entries, raw_entry => {
+ const node = svc_fs.node(new NodeRawEntrySelector(raw_entry, {
+ found_thumbnail: options.thumbnail,
+ }));
+ node.found = true; // TODO: how is it possible for this to be false?
+ return node;
+ }));
+ return nodes;
+ };
+ // #endregion
+
+ // #region Standard FS
+
+ /**
+ * Check if a given node exists.
+ *
+ * @param {Object} param
+ * @param {NodeSelector} param.selector - The selector used for checking.
+ * @returns {Promise} - True if the node exists, false otherwise.
+ */
+ async quick_check ({
+ selector,
+ }) {
+ // shortcut: has full path
+ if ( selector?.path ) {
+ const entry = await this.fsEntryController.findByPath(selector.path);
+ return Boolean(entry);
+ }
+
+ // shortcut: has uid
+ if ( selector?.uid ) {
+ const entry = await this.fsEntryController.findByUID(selector.uid);
+ return Boolean(entry);
+ }
+
+ // shortcut: parent uid + child name
+ if ( selector instanceof NodeChildSelector && selector.parent instanceof NodeUIDSelector ) {
+ return await this.fsEntryController.nameExistsUnderParent(
+ selector.parent.uid,
+ selector.name,
+ );
+ }
+
+ // shortcut: parent id + child name
+ if ( selector instanceof NodeChildSelector && selector.parent instanceof NodeInternalIDSelector ) {
+ return await this.fsEntryController.nameExistsUnderParentID(
+ selector.parent.id,
+ selector.name,
+ );
+ }
+
+ return false;
+ }
+
+ async unlink ({ context, node, options = {} }) {
+ if ( await node.get('type') === TYPE_DIRECTORY ) {
+ throw new APIError(409, 'Cannot unlink a directory.');
+ }
+
+ await this.#rmnode({ context, node, options });
+ }
+
+ async rmdir ({ context, node, options = {} }) {
+ if ( await node.get('type') !== TYPE_DIRECTORY ) {
+ throw new APIError(409, 'Cannot rmdir a file.');
+ }
+
+ if ( await node.get('immutable') ) {
+ throw APIError.create('immutable');
+ }
+
+ const children = await this.fsEntryController.fast_get_direct_descendants(await node.get('uid'));
+
+ if ( children.length > 0 && !options.ignore_not_empty ) {
+ throw APIError.create('not_empty');
+ }
+
+ await this.#rmnode({ context, node, options });
+ }
+
+ /**
+ * Create a new directory.
+ *
+ * @param {Object} param
+ * @param {Context} param.context
+ * @param {FSNode} param.parent
+ * @param {string} param.name
+ * @param {boolean} param.immutable
+ * @returns {Promise}
+ */
+ async mkdir ({ context, parent, name, immutable }) {
+ const { actor, thumbnail } = context.values;
+
+ const ts = Math.round(Date.now() / 1000);
+ const uid = uuidv4();
+
+ const existing = await svc_fs.node(new NodeChildSelector(parent.selector, name));
+
+ if ( await existing.exists() ) {
+ throw APIError.create('item_with_same_name_exists', null, {
+ entry_name: name,
+ });
+ }
+
+ if ( ! await parent.exists() ) {
+ throw APIError.create('subject_does_not_exist');
+ }
+
+ const new_path = path_.join(await parent.get('path'), name);
+ if ( this.#pathDepth(new_path) > MAX_DIRECTORY_DEPTH ) {
+ throw APIError.create('directory_depth_limit_exceeded', null, {
+ limit: MAX_DIRECTORY_DEPTH,
+ would_be: this.#pathDepth(new_path),
+ });
+ }
+
+ svc_resource.register({
+ uid,
+ status: RESOURCE_STATUS_PENDING_CREATE,
+ });
+
+ const raw_fsentry = {
+ is_dir: 1,
+ uuid: uid,
+ parent_uid: await parent.get('uid'),
+ path: path_.join(await parent.get('path'), name),
+ user_id: actor.type.user.id,
+ name,
+ created: ts,
+ accessed: ts,
+ modified: ts,
+ immutable: immutable ?? false,
+ ...(thumbnail ? {
+ thumbnail: thumbnail,
+ } : {}),
+ };
+
+ const entryOp = await this.fsEntryController.insert(raw_fsentry);
+
+ await entryOp.awaitDone();
+ svc_resource.free(uid);
+
+ const node = await svc_fs.node(new NodeUIDSelector(uid));
+
+ svc_event.emit('fs.create.directory', {
+ node,
+ context: Context.get(),
+ });
+
+ return node;
+ }
+
+ async read ({ context, node, version_id, range }) {
+ const svc_mountpoint = context.get('services').get('mountpoint');
+ const storage = svc_mountpoint.get_storage(this.constructor.name);
+ const location = await node.get('s3:location') ?? {};
+ const stream = (await storage.create_read_stream(await node.get('uid'), {
+ // TODO: fs:decouple-s3
+ bucket: location.bucket,
+ bucket_region: location.bucket_region,
+ version_id,
+ key: location.key,
+ memory_file: node.entry,
+ ...(range ? { range } : {}),
+ }));
+ return stream;
+ }
+
+ async stat ({
+ selector,
+ options,
+ controls,
+ node,
+ }) {
+ // For Puter FS nodes, we assume we will obtain all properties from
+ // fsEntryController, except for 'thumbnail' unless it's
+ // explicitly requested.
+
+ if ( options.tracer == null ) {
+ options.tracer = getTracer();
+ }
+
+ if ( options.op ) {
+ options.trace_options = {
+ parent: options.op.span,
+ };
+ }
+
+ let entry;
+
+ // stat doesn't work with RawEntrySelector
+ if ( selector instanceof NodeRawEntrySelector ) {
+ selector = new NodeUIDSelector(node.uid);
+ }
+
+ await new Promise (rslv => {
+ const detachables = new MultiDetachable();
+
+ const callback = (_resolver) => {
+ detachables.as(TDetachable).detach();
+ rslv();
+ };
+
+ // either the resource is free
+ {
+ // no detachale because waitForResource returns a
+ // Promise that will be resolved when the resource
+ // is free no matter what, and then it will be
+ // garbage collected.
+ svc_resource.waitForResource(selector).then(callback.bind(null, 'resourceService'));
+ }
+
+ // or pending information about the resource
+ // becomes available
+ {
+ // detachable is needed here because waitForEntry keeps
+ // a map of listeners in memory, and this event may
+ // never occur. If this never occurs, waitForResource
+ // is guaranteed to resolve eventually, and then this
+ // detachable will be detached by `callback` so the
+ // listener can be garbage collected.
+ const det = this.fsEntryController.waitForEntry(node, callback.bind(null, 'fsEntryService'));
+ if ( det ) detachables.add(det);
+ }
+ });
+
+ const maybe_uid = node.uid;
+ if ( svc_resource.getResourceInfo(maybe_uid) ) {
+ entry = await this.fsEntryController.get(maybe_uid, options);
+ controls.log.debug('got an entry from the future');
+ } else {
+ entry = await this.fsEntryController.find(selector, options);
+ }
+
+ if ( ! entry ) {
+ if ( this.log_fsentriesNotFound ) {
+ controls.log.warn(`entry not found: ${selector.describe(true)}`);
+ }
+ }
+
+ if ( entry === null || typeof entry !== 'object' ) {
+ return null;
+ }
+
+ if ( entry.id ) {
+ controls.provide_selector(new NodeInternalIDSelector('mysql', entry.id, {
+ source: 'FSNodeContext optimization',
+ }));
+ }
+
+ return entry;
+ }
+
+ async copy_tree ({ context, source, parent, target_name }) {
+ // Context
+ const actor = (context ?? Context).get('actor');
+ const user = actor.type.user;
+
+ const tracer = getTracer();
+ const uuid = uuidv4();
+ const timestamp = Math.round(Date.now() / 1000);
+ await parent.fetchEntry();
+ await source.fetchEntry({ thumbnail: true });
+
+ const destination_path = path_.join(await parent.get('path'), target_name);
+ await this.#assertDepthLimitForTreeOp(this.#pathDepth(destination_path), source);
+
+ // New filesystem entry
+ const raw_fsentry = {
+ uuid,
+ is_dir: source.entry.is_dir,
+ ...(source.entry.is_shortcut ? {
+ is_shortcut: source.entry.is_shortcut,
+ shortcut_to: source.entry.shortcut_to,
+ } : {}),
+ parent_uid: parent.uid,
+ name: target_name,
+ created: timestamp,
+ modified: timestamp,
+
+ path: path_.join(await parent.get('path'), target_name),
+
+ // if property exists but the value is undefined,
+ // it will still be included in the INSERT, causing
+ // an error
+ ...(source.entry.thumbnail ?
+ { thumbnail: source.entry.thumbnail } : {}),
+
+ user_id: user.id,
+ };
+
+ svc_event.emit('fs.pending.file', {
+ fsentry: FSNodeContext.sanitize_pending_entry_info(raw_fsentry),
+ context: context,
+ });
+
+ if ( await source.get('has-s3') ) {
+ Object.assign(raw_fsentry, {
+ size: source.entry.size,
+ associated_app_id: source.entry.associated_app_id,
+ bucket: source.entry.bucket,
+ bucket_region: source.entry.bucket_region,
+ });
+
+ await tracer.startActiveSpan('fs:cp:storage-copy', async span => {
+ let progress_tracker = new UploadProgressTracker();
+
+ svc_event.emit('fs.storage.progress.copy', {
+ upload_tracker: progress_tracker,
+ context,
+ meta: {
+ item_uid: uuid,
+ item_path: raw_fsentry.path,
+ },
+ });
+
+ const storage = context.get('storage');
+ const state_copy = storage.create_copy();
+ await state_copy.run({
+ src_node: source,
+ dst_storage: {
+ key: uuid,
+ bucket: raw_fsentry.bucket,
+ bucket_region: raw_fsentry.bucket_region,
+ },
+ storage_api: { progress_tracker },
+ });
+
+ span.end();
+ });
+ }
+
+ {
+ await svc_size.add_node_size(undefined, source, user);
+ }
+
+ svc_resource.register({
+ uid: uuid,
+ status: RESOURCE_STATUS_PENDING_CREATE,
+ });
+
+ const entryOp = await this.fsEntryController.insert(raw_fsentry);
+
+ let node;
+
+ const tasks = new ParallelTasks({ tracer, max: 4 });
+ await context.arun('fs:cp:parallel-portion', async () => {
+ // Add child copy tasks if this is a directory
+ if ( source.entry.is_dir ) {
+ const children = await this.fsEntryController.fast_get_direct_descendants(source.uid);
+ for ( const child_uuid of children ) {
+ tasks.add('fs:cp:copy-child', async () => {
+ const child_node = await svc_fs.node(new NodeUIDSelector(child_uuid));
+ const child_name = await child_node.get('name');
+
+ await this.copy_tree({
+ context,
+ source: await svc_fs.node(new NodeUIDSelector(child_uuid)),
+ parent: await svc_fs.node(new NodeUIDSelector(uuid)),
+ target_name: child_name,
+ });
+ });
+ }
+ }
+
+ // Add task to await entry
+ tasks.add('fs:cp:entry-op', async () => {
+ await entryOp.awaitDone();
+ svc_resource.free(uuid);
+ const copy_fsNode = await svc_fs.node(new NodeUIDSelector(uuid));
+ copy_fsNode.entry = raw_fsentry;
+ copy_fsNode.found = true;
+ copy_fsNode.path = raw_fsentry.path;
+
+ node = copy_fsNode;
+
+ svc_event.emit('fs.create.file', {
+ node,
+ context,
+ });
+ }, { force: true });
+
+ await tasks.awaitAll();
+ });
+
+ node = node || await svc_fs.node(new NodeUIDSelector(uuid));
+
+ // TODO: What event do we emit? How do we know if we're overwriting?
+ return node;
+ }
+
+ async move ({ context, node, new_parent, new_name, metadata }) {
+ const old_path = await node.get('path');
+ const new_path = path_.join(await new_parent.get('path'), new_name);
+
+ await this.#assertDepthLimitForTreeOp(this.#pathDepth(new_path), node);
+
+ const op_update = await this.fsEntryController.update(node.uid, {
+ ...(
+ await node.get('parent_uid') !== await new_parent.get('uid')
+ ? { parent_uid: await new_parent.get('uid') }
+ : {}
+ ),
+ path: new_path,
+ name: new_name,
+ ...(metadata ? { metadata } : {}),
+ });
+
+ node.entry.name = new_name;
+ node.entry.path = new_path;
+
+ // NOTE: this is a safeguard passed to update_child_paths to isolate
+ // changes to the owner's directory tree, ut this may need to be
+ // removed in the future.
+ const user_id = await node.get('user_id');
+
+ await op_update.awaitDone();
+
+ await svc_fs.update_child_paths(old_path, node.entry.path, user_id);
+
+ const promises = [];
+ promises.push(svc_event.emit('fs.move.file', {
+ context,
+ moved: node,
+ old_path,
+ }));
+ promises.push(svc_event.emit('fs.rename', {
+ uid: await node.get('uid'),
+ new_name,
+ }));
+
+ return node;
+ }
+
+ async readdir ({ node }) {
+ const uuid = await node.get('uid');
+ const child_uuids = await this.fsEntryController.fast_get_direct_descendants(uuid);
+ return child_uuids;
+ }
+
+ async directory_has_name ({ parent, name }) {
+ const uid = await parent.get('uid');
+
+ let check_dupe = await db.read(
+ 'SELECT `id` FROM `fsentries` WHERE `parent_uid` = ? AND name = ? LIMIT 1',
+ [uid, name],
+ );
+
+ return !!check_dupe[0];
+ }
+
+ /**
+ * Write a new file to the filesystem. Throws an error if the destination
+ * already exists.
+ *
+ * @param {Object} param
+ * @param {Context} param.context
+ * @param {FSNode} param.parent: The parent directory of the file.
+ * @param {string} param.name: The name of the file.
+ * @param {File} param.file: The file to write.
+ * @returns {Promise}
+ */
+ async write_new ({ context, parent, name, file }) {
+ const {
+ tmp, fsentry_tmp, message, actor: inputActor, app_id,
+ } = context.values;
+ const actor = inputActor ?? Context.get('actor');
+
+ const uid = uuidv4();
+
+ // determine bucket region
+ let bucket_region = global_config.s3_region ?? global_config.region ?? 'us-west-2';
+ let bucket = global_config.s3_bucket ?? 'puter-local';
+
+ if ( ! await svc_acl.check(actor, parent, 'write') ) {
+ throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
+ }
+
+ const storage_resp = await this.#storage_upload({
+ uuid: uid,
+ bucket,
+ bucket_region,
+ file,
+ tmp: {
+ ...tmp,
+ path: path_.join(await parent.get('path'), name),
+ },
+ });
+
+ fsentry_tmp.thumbnail = await fsentry_tmp.thumbnail_promise;
+ delete fsentry_tmp.thumbnail_promise;
+
+ const timestamp = Math.round(Date.now() / 1000);
+ const raw_fsentry = {
+ uuid: uid,
+ is_dir: 0,
+ user_id: actor.type.user.id,
+ created: timestamp,
+ accessed: timestamp,
+ modified: timestamp,
+ parent_uid: await parent.get('uid'),
+ name,
+ size: file.size,
+ path: path_.join(await parent.get('path'), name),
+ ...fsentry_tmp,
+ bucket_region,
+ bucket,
+ associated_app_id: app_id ?? null,
+ };
+
+ svc_event.emit('fs.pending.file', {
+ fsentry: FSNodeContext.sanitize_pending_entry_info(raw_fsentry),
+ context,
+ });
+
+ svc_resource.register({
+ uid,
+ status: RESOURCE_STATUS_PENDING_CREATE,
+ });
+
+ const filesize = file.size;
+ svc_size.change_usage(actor.type.user.id, filesize);
+
+ // Meter ingress
+ const ownerId = await parent.get('user_id');
+ const ownerActor = new Actor({
+ type: new UserActorType({
+ user: await get_user({ id: ownerId }),
+ }),
+ });
+
+ svc_metering.incrementUsage(ownerActor, 'filesystem:ingress:bytes', filesize);
+
+ const entryOp = await this.fsEntryController.insert(raw_fsentry);
+
+ (async () => {
+ await entryOp.awaitDone();
+ svc_resource.free(uid);
+
+ const new_item_node = await svc_fs.node(new NodeUIDSelector(uid));
+ const new_item = await new_item_node.get('entry');
+ const store_version_id = storage_resp.VersionId;
+ if ( store_version_id ) {
+ // insert version into db
+ db.write(
+ 'INSERT INTO `fsentry_versions` (`user_id`, `fsentry_id`, `fsentry_uuid`, `version_id`, `message`, `ts_epoch`) VALUES (?, ?, ?, ?, ?, ?)',
+ [
+ actor.type.user.id,
+ new_item.id,
+ new_item.uuid,
+ store_version_id,
+ message ?? null,
+ timestamp,
+ ],
+ );
+ }
+ })();
+
+ const node = await svc_fs.node(new NodeUIDSelector(uid));
+
+ svc_event.emit('fs.create.file', {
+ node,
+ context,
+ });
+
+ return node;
+ }
+
+ /**
+ * Overwrite an existing file. Throws an error if the destination does not
+ * exist.
+ *
+ * @param {Object} param
+ * @param {Context} param.context
+ * @param {FSNodeContext} param.node: The node to write to.
+ * @param {File} param.file: The file to write.
+ * @returns {Promise}
+ */
+ async write_overwrite ({ context, node, file }) {
+ const {
+ tmp, fsentry_tmp, message, actor: inputActor,
+ } = context.values;
+ const actor = inputActor ?? Context.get('actor');
+
+ if ( ! await svc_acl.check(actor, node, 'write') ) {
+ throw await svc_acl.get_safe_acl_error(actor, node, 'write');
+ }
+
+ const uid = await node.get('uid');
+
+ const bucket_region = node.entry.bucket_region;
+ const bucket = node.entry.bucket;
+
+ const state_upload = await this.#storage_upload({
+ uuid: node.entry.uuid,
+ bucket,
+ bucket_region,
+ file,
+ tmp: {
+ ...tmp,
+ path: await node.get('path'),
+ },
+ });
+
+ if ( fsentry_tmp?.thumbnail_promise ) {
+ fsentry_tmp.thumbnail = await fsentry_tmp.thumbnail_promise;
+ delete fsentry_tmp.thumbnail_promise;
+ }
+
+ const ts = Math.round(Date.now() / 1000);
+ const raw_fsentry_delta = {
+ modified: ts,
+ accessed: ts,
+ size: file.size,
+ ...fsentry_tmp,
+ };
+
+ svc_resource.register({
+ uid,
+ status: RESOURCE_STATUS_PENDING_CREATE,
+ });
+
+ const filesize = file.size;
+ svc_size.change_usage(actor.type.user.id, filesize);
+
+ // Meter ingress
+ const ownerId = await node.get('user_id');
+ const ownerActor = new Actor({
+ type: new UserActorType({
+ user: await get_user({ id: ownerId }),
+ }),
+ });
+ svc_metering.incrementUsage(ownerActor, 'filesystem:ingress:bytes', filesize);
+
+ const entryOp = await this.fsEntryController.update(uid, raw_fsentry_delta);
+
+ // depends on fsentry, does not depend on S3
+ const entryOpPromise = (async () => {
+ await entryOp.awaitDone();
+ svc_resource.free(uid);
+ })();
+
+ (async () => {
+ await entryOpPromise;
+ svc_event.emit('fs.write.file', {
+ node,
+ context,
+ });
+ })();
+
+ // TODO (xiaochen): determine if this can be removed, post_insert handler need
+ // to skip events from other servers (why? 1. current write logic is inside
+ // the local server 2. broadcast system conduct "fire-and-forget" behavior)
+ state_upload.post_insert({
+ db, user: actor.type.user, node, uid, message, ts,
+ });
+
+ return node;
+ }
+
+ async get_recursive_size ({ node }) {
+ const uuid = await node.get('uid');
+ const cte_query = `
+ WITH RECURSIVE descendant_cte AS (
+ SELECT uuid, parent_uid, size
+ FROM fsentries
+ WHERE parent_uid = ?
+
+ UNION ALL
+
+ SELECT f.uuid, f.parent_uid, f.size
+ FROM fsentries f
+ INNER JOIN descendant_cte d
+ ON f.parent_uid = d.uuid
+ )
+ SELECT SUM(size) AS total_size FROM descendant_cte
+ `;
+ const rows = await db.read(cte_query, [uuid]);
+ return rows[0].total_size;
+ }
+
+ // #endregion
+
+ // #region internal
+
+ /**
+ * @param {Object} param
+ * @param {File} param.file: The file to write.
+ * @returns
+ */
+ async #storage_upload ({
+ uuid,
+ bucket,
+ bucket_region,
+ file,
+ tmp,
+ }) {
+ const storage = svc_mountpoint.get_storage(this.constructor.name);
+
+ bucket ??= global_config.s3_bucket;
+ bucket_region ??= global_config.s3_region ?? global_config.region;
+
+ let upload_tracker = new UploadProgressTracker();
+
+ svc_event.emit('fs.storage.upload-progress', {
+ upload_tracker,
+ context: Context.get(),
+ meta: {
+ item_uid: uuid,
+ item_path: tmp.path,
+ },
+ });
+
+ if ( ! file.buffer ) {
+ let stream = file.stream;
+ let alarm_timeout = null;
+ stream = stuck_detector_stream(stream, {
+ timeout: STUCK_STATUS_TIMEOUT,
+ on_stuck: () => {
+ console.warn('Upload stream stuck might be stuck', {
+ bucket_region,
+ bucket,
+ uuid,
+ });
+ alarm_timeout = setTimeout(() => {
+ extension.errors.report('fs.write.s3-upload', {
+ message: 'Upload stream stuck for too long',
+ alarm: true,
+ extra: {
+ bucket_region,
+ bucket,
+ uuid,
+ },
+ });
+ }, STUCK_ALARM_TIMEOUT);
+ },
+ on_unstuck: () => {
+ clearTimeout(alarm_timeout);
+ },
+ });
+ file = { ...file, stream };
+ }
+
+ let hashPromise;
+ if ( file.buffer ) {
+ const hash = crypto.createHash('sha256');
+ hash.update(file.buffer);
+ hashPromise = Promise.resolve(hash.digest('hex'));
+ } else {
+ const hs = hashing_stream(file.stream);
+ file.stream = hs.stream;
+ hashPromise = hs.hashPromise;
+ }
+
+ hashPromise.then(hash => {
+ svc_event.emit('outer.fs.write-hash', {
+ hash, uuid,
+ });
+ });
+
+ const state_upload = storage.create_upload();
+
+ try {
+ await this.storageController.upload({
+ uid: uuid,
+ file,
+ storage_meta: { bucket, bucket_region },
+ storage_api: { progress_tracker: upload_tracker },
+ });
+ } catch (e) {
+ extension.errors.report('fs.write.storage-upload', {
+ source: e || new Error('unknown'),
+ trace: true,
+ alarm: true,
+ extra: {
+ bucket_region,
+ bucket,
+ uuid,
+ },
+ });
+ throw APIError.create('upload_failed');
+ }
+
+ return state_upload;
+ }
+
+ async #rmnode ({ node, options }) {
+ // Services
+ if ( !options.override_immutable && await node.get('immutable') ) {
+ throw new APIError(403, 'File is immutable.');
+ }
+
+ const userId = await node.get('user_id');
+ const fileSize = await node.get('size');
+ svc_size.change_usage(
+ userId,
+ -1 * fileSize,
+ );
+
+ const ownerActor = new Actor({
+ type: new UserActorType({
+ user: await get_user({ id: userId }),
+ }),
+ });
+
+ svc_metering.incrementUsage(ownerActor, 'filesystem:delete:bytes', fileSize);
+
+ const tracer = getTracer();
+ const tasks = new ParallelTasks({ tracer, max: 4 });
+
+ tasks.add('remove-fsentry', async () => {
+ await this.fsEntryController.delete(await node.get('uid'));
+ });
+
+ if ( await node.get('has-s3') ) {
+ tasks.add('remove-from-s3', async () => {
+ const storage = Context.get('storage');
+ const state_delete = storage.create_delete();
+ await state_delete.run({
+ node: node,
+ });
+ });
+ }
+
+ await tasks.awaitAll();
+ }
+ // #endregion
+}
diff --git a/extensions/legacyFileSystem/fsentries/BaseOperation.js b/extensions/legacyFileSystem/fsentries/BaseOperation.js
new file mode 100644
index 0000000000..a59c2df825
--- /dev/null
+++ b/extensions/legacyFileSystem/fsentries/BaseOperation.js
@@ -0,0 +1,31 @@
+import { TeePromise } from 'teepromise';
+
+export default class BaseOperation {
+ static STATUS_PENDING = {};
+ static STATUS_RUNNING = {};
+ static STATUS_DONE = {};
+
+ /** @type {PromiseLike & { resolve: () => void }} */
+ #donePromise;
+
+ constructor () {
+ this.status_ = this.constructor.STATUS_PENDING;
+ this.#donePromise = new TeePromise();
+ }
+ get status () {
+ return this.status_;
+ }
+ set status (status) {
+ this.status_ = status;
+ if ( status === this.constructor.STATUS_DONE ) {
+ this.#donePromise.resolve();
+ }
+ }
+ async awaitDone () {
+ await this.#donePromise;
+ }
+ async onComplete (fn) {
+ await this.#donePromise;
+ fn();
+ }
+}
diff --git a/extensions/legacyFileSystem/fsentries/Delete.js b/extensions/legacyFileSystem/fsentries/Delete.js
new file mode 100644
index 0000000000..a8dcdad91f
--- /dev/null
+++ b/extensions/legacyFileSystem/fsentries/Delete.js
@@ -0,0 +1,18 @@
+import BaseOperation from './BaseOperation.js';
+
+export default class extends BaseOperation {
+ constructor (uuid) {
+ super();
+ this.uuid = uuid;
+ }
+
+ getStatement () {
+ const statement = 'DELETE FROM fsentries WHERE uuid = ? LIMIT 1';
+ const values = [this.uuid];
+ return { statement, values };
+ }
+
+ apply (answer) {
+ answer.entry = null;
+ }
+}
diff --git a/extensions/legacyFileSystem/fsentries/FSEntryController.js b/extensions/legacyFileSystem/fsentries/FSEntryController.js
new file mode 100644
index 0000000000..0ce5b3802f
--- /dev/null
+++ b/extensions/legacyFileSystem/fsentries/FSEntryController.js
@@ -0,0 +1,610 @@
+import { TeePromise } from 'teepromise';
+import BaseOperation from './BaseOperation.js';
+import Delete from './Delete.js';
+import Insert from './Insert.js';
+import Update from './Update.js';
+
+const { db } = extension.import('data');
+const svc_params = extension.import('service:params');
+
+const { PuterPath } = extension.import('fs');
+
+const {
+ RootNodeSelector,
+ NodeChildSelector,
+ NodeUIDSelector,
+ NodePathSelector,
+ NodeInternalIDSelector,
+} = extension.import('core').fs.selectors;
+
+export default class FSEntryController {
+ static CONCERN = 'filesystem';
+
+ static STATUS_READY = {};
+ static STATUS_RUNNING_JOB = {};
+
+ constructor () {
+ this.status = FSEntryController.STATUS_READY;
+
+ this.currentState = {
+ queue: [],
+ updating_uuids: {},
+ };
+ this.deferredState = {
+ queue: [],
+ updating_uuids: {},
+ };
+
+ this.entryListeners_ = {};
+
+ this.mkPromiseForQueueSize_();
+
+ // this list of properties is for read operations
+ // (originally in FSEntryFetcher)
+ this.defaultProperties = [
+ 'id',
+ 'associated_app_id',
+ 'uuid',
+ 'public_token',
+ 'bucket',
+ 'bucket_region',
+ 'file_request_token',
+ 'user_id',
+ 'parent_uid',
+ 'is_dir',
+ 'is_public',
+ 'is_shortcut',
+ 'is_symlink',
+ 'symlink_path',
+ 'shortcut_to',
+ 'sort_by',
+ 'sort_order',
+ 'immutable',
+ 'name',
+ 'metadata',
+ 'modified',
+ 'created',
+ 'accessed',
+ 'size',
+ 'layout',
+ 'path',
+ ];
+
+ this.subdomainProperties = [
+ 'uuid',
+ 'subdomain',
+ ];
+ }
+
+ init () {
+ svc_params.createParameters('fsentry-service', [
+ {
+ id: 'max_queue',
+ description: 'Maximum queue size',
+ default: 50,
+ },
+ ], this);
+
+ }
+
+ mkPromiseForQueueSize_ () {
+ this.queueSizePromise = new Promise((resolve, reject) => {
+ this.queueSizeResolve = resolve;
+ });
+ }
+
+ // #region write operations
+ async insert (entry) {
+ const op = new Insert(entry);
+ await this.enqueue_(op);
+ return op;
+ }
+
+ async update (uuid, entry) {
+ const op = new Update(uuid, entry);
+ await this.enqueue_(op);
+ return op;
+ }
+
+ async delete (uuid) {
+ const op = new Delete(uuid);
+ await this.enqueue_(op);
+ return op;
+ }
+ // #endregion
+
+ // #region read operations
+ async fast_get_descendants (uuid) {
+ return (await db.read(`
+ WITH RECURSIVE descendant_cte AS (
+ SELECT uuid, parent_uid
+ FROM fsentries
+ WHERE parent_uid = ?
+
+ UNION ALL
+
+ SELECT f.uuid, f.parent_uid
+ FROM fsentries f
+ INNER JOIN descendant_cte d ON f.parent_uid = d.uuid
+ )
+ SELECT uuid FROM descendant_cte
+ `, [uuid])).map(x => x.uuid);
+ }
+
+ async fast_get_direct_descendants (uuid) {
+ return (uuid === PuterPath.NULL_UUID
+ ? await db.read('SELECT uuid FROM fsentries WHERE parent_uid IS NULL')
+ : await db.read(
+ 'SELECT uuid FROM fsentries WHERE parent_uid = ?',
+ [uuid],
+ )).map(x => x.uuid);
+ }
+
+ waitForEntry (node, callback) {
+ // *** uncomment to debug slow waits ***
+ // console.log('ATTEMPT TO WAIT FOR', selector.describe())
+ let selector = node.get_selector_of_type(NodeUIDSelector);
+ if ( selector === null ) {
+ // console.log(new Error('========'));
+ return;
+ }
+
+ const entry_already_enqueued =
+ Object.prototype.hasOwnProperty.call(this.currentState.updating_uuids, selector.value) ||
+ Object.prototype.hasOwnProperty.call(this.deferredState.updating_uuids, selector.value) ;
+
+ if ( entry_already_enqueued ) {
+ callback();
+ return;
+ }
+
+ const k = `uid:${selector.value}`;
+ if ( ! Object.prototype.hasOwnProperty.call(this.entryListeners_, k) ) {
+ this.entryListeners_[k] = [];
+ }
+
+ const det = {
+ detach: () => {
+ const i = this.entryListeners_[k].indexOf(callback);
+ if ( i === -1 ) return;
+ this.entryListeners_[k].splice(i, 1);
+ if ( this.entryListeners_[k].length === 0 ) {
+ delete this.entryListeners_[k];
+ }
+ },
+ };
+
+ this.entryListeners_[k].push(callback);
+
+ return det;
+ }
+
+ async get (uuid, fetch_entry_options) {
+ const answer = {};
+ for ( const op of this.currentState.queue ) {
+ if ( op.uuid != uuid ) continue;
+ op.apply(answer);
+ }
+ for ( const op of this.deferredState.queue ) {
+ if ( op.uuid != uuid ) continue;
+ op.apply(answer);
+ op.apply(answer);
+ }
+ if ( answer.is_diff ) {
+ const base_entry = await this.find(
+ new NodeUIDSelector(uuid),
+ fetch_entry_options,
+ );
+ answer.entry = { ...base_entry, ...answer.entry };
+ }
+ return answer.entry;
+ }
+
+ /**
+ * Returns UUIDs of child fsentries under the specified
+ * parent fsentry
+ * @param {string} uuid - UUID of parent fsentry
+ * @returns fsentry[]
+ */
+ async get_descendants (uuid) {
+ return uuid === PuterPath.NULL_UUID
+ ? await db.read(
+ 'SELECT uuid FROM fsentries WHERE parent_uid IS NULL',
+ [uuid],
+ )
+ : await db.read(
+ 'SELECT uuid FROM fsentries WHERE parent_uid = ?',
+ [uuid],
+ )
+ ;
+ }
+
+ /**
+ * Returns full fsentry nodes for entries under the specified
+ * parent fsentry
+ * @param {string} uuid - UUID of parent fsentry
+ * @returns fsentry[]
+ */
+ async get_descendants_full (uuid, fetch_entry_options) {
+ const { thumbnail } = fetch_entry_options;
+ const columns = `${
+ [
+ ...this.defaultProperties.map(v => `f.${v}`),
+ ...this.subdomainProperties
+ .map(v => `s.${v} AS subdomain_${v}`),
+ ].join(', ')
+ }${thumbnail ? ', thumbnail' : ''}`;
+ const results_with_dupes = uuid === PuterPath.NULL_UUID
+ ? await db.read(
+ `SELECT ${columns} FROM fsentries WHERE parent_uid IS NULL`,
+ [uuid],
+ )
+ : await db.read(
+ `SELECT ${columns} FROM fsentries AS f ` +
+ 'LEFT JOIN subdomains AS s ON f.id=s.root_dir_id ' +
+ 'WHERE parent_uid = ? ORDER BY f.id',
+ [uuid],
+ )
+ ;
+
+ const byId = new Map();
+ for ( const row of results_with_dupes ) {
+ const id = row.id;
+ let entry = byId.get(id);
+ if ( ! entry ) {
+ entry = { ...row };
+ if ( thumbnail ) entry.thumbnail = row.thumbnail;
+ entry.subdomains = [];
+ byId.set(id, entry);
+ }
+ if ( row.subdomain_uuid != null ) {
+ entry.subdomains.push({
+ uuid: row.subdomain_uuid,
+ subdomain: row.subdomain_subdomain,
+ });
+ }
+ }
+ return Array.from(byId.values());
+ }
+
+ async get_recursive_size (uuid) {
+ const cte_query = `
+ WITH RECURSIVE descendant_cte AS (
+ SELECT uuid, parent_uid, size
+ FROM fsentries
+ WHERE parent_uid = ?
+
+ UNION ALL
+
+ SELECT f.uuid, f.parent_uid, f.size
+ FROM fsentries f
+ INNER JOIN descendant_cte d
+ ON f.parent_uid = d.uuid
+ )
+ SELECT SUM(size) AS total_size FROM descendant_cte
+ `;
+ const rows = await db.read(cte_query, [uuid]);
+ return rows[0].total_size;
+ }
+
+ /**
+ * Finds a filesystem entry using the provided selector.
+ * @param {Object} selector - The selector object specifying how to find the entry
+ * @param {Object} fetch_entry_options - Options for fetching the entry
+ * @returns {Promise} The filesystem entry or null if not found
+ */
+ async find (selector, fetch_entry_options) {
+ if ( selector instanceof RootNodeSelector ) {
+ return selector.entry;
+ }
+ if ( selector instanceof NodePathSelector ) {
+ return await this.findByPath(selector.value, fetch_entry_options);
+ }
+ if ( selector instanceof NodeUIDSelector ) {
+ return await this.findByUID(selector.value, fetch_entry_options);
+ }
+ if ( selector instanceof NodeInternalIDSelector ) {
+ return await this.findByID(selector.id, fetch_entry_options);
+ }
+ if ( selector instanceof NodeChildSelector ) {
+ let id;
+
+ if ( selector.parent instanceof RootNodeSelector ) {
+ id = await this.findNameInRoot(selector.name);
+ } else {
+ const parentEntry = await this.find(selector.parent);
+ if ( ! parentEntry ) return null;
+ id = await this.findNameInParent(parentEntry.uuid, selector.name);
+ }
+
+ if ( id === undefined ) return null;
+ if ( typeof id !== 'number' ) {
+ throw new Error(
+ 'unexpected type for id value',
+ typeof id,
+ id,
+ );
+ }
+ return this.find(new NodeInternalIDSelector('mysql', id));
+ }
+ }
+
+ /**
+ * Finds a filesystem entry by its UUID.
+ * @param {string} uuid - The UUID of the entry to find
+ * @param {Object} fetch_entry_options - Options including thumbnail flag
+ * @returns {Promise} The filesystem entry or undefined if not found
+ */
+ async findByUID (uuid, fetch_entry_options = {}) {
+ const { thumbnail } = fetch_entry_options;
+
+ let fsentry = await db.tryHardRead(
+ `SELECT ${
+ this.defaultProperties.join(', ')
+ }${thumbnail ? ', thumbnail' : ''
+ } FROM fsentries WHERE uuid = ? LIMIT 1`,
+ [uuid],
+ );
+
+ return fsentry[0];
+ }
+
+ /**
+ * Finds a filesystem entry by its internal database ID.
+ * @param {number} id - The internal ID of the entry to find
+ * @param {Object} fetch_entry_options - Options including thumbnail flag
+ * @returns {Promise} The filesystem entry or undefined if not found
+ */
+ async findByID (id, fetch_entry_options = {}) {
+ const { thumbnail } = fetch_entry_options;
+
+ let fsentry = await db.tryHardRead(
+ `SELECT ${
+ this.defaultProperties.join(', ')
+ }${thumbnail ? ', thumbnail' : ''
+ } FROM fsentries WHERE id = ? LIMIT 1`,
+ [id],
+ );
+
+ return fsentry[0];
+ }
+
+ /**
+ * Finds a filesystem entry by its full path.
+ * @param {string} path - The full path of the entry to find
+ * @param {Object} fetch_entry_options - Options including thumbnail flag and tracer
+ * @returns {Promise} The filesystem entry or false if not found
+ */
+ async findByPath (path, fetch_entry_options = {}) {
+ const { thumbnail } = fetch_entry_options;
+
+ if ( path === '/' ) {
+ return this.find(new RootNodeSelector());
+ }
+
+ const parts = path.split('/').filter(path => path !== '');
+ if ( parts.length === 0 ) {
+ // TODO: invalid path; this should be an error
+ return false;
+ }
+
+ // TODO: use a closure table for more efficient path resolving
+ let parent_uid = null;
+ let result;
+
+ const resultColsSql = this.defaultProperties.join(', ') +
+ (thumbnail ? ', thumbnail' : '');
+
+ result = await db.read(
+ `SELECT ${ resultColsSql
+ } FROM fsentries WHERE path=? LIMIT 1`,
+ [path],
+ );
+
+ // using knex instead
+
+ if ( result[0] ) return result[0];
+
+ const loop = async () => {
+ for ( let i = 0 ; i < parts.length ; i++ ) {
+ const part = parts[i];
+ const isLast = i == parts.length - 1;
+ const colsSql = isLast ? resultColsSql : 'uuid';
+ if ( parent_uid === null ) {
+ result = await db.read(
+ `SELECT ${ colsSql
+ } FROM fsentries WHERE parent_uid IS NULL AND name=? LIMIT 1`,
+ [part],
+ );
+ } else {
+ result = await db.read(
+ `SELECT ${ colsSql
+ } FROM fsentries WHERE parent_uid=? AND name=? LIMIT 1`,
+ [parent_uid, part],
+ );
+ }
+
+ if ( ! result[0] ) return false;
+ parent_uid = result[0].uuid;
+ }
+ };
+
+ if ( fetch_entry_options.tracer ) {
+ const tracer = fetch_entry_options.tracer;
+ const options = fetch_entry_options.trace_options;
+ await tracer.startActiveSpan(
+ 'fs:sql:findByPath',
+ ...(options ? [options] : []),
+ async span => {
+ await loop();
+ span.end();
+ },
+ );
+ } else {
+ await loop();
+ }
+
+ return result[0];
+ }
+
+ /**
+ * Finds the ID of a child entry with the given name in the root directory.
+ * @param {string} name - The name of the child entry to find
+ * @returns {Promise} The ID of the child entry or undefined if not found
+ */
+ async findNameInRoot (name) {
+ let child_id = await db.read(
+ 'SELECT `id` FROM `fsentries` WHERE `parent_uid` IS NULL AND name = ? LIMIT 1',
+ [name],
+ );
+ return child_id[0]?.id;
+ }
+
+ /**
+ * Finds the ID of a child entry with the given name under a specific parent.
+ * @param {string} parent_uid - The UUID of the parent directory
+ * @param {string} name - The name of the child entry to find
+ * @returns {Promise} The ID of the child entry or undefined if not found
+ */
+ async findNameInParent (parent_uid, name) {
+ let child_id = await db.read(
+ 'SELECT `id` FROM `fsentries` WHERE `parent_uid` = ? AND name = ? LIMIT 1',
+ [parent_uid, name],
+ );
+ return child_id[0]?.id;
+ }
+
+ /**
+ * Checks if an entry with the given name exists under a specific parent.
+ * @param {string} parent_uid - The UUID of the parent directory
+ * @param {string} name - The name to check for
+ * @returns {Promise} True if the name exists under the parent, false otherwise
+ */
+ async nameExistsUnderParent (parent_uid, name) {
+ let check_dupe = await db.read(
+ 'SELECT `id` FROM `fsentries` WHERE `parent_uid` = ? AND name = ? LIMIT 1',
+ [parent_uid, name],
+ );
+ return !!check_dupe[0];
+ }
+
+ /**
+ * Checks if an entry with the given name exists under a parent specified by ID.
+ * @param {number} parent_id - The internal ID of the parent directory
+ * @param {string} name - The name to check for
+ * @returns {Promise} True if the name exists under the parent, false otherwise
+ */
+ async nameExistsUnderParentID (parent_id, name) {
+ const parent = await this.findByID(parent_id);
+ if ( ! parent ) {
+ return false;
+ }
+ return this.nameExistsUnderParent(parent.uuid, name);
+ }
+ // #endregion
+
+ // #region queue logic
+ async enqueue_ (op) {
+ const tp = new TeePromise();
+ while (
+ this.currentState.queue.length > this.max_queue ||
+ this.deferredState.queue.length > this.max_queue
+ ) {
+ await this.queueSizePromise;
+ }
+
+ if ( ! (op instanceof BaseOperation) ) {
+ throw new Error('Invalid operation');
+ }
+
+ const state = this.status === FSEntryController.STATUS_READY ?
+ this.currentState : this.deferredState;
+
+ if ( ! Object.prototype.hasOwnProperty.call(state.updating_uuids, op.uuid) ) {
+ state.updating_uuids[op.uuid] = [];
+ }
+ state.updating_uuids[op.uuid].push(state.queue.length);
+
+ state.queue.push(op);
+
+ // DRY: same pattern as FSOperationContext:provideValue
+ // DRY: same pattern as FSOperationContext:rejectValue
+ if ( Object.prototype.hasOwnProperty.call(this.entryListeners_, op.uuid) ) {
+ const listeners = this.entryListeners_[op.uuid];
+
+ delete this.entryListeners_[op.uuid];
+
+ for ( const lis of listeners ) lis();
+ }
+
+ this.checkShouldExec_();
+
+ await op.awaitDone();
+ }
+
+ checkShouldExec_ () {
+ if ( this.status !== FSEntryController.STATUS_READY ) return;
+ if ( this.currentState.queue.length === 0 ) return;
+ this.exec_();
+ }
+
+ async exec_ () {
+ if ( this.status !== FSEntryController.STATUS_READY ) {
+ throw new Error('Duplicate exec_ call');
+ }
+
+ const queue = this.currentState.queue;
+
+ this.status = FSEntryController.STATUS_RUNNING_JOB;
+
+ // const conn = await db_primary.promise().getConnection();
+ // await conn.beginTransaction();
+
+ for ( const op of queue ) {
+ op.status = op.constructor.STATUS_RUNNING;
+ // await conn.execute(stmt, values);
+ }
+
+ // await conn.commit();
+ // conn.release();
+
+ // const stmtAndVals = queue.map(op => op.getStatementAndValues());
+ // const stmts = stmtAndVals.map(x => x.stmt).join('; ');
+ // const vals = stmtAndVals.reduce((acc, x) => acc.concat(x.values), []);
+
+ // *** uncomment to debug batch queries ***
+ // this.log.debug({ stmts, vals });
+ // console.log('<<========================');
+ // console.log({ stmts, vals });
+ // console.log('>>========================');
+
+ // this.log.debug('array?', Array.isArray(vals))
+
+ await db.batch_write(queue.map(op => op.getStatement()));
+
+ for ( const op of queue ) {
+ op.status = op.constructor.STATUS_DONE;
+ }
+
+ this.flipState_();
+ this.status = FSEntryController.STATUS_READY;
+
+ for ( const op of queue ) {
+ op.status = op.constructor.STATUS_DONE;
+ }
+
+ this.checkShouldExec_();
+ }
+
+ flipState_ () {
+ this.currentState = this.deferredState;
+ this.deferredState = {
+ queue: [],
+ updating_uuids: {},
+ };
+ const queueSizeResolve = this.queueSizeResolve;
+ this.mkPromiseForQueueSize_();
+ queueSizeResolve();
+ }
+ // #endregion
+}
diff --git a/extensions/legacyFileSystem/fsentries/Insert.js b/extensions/legacyFileSystem/fsentries/Insert.js
new file mode 100644
index 0000000000..f072b2d78e
--- /dev/null
+++ b/extensions/legacyFileSystem/fsentries/Insert.js
@@ -0,0 +1,72 @@
+import { safeHasOwnProperty } from '../lib/objectfn.js';
+import BaseOperation from './BaseOperation.js';
+
+export default class extends BaseOperation {
+ static requiredForCreate = [
+ 'uuid',
+ 'parent_uid',
+ ];
+
+ static allowedForCreate = [
+ ...this.requiredForCreate,
+ 'name',
+ 'user_id',
+ 'is_dir',
+ 'created',
+ 'modified',
+ 'immutable',
+ 'shortcut_to',
+ 'is_shortcut',
+ 'metadata',
+ 'bucket',
+ 'bucket_region',
+ 'thumbnail',
+ 'accessed',
+ 'size',
+ 'symlink_path',
+ 'is_symlink',
+ 'associated_app_id',
+ 'path',
+ ];
+
+ constructor (entry) {
+ super();
+ const requiredForCreate = this.constructor.requiredForCreate;
+ const allowedForCreate = this.constructor.allowedForCreate;
+
+ {
+ const sanitized_entry = {};
+ for ( const k of allowedForCreate ) {
+ if ( safeHasOwnProperty(entry, k) ) {
+ sanitized_entry[k] = entry[k];
+ }
+ }
+ entry = sanitized_entry;
+ }
+
+ for ( const k of requiredForCreate ) {
+ if ( ! safeHasOwnProperty(entry, k) ) {
+ throw new Error(`Missing required property: ${k}`);
+ }
+ }
+
+ this.entry = entry;
+ }
+
+ getStatement () {
+ const fields = Object.keys(this.entry);
+ const statement = 'INSERT INTO fsentries ' +
+ `(${fields.join(', ')}) ` +
+ `VALUES (${fields.map(() => '?').join(', ')})`;
+ const values = fields.map(k => this.entry[k]);
+ return { statement, values };
+ }
+
+ apply (answer) {
+ answer.entry = { ...this.entry };
+ }
+
+ get uuid () {
+ return this.entry.uuid;
+ }
+};
diff --git a/extensions/legacyFileSystem/fsentries/Update.js b/extensions/legacyFileSystem/fsentries/Update.js
new file mode 100644
index 0000000000..6b778705b2
--- /dev/null
+++ b/extensions/legacyFileSystem/fsentries/Update.js
@@ -0,0 +1,52 @@
+import { safeHasOwnProperty } from '../lib/objectfn.js';
+import BaseOperation from './BaseOperation.js';
+
+export default class extends BaseOperation {
+ static allowedForUpdate = [
+ 'name',
+ 'parent_uid',
+ 'user_id',
+ 'modified',
+ 'shortcut_to',
+ 'metadata',
+ 'thumbnail',
+ 'size',
+ 'path',
+ ];
+
+ constructor (uuid, entry) {
+ super();
+ const allowedForUpdate = this.constructor.allowedForUpdate;
+
+ {
+ const sanitized_entry = {};
+ for ( const k of allowedForUpdate ) {
+ if ( safeHasOwnProperty(entry, k) ) {
+ sanitized_entry[k] = entry[k];
+ }
+ }
+ entry = sanitized_entry;
+ }
+
+ this.uuid = uuid;
+ this.entry = entry;
+ }
+
+ getStatement () {
+ const fields = Object.keys(this.entry);
+ const statement = 'UPDATE fsentries SET ' +
+ `${fields.map(k => `${k} = ?`).join(', ')} ` +
+ 'WHERE uuid = ? LIMIT 1';
+ const values = fields.map(k => this.entry[k]);
+ values.push(this.uuid);
+ return { statement, values };
+ }
+
+ apply (answer) {
+ if ( ! answer.entry ) {
+ answer.is_diff = true;
+ answer.entry = {};
+ }
+ Object.assign(answer.entry, this.entry);
+ }
+};
diff --git a/extensions/legacyFileSystem/lib/objectfn.js b/extensions/legacyFileSystem/lib/objectfn.js
new file mode 100644
index 0000000000..f32f7dcab1
--- /dev/null
+++ b/extensions/legacyFileSystem/lib/objectfn.js
@@ -0,0 +1,16 @@
+/**
+ * Instead of `myObject.hasOwnProperty(k)`, always write:
+ * `safeHasOwnProperty(myObject, k)`.
+ *
+ * This is a less verbose way to call `Object.prototype.hasOwnProperty.call`.
+ * This prevents unexpected behavior when `hasOwnProperty` is overridden,
+ * which is especially possible for objects parsed from user-sent JSON.
+ *
+ * explanation: https://eslint.org/docs/latest/rules/no-prototype-builtins
+ * @param {*} o
+ * @param {...any} a
+ * @returns
+ */
+export const safeHasOwnProperty = (o, ...a) => {
+ return Object.prototype.hasOwnProperty.call(o, ...a);
+};
diff --git a/extensions/legacyFileSystem/main.js b/extensions/legacyFileSystem/main.js
new file mode 100644
index 0000000000..f35f7bd44e
--- /dev/null
+++ b/extensions/legacyFileSystem/main.js
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+import FSEntryController from './fsentries/FSEntryController.js';
+import PuterFSProvider from './PuterFSProvider.js';
+import ProxyStorageController from './storage/ProxyStorageController.js';
+import S3StorageController from './storage/S3StorageController.js';
+
+const svc_event = extension.import('service:event');
+
+const fsEntryController = new FSEntryController();
+const storageController = new ProxyStorageController();
+
+extension.on('init', async () => {
+ fsEntryController.init();
+
+ // Keep track of possible storage strategies for puterfs here
+ let defaultStorage = 'S3';
+ const storageStrategies = {
+ 'S3': new S3StorageController(),
+ };
+
+ // Emit the "create storage strategies" event
+ const event = {
+ createStorageStrategy (name, implementation) {
+ storageStrategies[name] = implementation;
+ if ( implementation === undefined ) {
+ throw new Error('createStorageStrategy was called wrong');
+ }
+ if ( implementation.forceDefault ) {
+ defaultStorage = name;
+ }
+ },
+ };
+ // Awaiting the event ensures all the storage strategies are registered
+ await svc_event.emit('puterfs.storage.create', event);
+
+ let configuredStorage = defaultStorage;
+ if ( config.storage ) configuredStorage = config.storage;
+
+ // Not we can select the configured strategy
+ const storageToUse = storageStrategies[configuredStorage];
+ storageController.setDelegate(storageToUse);
+
+ // The StorageController may need to await some asynchronous operations
+ // before it's ready to be used.
+ await storageController.init();
+
+});
+
+extension.on('create.filesystem-types', event => {
+ const fsProvider = new PuterFSProvider({
+ fsEntryController,
+ storageController,
+ });
+ event.createFilesystemType('puterfs', {
+ mount ({ path }) {
+ return fsProvider;
+ },
+ });
+});
diff --git a/extensions/legacyFileSystem/package-lock.json b/extensions/legacyFileSystem/package-lock.json
new file mode 100644
index 0000000000..c591897231
--- /dev/null
+++ b/extensions/legacyFileSystem/package-lock.json
@@ -0,0 +1,32 @@
+{
+ "name": "puterfs",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "teepromise": "^0.1.1",
+ "uuid": "^13.0.0"
+ }
+ },
+ "node_modules/teepromise": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/teepromise/-/teepromise-0.1.1.tgz",
+ "integrity": "sha512-BS++sfQYjtOdPvBCb3sd0mNYfPcZKFjSx1yA85Yz/BAAQ3jyZAINd5iB7p70Z8D0Q4XElRwKaa4/lPEP4EHyiw==",
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
+ "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
+ }
+ }
+ }
+}
diff --git a/extensions/legacyFileSystem/package.json b/extensions/legacyFileSystem/package.json
new file mode 100644
index 0000000000..6f920af14b
--- /dev/null
+++ b/extensions/legacyFileSystem/package.json
@@ -0,0 +1,9 @@
+{
+ "main": "main.js",
+ "type": "module",
+ "dependencies": {
+ "teepromise": "^0.1.1",
+ "uuid": "^13.0.0",
+ "@aws-sdk/client-s3": "^3.1021.0"
+ }
+}
diff --git a/extensions/legacyFileSystem/storage/ProxyStorageController.js b/extensions/legacyFileSystem/storage/ProxyStorageController.js
new file mode 100644
index 0000000000..1627c18381
--- /dev/null
+++ b/extensions/legacyFileSystem/storage/ProxyStorageController.js
@@ -0,0 +1,24 @@
+export default class {
+ constructor (delegate) {
+ this.delegate = delegate ?? null;
+ }
+ setDelegate (delegate) {
+ this.delegate = delegate;
+ }
+
+ init (...a) {
+ return this.delegate.init(...a);
+ }
+ upload (...a) {
+ return this.delegate.upload(...a);
+ }
+ copy (...a) {
+ return this.delegate.copy(...a);
+ }
+ delete (...a) {
+ return this.delegate.delete(...a);
+ }
+ read (...a) {
+ return this.delegate.read(...a);
+ }
+}
diff --git a/extensions/legacyFileSystem/storage/S3StorageController.js b/extensions/legacyFileSystem/storage/S3StorageController.js
new file mode 100644
index 0000000000..0f34be6c3b
--- /dev/null
+++ b/extensions/legacyFileSystem/storage/S3StorageController.js
@@ -0,0 +1,397 @@
+import { AbortMultipartUploadCommand, CompleteMultipartUploadCommand, CopyObjectCommand, CreateMultipartUploadCommand, DeleteObjectCommand, GetObjectCommand, PutObjectCommand, UploadPartCommand, UploadPartCopyCommand } from '@aws-sdk/client-s3';
+import { Readable } from 'stream';
+import { TeePromise } from 'teepromise';
+
+const { s3ClientProvider } = extension.import('data');
+
+const { Context } = extension.import('core');
+
+const {
+ chunk_stream,
+} = extension.import('core').util.streamutil;
+
+const {
+ simple_retry,
+} = extension.import('core').util.retryutil;
+
+const {
+ EWMA,
+} = extension.import('core').util.opmath;
+
+export default class S3StorageController {
+ forceDefault = true;
+ async init () {
+ this.clients_ = {};
+ this.config = global_config;
+
+ this.global_average_S3_part_time = new EWMA({
+ initial: 4000, // average from local testing
+ alpha: 0.1,
+ });
+ }
+
+ #get_client (region) {
+
+ return s3ClientProvider.get(region);
+ }
+
+ async upload ({ uid, file, storage_meta, storage_api }) {
+ const { progress_tracker } = storage_api;
+
+ const {
+ bucket_region,
+ bucket,
+ } = storage_meta;
+
+ const client = this.#get_client(bucket_region);
+
+ if ( file.buffer ) {
+ const [s3_error, s3_eventual_success, _s3_resp] = await simple_retry(async () => {
+ const ret = await client.send(new PutObjectCommand({
+ Bucket: bucket,
+ Key: uid,
+ Body: file.buffer,
+ }));
+ progress_tracker.set_total(file.size);
+ progress_tracker.set(file.size);
+ return ret;
+ }, 3, 200);
+
+ if ( ! s3_eventual_success ) {
+ throw s3_error;
+ }
+
+ return; // AKA "} else {{"
+ }
+
+ const [s3_error, s3_eventual_success, _s3_resp] = await simple_retry(async () => {
+ return await this.#upload_stream({
+ bucket_region,
+ bucket,
+ key: uid,
+ stream: file.stream,
+ on_progress: evt => {
+ progress_tracker.set_total(file.size);
+ progress_tracker.set(evt.uploaded);
+ },
+ });
+ }, 3, 200);
+
+ if ( ! s3_eventual_success ) {
+ throw s3_error;
+ }
+ }
+
+ async copy ({ src_node, dst_storage, storage_api }) {
+ const {
+ progress_tracker,
+ } = storage_api;
+
+ const src_storage = await src_node.get('s3:location');
+
+ const size = await src_node.get('size');
+ if ( size < 4 * 1000 ** 3 - 100 ) {
+ const ret = await this.#copy_simple({
+ src_key: src_storage.key,
+ src_bucket: src_storage.bucket,
+
+ dst_key: dst_storage.key,
+ dst_bucket_region: dst_storage.bucket_region,
+ dst_bucket: dst_storage.bucket,
+ });
+ progress_tracker.set_total(size);
+ progress_tracker.set(size);
+ return ret;
+ }
+
+ return await this.#copy_multipart({
+ src_key: src_storage.key,
+ src_bucket: src_storage.bucket,
+
+ dst_key: dst_storage.key,
+ dst_bucket_region: dst_storage.bucket_region,
+ dst_bucket: dst_storage.bucket,
+
+ size,
+
+ on_progress: evt => {
+ const x = Context.get();
+ progress_tracker.set_total(size);
+ progress_tracker.set(evt.uploaded);
+ },
+ });
+ }
+ async delete ({ node }) {
+ const node_storage = await node.get('s3:location');
+
+ const client = this.#get_client(node_storage.bucket_region);
+
+ return await client.send(new DeleteObjectCommand({
+ Bucket: node_storage.bucket,
+ Key: node_storage.key,
+ }));
+ }
+ async read ({ location, range, version_id }) {
+ const { bucket_region, bucket, key } = location;
+ const client = this.#get_client(bucket_region);
+
+ const response = await client.send(new GetObjectCommand({
+ Bucket: bucket,
+ Key: key,
+ ...(range ? { Range: range } : {}),
+ ...(version_id ? { VersionId: version_id } : {}),
+ }));
+
+ const stream = Readable.from(response.Body);
+
+ return stream;
+ }
+
+ async #upload_stream ({ bucket_region, bucket, key, stream, on_progress }) {
+ const client = this.#get_client(bucket_region);
+
+ const multipart_upload = await client.send(new CreateMultipartUploadCommand({
+ Bucket: bucket,
+ Key: key,
+ }));
+
+ let ret; // return value
+
+ try {
+ const part_size = 1024 * 1024 * 5; // 5MB
+ //
+
+ // get each part while streaming
+ const chunk_iterator = chunk_stream(
+ stream,
+ part_size,
+ this.global_average_S3_part_time,
+ );
+ let i = 0;
+ let uploaded_bytes = 0;
+ let upload_promises = [];
+ const upload_results = [];
+
+ let tp;
+ let count_parts_being_uploaded = 0;
+
+ let check_queue;
+
+ let queue_empty_promise = null;
+
+ const upload_part = async part => {
+
+ if ( count_parts_being_uploaded >= 4 ) {
+ console.log('too many concurrent part uploads; halting');
+ tp = new TeePromise();
+ await tp;
+ }
+
+ const part_number = ++i;
+
+ count_parts_being_uploaded++;
+
+ const upload_promise = (async () => {
+
+ const ts_start = Date.now();
+
+ const [err, success, result] = await simple_retry(async () => {
+ return await client.send(new UploadPartCommand({
+ Bucket: bucket,
+ Key: key,
+ PartNumber: part_number,
+ UploadId: multipart_upload.UploadId,
+ Body: part,
+ }));
+ }, 3, 50);
+
+ if ( err || !success ) {
+ throw err;
+ }
+
+ const ts_end = Date.now();
+ const elapsed = ts_end - ts_start;
+ const elapsed_per_part_size = elapsed * (part.length / part_size);
+ // this.global_average_S3_part_time.put(elapsed);
+ this.global_average_S3_part_time.put(elapsed_per_part_size);
+
+ uploaded_bytes += part.length;
+ on_progress({ uploaded: uploaded_bytes });
+
+ count_parts_being_uploaded--;
+ if ( tp ) {
+ const p = tp;
+ tp = null;
+ p.resolve();
+ }
+
+ check_queue();
+
+ return result;
+ })();
+
+ upload_promises.push(upload_promise);
+ };
+
+ const part_queue = [];
+
+ check_queue = () => {
+ if ( part_queue.length > 0 ) {
+ const part = part_queue.shift();
+ upload_part(part);
+ if ( part_queue.length == 0 ) {
+ if ( queue_empty_promise ) {
+ const p = queue_empty_promise;
+ queue_empty_promise = null;
+ p.resolve();
+ }
+ }
+ }
+ };
+
+ for await ( const chunk of chunk_iterator ) {
+ await upload_part(chunk);
+ }
+
+ // If the file is empty we still need to upload a part
+ if ( i === 0 ) {
+ const upload_promise = (async () => {
+ const [err, success, result] = await simple_retry(async () => {
+ return await client.send(new UploadPartCommand({
+ Bucket: bucket,
+ Key: key,
+ PartNumber: 1,
+ UploadId: multipart_upload.UploadId,
+ Body: Buffer.alloc(0),
+ }));
+ }, 3, 50);
+
+ if ( err || !success ) {
+ throw err;
+ }
+
+ on_progress({ uploaded: uploaded_bytes });
+ return result;
+ })();
+
+ upload_promises.push(upload_promise);
+ }
+
+ if ( part_queue.length > 0 ) {
+ queue_empty_promise = new TeePromise();
+ await queue_empty_promise;
+ }
+
+ const some_results = await Promise.all(upload_promises);
+ upload_results.push(...some_results);
+
+ try {
+ // complete the upload
+ ret = await client.send(new CompleteMultipartUploadCommand({
+ Bucket: bucket,
+ Key: key,
+ UploadId: multipart_upload.UploadId,
+ MultipartUpload: {
+ Parts: upload_results.map((_, i) => ({
+ PartNumber: i + 1,
+ ETag: _.ETag,
+ })),
+ },
+ }));
+ } catch ( e ) {
+ console.warn(`catch block: ${e.message}`);
+ }
+ } catch ( e ) {
+ console.error(`error: ${e.message}`);
+ // abort the upload
+ await client.send(new AbortMultipartUploadCommand({
+ Bucket: bucket,
+ Key: key,
+ UploadId: multipart_upload.UploadId,
+ }));
+
+ throw e;
+ }
+
+ return ret;
+ }
+ async #copy_simple ({
+ dst_bucket_region,
+ dst_bucket,
+ src_bucket,
+ src_key,
+ dst_key,
+ }) {
+ const client = this.#get_client(dst_bucket_region);
+
+ const ret = await client.send(new CopyObjectCommand({
+ Bucket: dst_bucket,
+ Key: dst_key,
+ CopySource: `${src_bucket}/${src_key}`,
+ }));
+
+ return ret;
+ }
+
+ async #copy_multipart ({
+ dst_bucket_region,
+ dst_bucket,
+ src_bucket,
+ src_key,
+ dst_key,
+ on_progress,
+ size,
+ }) {
+ const client = this.#get_client(dst_bucket_region);
+
+ const multipart_upload = await client.send(new CreateMultipartUploadCommand({
+ Bucket: dst_bucket,
+ Key: dst_key,
+ }));
+
+ const part_size = 4 * 1024 * 1024 * 1024; // 4GiB
+
+ const results = [];
+
+ let part_number_i = 0;
+ for ( let byte_start = 0 ; byte_start < size ; byte_start += part_size ) {
+ const part_number = ++part_number_i;
+ // byte range is inclusive... WTF?
+ const byte_end = Math.min(byte_start + part_size, size) - 1;
+
+ const [err, success, result] = await simple_retry(async () => {
+ const params = {
+ Bucket: dst_bucket,
+ Key: dst_key,
+ PartNumber: part_number,
+ UploadId: multipart_upload.UploadId,
+ CopySource: `${src_bucket}/${src_key}`,
+ CopySourceRange: `bytes=${byte_start}-${byte_end}`,
+ };
+ return await client.send(new UploadPartCopyCommand(params));
+ }, 3, 50);
+
+ if ( err || !success ) {
+ throw err;
+ }
+
+ results.push(result);
+
+ on_progress({ uploaded: byte_end + 1 });
+ }
+
+ const ret = await client.send(new CompleteMultipartUploadCommand({
+ Bucket: dst_bucket,
+ Key: dst_key,
+ UploadId: multipart_upload.UploadId,
+ MultipartUpload: {
+ Parts: results.map((_, i) => ({
+ PartNumber: i + 1,
+ ETag: _.CopyPartResult.ETag,
+ })),
+ },
+ }));
+
+ return ret;
+ }
+}
diff --git a/extensions/metering/config.json b/extensions/metering/config.json
new file mode 100644
index 0000000000..1f55059418
--- /dev/null
+++ b/extensions/metering/config.json
@@ -0,0 +1,11 @@
+{
+ "unlimitedUsage": false,
+ "unlimitedAllowList": [
+ "admin"
+ ],
+ "allowedGlobalUsageUsers": [
+ "nj",
+ "salazareos"
+ ],
+ "priority": 10
+}
\ No newline at end of file
diff --git a/extensions/metering/controllers/UsageController.ts b/extensions/metering/controllers/UsageController.ts
new file mode 100644
index 0000000000..06d3aa6a87
--- /dev/null
+++ b/extensions/metering/controllers/UsageController.ts
@@ -0,0 +1,96 @@
+/* global extension */
+import type { BaseDatabaseAccessService } from '@heyputer/backend/src/services/database/BaseDatabaseAccessService.js';
+import type { MeteringService } from '@heyputer/backend/src/services/MeteringService/MeteringService.js';
+import type {
+ Request,
+ Response,
+} from 'express';
+
+const { Controller, Get, ExtensionController } = extension.import('extensionController');
+
+@Controller('/metering')
+export class UsageController extends ExtensionController {
+ #meteringService: MeteringService;
+ #sqlClient: BaseDatabaseAccessService;
+
+ constructor (
+ meteringService: MeteringService,
+ sqlClient: BaseDatabaseAccessService,
+ ) {
+ super();
+ this.#meteringService = meteringService;
+ this.#sqlClient = sqlClient;
+ }
+
+ @Get('usage', { subdomain: 'api' })
+ async getUsage (req: Request, res: Response) {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw Error('actor not found in context');
+ }
+ const actorUsagePromise = this.#meteringService.getActorCurrentMonthUsageDetails(actor);
+ const actorAllowanceInfoPromise = this.#meteringService.getAllowedUsage(actor);
+
+ const [actorUsage, allowanceInfo] = await Promise.all([
+ actorUsagePromise,
+ actorAllowanceInfoPromise,
+ ]);
+ res.status(200).json({ ...actorUsage, allowanceInfo });
+ return;
+ }
+
+ @Get('usage/:appIdOrName', { subdomain: 'api' })
+ async getUsageByApp (req: Request, res: Response) {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw Error('actor not found in context');
+ }
+ const appIdOrName = req.params.appIdOrName;
+ if ( ! appIdOrName ) {
+ res.status(400).json({ error: 'appId parameter is required' });
+ return;
+ }
+ if ( typeof appIdOrName !== 'string' ) {
+ res.status(400).json({ error: 'appId parameter must be a string' });
+ return;
+ }
+
+ let appId = appIdOrName;
+ if ( !appIdOrName.startsWith('app-') || !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(appIdOrName.split('app-')[1]) ) {
+ // Check if the part after 'app-' is a valid UUID (v4)
+ const appRows = await this.#sqlClient.read(
+ 'SELECT `uid` FROM `apps` WHERE `name` = ? LIMIT 1',
+ [appIdOrName],
+ );
+ if ( appRows.length > 0 ) {
+ appId = appRows[0].uid;
+ } else {
+ res.status(404).json({ error: 'App not found' });
+ return;
+ }
+ } else {
+ appId = appIdOrName;
+ }
+
+ const appUsage =
+ await this.#meteringService.getActorCurrentMonthAppUsageDetails(
+ actor,
+ appId,
+ );
+
+ res.status(200).json(appUsage);
+ return;
+ }
+
+ @Get('globalUsage', { subdomain: 'api' }, extension.config.allowedGlobalUsageUsers || [])
+ async getGlobalUsage (req: Request, res: Response) {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw Error('actor not found in context');
+ }
+
+ const globalUsage = await this.#meteringService.getGlobalUsage();
+ res.status(200).json(globalUsage);
+ return;
+ }
+}
diff --git a/extensions/metering/eventListeners/subscriptionEvents.ts b/extensions/metering/eventListeners/subscriptionEvents.ts
new file mode 100644
index 0000000000..e15f8f717e
--- /dev/null
+++ b/extensions/metering/eventListeners/subscriptionEvents.ts
@@ -0,0 +1,29 @@
+extension.on('metering:overrideDefaultSubscription', async (event) => {
+ // bit of a stub implementation for OSS, technically can be always free if you set this config true
+ if ( config.unlimitedUsage ) {
+ console.warn('WARNING!!! unlimitedUsage is enabled, this is not recommended for production use');
+ event.defaultSubscriptionId = 'unlimited';
+ }
+});
+
+extension.on('metering:registerAvailablePolicies', async (event) => {
+ // bit of a stub implementation for OSS, technically can be always free if you set this config true
+ if ( config.unlimitedUsage || config.unlimitedAllowList?.length ) {
+ event.availablePolicies.push({
+ id: 'unlimited',
+ monthUsageAllowance: 5_000_000 * 1_000_000 * 100, // unless you're like, jeff's, mark's, and elon's illegitamate son, you probably won't hit $5m a month
+ monthlyStorageAllowance: 100_000 * 1024 * 1024, // 100MiB but ignored in local dev
+ });
+ }
+});
+
+extension.on('metering:getUserSubscription', async (event) => {
+ const userName = event?.actor?.type?.user?.username;
+ if ( config.unlimitedAllowList?.includes(userName) ) {
+ event.userSubscriptionId;
+ }
+ else {
+ event.userSubscriptionId = event?.actor?.type?.user?.subscription?.active ? event.actor.type.user.subscription?.tier : undefined;
+ }
+ // default location for user sub, but can techinically be anywhere else or fetched on request
+});
diff --git a/extensions/metering/main.ts b/extensions/metering/main.ts
new file mode 100644
index 0000000000..79102f3a24
--- /dev/null
+++ b/extensions/metering/main.ts
@@ -0,0 +1,8 @@
+import { UsageController } from './controllers/UsageController.js';
+import './eventListeners/subscriptionEvents.js';
+
+const meteringService = extension.import('service:meteringService');
+const sqlClient = extension.import('service:database');
+
+const controller = new UsageController(meteringService, sqlClient);
+controller.registerRoutes();
diff --git a/extensions/metering/package.json b/extensions/metering/package.json
new file mode 100644
index 0000000000..47c7f2e170
--- /dev/null
+++ b/extensions/metering/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@heyputer/extension-metering-service",
+ "main": "main.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck"
+ },
+ "devDependencies": {
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/extensions/metering/tsconfig.json b/extensions/metering/tsconfig.json
new file mode 100644
index 0000000000..3e9daf662f
--- /dev/null
+++ b/extensions/metering/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "noEmitOnError": true,
+ "noImplicitAny": false,
+ "allowJs": true,
+ "checkJs": false,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
diff --git a/extensions/metering/types.ts b/extensions/metering/types.ts
new file mode 100644
index 0000000000..69a5a7cfd4
--- /dev/null
+++ b/extensions/metering/types.ts
@@ -0,0 +1 @@
+import '../api.js';
diff --git a/extensions/serverInfo/config.json b/extensions/serverInfo/config.json
new file mode 100644
index 0000000000..77cf15d65a
--- /dev/null
+++ b/extensions/serverInfo/config.json
@@ -0,0 +1,5 @@
+{
+ "allowedUsernames": [
+ "puter"
+]
+}
\ No newline at end of file
diff --git a/extensions/serverInfo/index.ts b/extensions/serverInfo/index.ts
new file mode 100644
index 0000000000..b829011f97
--- /dev/null
+++ b/extensions/serverInfo/index.ts
@@ -0,0 +1,68 @@
+/* global config, extension */
+import type {
+ Request,
+ Response,
+} from 'express';
+import fs from 'fs/promises';
+import os from 'os';
+const { Controller, Get, ExtensionController } = extension.import('extensionController');
+
+@Controller('/serverInfo', [...config.allowedUsernames])
+class ServerInfoController extends ExtensionController {
+ @Get('', { subdomain: 'api' })
+ async getServerInfo (_req: Request, res: Response) {
+ const osData = {
+ platform: os.platform(),
+ type: os.type(),
+ release: os.release(),
+ pretty: `${os.type()} ${os.release()}`,
+ };
+
+ const cpus = os.cpus();
+ const cpuData = {
+ model: cpus[0]?.model || 'Unknown',
+ cores: cpus.length,
+ };
+
+ const ramData = {
+ total: os.totalmem(),
+ free: os.freemem(),
+ totalGB: (os.totalmem() / 1073741824).toFixed(2),
+ freeGB: (os.freemem() / 1073741824).toFixed(2),
+ };
+
+ const uptimeSeconds = os.uptime();
+ const uptimeData = {
+ seconds: uptimeSeconds,
+ days: Math.floor(uptimeSeconds / 86400),
+ hours: Math.floor((uptimeSeconds % 86400) / 3600),
+ minutes: Math.floor((uptimeSeconds % 3600) / 60),
+ pretty: `${Math.floor(uptimeSeconds / 86400)}d ${Math.floor((uptimeSeconds % 86400) / 3600)}h ${Math.floor((uptimeSeconds % 3600) / 60)}m`,
+ };
+
+ let diskData = { total: 'N/A', free: 'N/A', used: 'N/A' };
+ try {
+ const stats = await fs.statfs('/');
+ const totalGB = (stats.blocks * stats.bsize / 1073741824);
+ const freeGB = (stats.bfree * stats.bsize / 1073741824);
+ const usedGB = (totalGB - freeGB).toFixed(2);
+ diskData = { total: totalGB.toFixed(2), free: freeGB.toFixed(2), used: usedGB };
+ } catch ( err ) {
+ console.error('Disk stats error:', err);
+ }
+
+ const response = {
+ os: osData,
+ cpu: cpuData,
+ ram: ramData,
+ uptime: uptimeData,
+ disk: diskData,
+ loadavg: os.loadavg(),
+ hostname: os.hostname(),
+ };
+
+ res.json(response);
+ }
+}
+
+(new ServerInfoController()).registerRoutes();
diff --git a/extensions/serverInfo/package.json b/extensions/serverInfo/package.json
new file mode 100644
index 0000000000..56157804f5
--- /dev/null
+++ b/extensions/serverInfo/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@heyputer/server-info-extension",
+ "main": "index.js",
+ "type": "module",
+ "scripts": {
+ "postinstall": "tsc --noCheck"
+ },
+ "devDependencies": {
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/extensions/serverInfo/tsconfig.json b/extensions/serverInfo/tsconfig.json
new file mode 100644
index 0000000000..3e9daf662f
--- /dev/null
+++ b/extensions/serverInfo/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "nodenext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "noEmitOnError": true,
+ "noImplicitAny": false,
+ "allowJs": true,
+ "checkJs": false,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist",
+ "*.js"
+ ]
+}
diff --git a/extensions/serverInfo/types.ts b/extensions/serverInfo/types.ts
new file mode 100644
index 0000000000..69a5a7cfd4
--- /dev/null
+++ b/extensions/serverInfo/types.ts
@@ -0,0 +1 @@
+import '../api.js';
diff --git a/extensions/thumbnails/package.json b/extensions/thumbnails/package.json
new file mode 100644
index 0000000000..60266b7fc6
--- /dev/null
+++ b/extensions/thumbnails/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "thumbnail",
+ "version": "1.0.0",
+ "main": "thumbnailBucketStore.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "UNLICENSED",
+ "description": "",
+ "dependencies": {
+ "@aws-sdk/s3-request-presigner": "^3.1020.0",
+ "@aws-sdk/client-s3": "^3.1020.0"
+ }
+}
diff --git a/extensions/thumbnails/thumbnailBucketStore.js b/extensions/thumbnails/thumbnailBucketStore.js
new file mode 100644
index 0000000000..6b2473110a
--- /dev/null
+++ b/extensions/thumbnails/thumbnailBucketStore.js
@@ -0,0 +1,194 @@
+const { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
+const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
+const { Context } = extension.import('core');
+const /**@type {any}*/ svc_fs = extension.import('service:filesystem');
+const {
+ NodeUIDSelector,
+} = extension.import('core').fs.selectors;
+
+const extensionBucketInfo = global_config.services?.thumbnails?.bucket;
+const client = extensionBucketInfo?.endpoint && extensionBucketInfo?.credentials ? new S3Client({
+ region: 'auto',
+ endpoint: extensionBucketInfo.endpoint,
+ credentials: extensionBucketInfo.credentials,
+}) : extension.import('data').s3ClientProvider.get();
+const MAX_THUMBNAIL_BYTES = 2 * 1024 * 1024;
+
+const thumbnailBucketName = extensionBucketInfo?.name || 'puter-local';
+const extensionBucketEndpoint = extensionBucketInfo?.endpoint || 'http://127.0.0.1:4566/puter-local/';
+
+// A not-user-input-safe base64 data url parser.
+function base64ParseDataUrl (dataURL) {
+ dataURL = dataURL.slice(5);
+ const mimeType = dataURL.split(';')[0];
+ const data = Buffer.from(dataURL.split(',')[1], 'base64');
+ return { mimeType, data };
+}
+
+function estimateDataUrlSize (dataURL) {
+ const commaIndex = dataURL.indexOf(',');
+ const base64 = commaIndex === -1 ? dataURL : dataURL.slice(commaIndex + 1);
+ return Math.ceil(base64.length * 3 / 4);
+}
+
+extension.on('thumbnail.created', async (event) => {
+ const url = event.url;
+ if ( typeof url !== 'string' || !url.startsWith('data:') ) {
+ return;
+ }
+ if ( estimateDataUrlSize(url) > MAX_THUMBNAIL_BYTES ) {
+ event.url = null;
+ return;
+ }
+
+ const key = crypto.randomUUID();
+
+ // Inject in the s3 internal URL in place of the data URL before the operation goes to DB
+ event.url = `s3://${thumbnailBucketName}/${key}`;
+
+ // Parse base64 URL created from thumbnail service
+ const { mimeType, data } = base64ParseDataUrl(url);
+
+ // Upload thumbnail
+ const params = {
+ Bucket: thumbnailBucketName,
+ Key: key,
+ Body: data,
+ ContentType: mimeType,
+ };
+ await client.send(new PutObjectCommand(params));
+});
+
+extension.on('thumbnail.upload.prepare', async (event) => {
+ if ( !event || !Array.isArray(event.items) ) {
+ return;
+ }
+
+ for ( const item of event.items ) {
+ if ( !item || typeof item !== 'object' ) {
+ throw new Error('thumbnail.upload.prepare item is invalid');
+ }
+
+ const contentType = typeof item.contentType === 'string'
+ ? item.contentType.trim()
+ : '';
+ if ( ! contentType ) {
+ continue;
+ }
+
+ if ( item.size !== undefined ) {
+ const size = Number(item.size);
+ if ( !Number.isFinite(size) || size < 0 ) {
+ continue;
+ }
+ if ( size > MAX_THUMBNAIL_BYTES ) {
+ continue;
+ }
+ }
+
+ const key = crypto.randomUUID();
+ const bucket = thumbnailBucketName;
+ const command = new PutObjectCommand({
+ Bucket: bucket,
+ Key: key,
+ ContentType: contentType,
+ });
+ const uploadUrl = await getSignedUrl(client, command, { expiresIn: 900 });
+
+ item.uploadUrl = uploadUrl;
+ item.thumbnailUrl = `s3://${bucket}/${key}`;
+ }
+});
+
+let in_progress_thumbs = {};
+
+extension.on('thumbnail.read', async (/**@type {any}*/entry) => {
+ if ( entry.thumbnail && entry.thumbnail.startsWith('s3://') ) {
+ // Parse s3 URL
+ const [bucket, key] = entry.thumbnail.slice(5).split('/');
+
+ // Get signed url and inject it into the thumbnail read event
+ entry.thumbnail = await getSignedUrl(
+ client,
+ new GetObjectCommand({ Bucket: bucket, Key: key }),
+ { expiresIn: 604800 },
+ );
+ } else if ( entry.thumbnail.startsWith('https') && entry.thumbnail.includes(new URL(extensionBucketEndpoint).hostname) ) {
+ // Remove after migration
+ let [bucket, key] = new URL(entry.thumbnail).pathname.slice(1).split('/');
+
+ // Get signed url and inject it into the thumbnail read event
+ entry.thumbnail = await getSignedUrl(
+ client,
+ new GetObjectCommand({ Bucket: bucket, Key: key }),
+ { expiresIn: 604800 },
+ );
+ } else if ( entry.thumbnail.startsWith('data') && Context.get('req') && !in_progress_thumbs[entry.uuid] ) {
+ in_progress_thumbs[entry.uuid] = true;
+ const newNode = await svc_fs.node(new NodeUIDSelector(entry.uuid));
+ const key = crypto.randomUUID();
+ const { mimeType, data } = base64ParseDataUrl(entry.thumbnail);
+ const newUrl = `s3://${thumbnailBucketName}/${key}`;
+ // Upload thumbnail
+ const params = {
+ Bucket: thumbnailBucketName,
+ Key: key,
+ Body: data,
+ ContentType: mimeType,
+ };
+ (async () => {
+ await client.send(new PutObjectCommand(params));
+ await newNode.provider.update_thumbnail({
+ context: Context.get(),
+ node: newNode,
+ thumbnail: newUrl,
+ });
+ delete in_progress_thumbs[entry.uuid];
+ })();
+ }
+});
+
+extension.on('fs.remove.node', async ({ target }) => {
+ let thumbnailUrl;
+ if ( ! target.thumbnail ) {
+ // Stat the entry since we weren't given a thumbnail
+ const controls = {
+ log: target.log,
+ provide_selector: selector => {
+ target.selector = selector;
+ },
+ };
+ const newTarget = await target.provider.stat({
+ selector: target.selector,
+ options: { thumbnail: true },
+ node: target,
+ controls,
+ });
+
+ // There is REALLY just no thumbnail
+ if ( ! newTarget.thumbnail )
+ {
+ return;
+ }
+
+ thumbnailUrl = newTarget.thumbnail;
+ } else {
+ // We were immediately given a thumbnail
+ thumbnailUrl = target.thumbnail;
+ }
+
+ // Not an S3 thumbnail, likely older format like data URL
+ if ( !thumbnailUrl || !thumbnailUrl.startsWith('s3://') )
+ {
+ return;
+ }
+
+ const [bucket, key] = thumbnailUrl.slice(5).split('/');
+
+ // Delete thumbnail from S3
+ const params = {
+ Bucket: bucket,
+ Key: key,
+ };
+ await client.send(new DeleteObjectCommand(params));
+});
diff --git a/extensions/tsconfig.json b/extensions/tsconfig.json
new file mode 100644
index 0000000000..faaa2cc0ed
--- /dev/null
+++ b/extensions/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "target": "ES2024",
+ "module": "node16",
+ "moduleResolution": "node16",
+ "allowJs": true,
+ "rootDir": "./",
+ "strict": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowSyntheticDefaultImports": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ },
+ "include": [
+ "./**/*.ts",
+ "./**/*.d.ts",
+ "./**/*.d.mts",
+ "./**/*.d.cts"
+ ],
+ "exclude": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/test/**",
+ "**/tests/**",
+ "node_modules",
+ "dist"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/utilities.js b/extensions/utilities.js
new file mode 100644
index 0000000000..f7818b64e7
--- /dev/null
+++ b/extensions/utilities.js
@@ -0,0 +1,9 @@
+//@extension priority -10000
+
+extension.exports = {};
+
+extension.exports.sleep = async (seconds) => {
+ await new Promise(resolve => {
+ setTimeout(resolve, seconds);
+ });
+};
diff --git a/extensions/whoami/main.js b/extensions/whoami/main.js
new file mode 100644
index 0000000000..b0b0f479cb
--- /dev/null
+++ b/extensions/whoami/main.js
@@ -0,0 +1 @@
+import './routes.js';
diff --git a/extensions/whoami/package.json b/extensions/whoami/package.json
new file mode 100644
index 0000000000..0fb6d98a36
--- /dev/null
+++ b/extensions/whoami/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "@heyputer/extension-whoami",
+ "main": "main.js",
+ "type": "module",
+ "dependencies": {
+ "javascript-time-ago": "^2.5.12"
+ }
+}
diff --git a/extensions/whoami/routes.js b/extensions/whoami/routes.js
new file mode 100644
index 0000000000..3919045953
--- /dev/null
+++ b/extensions/whoami/routes.js
@@ -0,0 +1,256 @@
+// static imports
+import _path from 'fs';
+import TimeAgo from 'javascript-time-ago';
+import localeEn from 'javascript-time-ago/locale/en';
+
+// runtime imports
+const { UserActorType, AppUnderUserActorType } = extension.import('core');
+const {
+ id2uuid,
+ get_descendants,
+ suggest_app_for_fsentry,
+ is_shared_with_anyone,
+ get_app,
+ get_taskbar_items,
+} = extension.import('core').util.helpers;
+
+const timeago = (() => {
+ TimeAgo.addDefaultLocale(localeEn);
+ return new TimeAgo('en-US');
+})();
+
+const whoami_common = ({ is_user, user }) => {
+ const details = {};
+
+ // User's immutable default (often called "system") directories'
+ // alternative (to path) identifiers are sent to the user's client
+ // (but not to apps; they don't need this information)
+ if ( is_user ) {
+ const directories = details.directories = {};
+ const name_to_path = {
+ 'desktop_uuid': `/${user.username}/Desktop`,
+ 'appdata_uuid': `/${user.username}/AppData`,
+ 'documents_uuid': `/${user.username}/Documents`,
+ 'pictures_uuid': `/${user.username}/Pictures`,
+ 'videos_uuid': `/${user.username}/Videos`,
+ 'trash_uuid': `/${user.username}/Trash`,
+ };
+ for ( const k in name_to_path ) {
+ directories[name_to_path[k]] = user[k];
+ }
+ }
+
+ if ( user.last_activity_ts ) {
+
+ // Create a Date object and get the epoch timestamp
+ let epoch;
+ try {
+ epoch = new Date(user.last_activity_ts).getTime();
+ // round to 1 decimal place
+ epoch = Math.round(epoch / 1000);
+ } catch ( e ) {
+ console.error('Error parsing last_activity_ts', e);
+ }
+
+ // add last_activity_ts
+ details.last_activity_ts = epoch;
+ }
+
+ return details;
+};
+
+extension.get('/whoami', { subdomain: 'api' }, async (req, res, next) => {
+ const actor = req.actor;
+
+ if ( ! actor ) {
+ throw Error('actor not found in context');
+ }
+
+ const is_user = actor.type instanceof UserActorType;
+
+ if ( req.query.icon_size ) {
+ const ALLOWED_SIZES = ['16', '32', '64', '128', '256', '512'];
+
+ if ( ! ALLOWED_SIZES.includes(req.query.icon_size) ) {
+ res.status(400).send({ error: 'Invalid icon_size' });
+ }
+ }
+
+ const oidc_only = req.user.password === null;
+ const details = {
+ username: req.user.username,
+ uuid: req.user.uuid,
+ email: req.user.email,
+ unconfirmed_email: req.user.email,
+ email_confirmed: req.user.email_confirmed
+ || req.user.username === 'admin',
+ requires_email_confirmation: req.user.requires_email_confirmation,
+ desktop_bg_url: req.user.desktop_bg_url,
+ desktop_bg_color: req.user.desktop_bg_color,
+ desktop_bg_fit: req.user.desktop_bg_fit,
+ is_temp: (req.user.password === null && req.user.email === null),
+ oidc_only,
+ ...(oidc_only ? await (async () => {
+ try {
+ const svc_oidc = req.services.get('oidc');
+ const providers = await svc_oidc.getEnabledProviderIds();
+ const origin = (svc_oidc.global_config?.origin || '').replace(/\/$/, '');
+ const provider = providers && providers[0];
+ if ( provider ) {
+ return {
+ oidc_revalidate_url: `${origin}/auth/oidc/${provider}/start?flow=revalidate&user_id=${req.user.id}`,
+ };
+ }
+ return {};
+ } catch ( _e ) {
+ return {};
+ }
+ })() : {}),
+ taskbar_items: await get_taskbar_items(req.user, {
+ ...(req.query.icon_size
+ ? { icon_size: req.query.icon_size }
+ : { no_icons: true }),
+ }),
+ referral_code: req.user.referral_code,
+ otp: !!req.user.otp_enabled,
+ human_readable_age: timeago.format(new Date(req.user.timestamp)),
+ hasDevAccountAccess: !!req.actor.type.user.metadata?.hasDevAccountAccess,
+ ...(req.new_token ? { token: req.token } : {}),
+ is_user_token: true, // gets deleted if not a user token
+ };
+
+ // TODO: redundant? GetUserService already puts these values on 'user'
+ // Get whoami values from other services
+ const /** @type {any} */ svc_whoami = req.services.get('whoami');
+
+ const /** @type {any} */ svc_permission = req.services.get('permission');
+
+ const provider_details = await svc_whoami.get_details({
+ user: req.user,
+ actor: actor,
+ });
+ Object.assign(details, provider_details);
+
+ if ( ! is_user ) {
+ // When apps call /whoami they should not see these attributes
+ // delete details.username;
+ // delete details.uuid;
+
+ if ( ! (await svc_permission.check(actor, `user:${details.uuid}:email:read`, { no_cache: true })) ) {
+ delete details.email;
+ delete details.unconfirmed_email;
+ }
+
+ delete details.desktop_bg_url;
+ delete details.desktop_bg_color;
+ delete details.desktop_bg_fit;
+ delete details.taskbar_items;
+ delete details.token;
+ delete details.human_readable_age;
+ delete details.is_user_token;
+ }
+
+ if ( actor.type instanceof AppUnderUserActorType ) {
+ details.app_name = actor.type.app.name;
+
+ // IDEA: maybe we do this in the future
+ // details.app = {
+ // name: actor.type.app.name,
+ // };
+ }
+
+ Object.assign(details, whoami_common({ is_user, user: req.user }));
+
+ res.send(details);
+});
+
+extension.post('/whoami', { subdomain: 'api' }, async (req, res) => {
+ const actor = req.actor;
+ if ( ! actor ) {
+ throw Error('actor not found in context');
+ }
+
+ const is_user = actor.type instanceof UserActorType;
+ if ( ! is_user ) {
+ throw Error('actor is not a user');
+ }
+
+ let desktop_items = [];
+
+ // check if user asked for desktop items
+ if ( req.query.return_desktop_items === 1 || req.query.return_desktop_items === '1' || req.query.return_desktop_items === 'true' ) {
+ // by cached desktop id
+ if ( req.user.desktop_id ) {
+ // TODO: Check if used anywhere, maybe remove
+ // eslint-disable-next-line no-undef
+ desktop_items = await db.read(`SELECT * FROM fsentries
+ WHERE user_id = ? AND parent_uid = ?`,
+ [req.user.id, await id2uuid(req.user.desktop_id)]);
+ }
+ // by desktop path
+ else {
+ desktop_items = await get_descendants(`${req.user.username }/Desktop`, req.user, 1, true);
+ }
+
+ // clean up desktop items and add some extra information
+ if ( desktop_items.length > 0 ) {
+ if ( desktop_items.length > 0 ) {
+ for ( let i = 0; i < desktop_items.length; i++ ) {
+ if ( desktop_items[i].id !== null ) {
+ // suggested_apps for files
+ if ( ! desktop_items[i].is_dir ) {
+ desktop_items[i].suggested_apps = await suggest_app_for_fsentry(desktop_items[i], { user: req.user });
+ }
+ // is_shared
+ desktop_items[i].is_shared = await is_shared_with_anyone(desktop_items[i].id);
+
+ // associated_app
+ if ( desktop_items[i].associated_app_id ) {
+ const app = await get_app({ id: desktop_items[i].associated_app_id });
+
+ // remove some privileged information
+ delete app.id;
+ delete app.approved_for_listing;
+ delete app.approved_for_opening_items;
+ delete app.godmode;
+ delete app.owner_user_id;
+ // add to array
+ desktop_items[i].associated_app = app;
+
+ } else {
+ desktop_items[i].associated_app = {};
+ }
+
+ // remove associated_app_id since it's sensitive info
+ // delete desktop_items[i].associated_app_id;
+ }
+ // id is sesitive info
+ delete desktop_items[i].id;
+ delete desktop_items[i].user_id;
+ delete desktop_items[i].bucket;
+ desktop_items[i].path = _path.join('/', req.user.username, desktop_items[i].name);
+ }
+ }
+ }
+ }
+
+ const oidc_only = req.user.password === null;
+ // send user object
+ res.send(Object.assign({
+ username: req.user.username,
+ uuid: req.user.uuid,
+ email: req.user.email,
+ email_confirmed: req.user.email_confirmed
+ || req.user.username === 'admin',
+ requires_email_confirmation: req.user.requires_email_confirmation,
+ desktop_bg_url: req.user.desktop_bg_url,
+ desktop_bg_color: req.user.desktop_bg_color,
+ desktop_bg_fit: req.user.desktop_bg_fit,
+ is_temp: (req.user.password === null && req.user.email === null),
+ oidc_only,
+ taskbar_items: await get_taskbar_items(req.user),
+ desktop_items: desktop_items,
+ referral_code: req.user.referral_code,
+ hasDevAccountAccess: !!req.actor.user.metadata?.hasDevAccountAccess,
+ }, whoami_common({ is_user, user: req.user })));
+});
diff --git a/extensions/worker-sandbox.js b/extensions/worker-sandbox.js
new file mode 100644
index 0000000000..b0926cf7d8
--- /dev/null
+++ b/extensions/worker-sandbox.js
@@ -0,0 +1,201 @@
+const page = `
+
+
+
+
+
+ Puter Worker Sandbox Playground
+
+
+
+
+ Puter Worker Sandbox Playground
+ Use this page to interact with the puter APIs in the same sandbox as your worker.
+
+ Run
+ Clear Logs
+
+
+
+ Code
+
+
+
+ Logs
+
+
+
+
+
+
+
+
+`;
+
+extension.get('/', { noauth: true, subdomain: 'worker-sandbox' }, (req, res) => {
+ res.type('html').send(page);
+});
diff --git a/incubator/x86emu/README.md b/incubator/x86emu/README.md
deleted file mode 100644
index e74e444def..0000000000
--- a/incubator/x86emu/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Research + Planning for x86 Emulation in Puter
-
-## Resources
-- [copy.sh/v86 docs](https://github.com/copy/v86/blob/master/docs)
-- [greenfield github](https://github.com/udevbe/greenfield)
-
-## TODO
-
-### Documents to Write
-
-- [ ] specification for Puter network driver
-- [ ] specification for Puter network relay
-
-### Things to Try
-
-- [ ] greenfield/wayland/arch/v86
-- [ ] puter-fuse in v86
diff --git a/install.md b/install.md
new file mode 100644
index 0000000000..e4f5ab38d0
--- /dev/null
+++ b/install.md
@@ -0,0 +1,139 @@
+
+# INSTALL.md
+
+## Node.js & npm Installation Guide
+
+
+## 1. Arch Linux / Manjaro
+
+```bash
+# Update package database
+sudo pacman -Syu
+
+# Install Node.js and npm
+sudo pacman -S nodejs npm
+
+# Verify installation
+node -v
+npm -v
+````
+
+---
+
+## 2. Debian / Ubuntu
+
+```bash
+# Update package database and install curl
+sudo apt update
+sudo apt install -y curl
+
+# Install nvm (Node Version Manager)
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
+
+# Load nvm
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+
+# Reload shell
+source ~/.bashrc # Or source ~/.zshrc if using Zsh
+
+# Install latest Node.js and npm
+nvm install node
+
+# Verify installation
+node -v
+npm -v
+```
+
+---
+
+## 3. CentOS / RHEL
+
+```bash
+# Install curl if missing
+sudo yum install -y curl
+
+# Install nvm
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
+
+
+# Load nvm
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+
+# Reload shell
+source ~/.bashrc # Or source ~/.zshrc if using Zsh
+
+# Install latest Node.js and npm
+nvm install node
+
+# Verify installation
+node -v
+npm -v
+```
+
+---
+
+## 4. Fedora
+
+```bash
+# Update system
+sudo dnf update -y
+
+# Install Node.js and npm from modules
+sudo dnf module list nodejs # Check available versions
+sudo dnf module enable nodejs:18 # Example: enable Node 18 LTS
+sudo dnf install -y nodejs npm
+
+# Verify installation
+node -v
+npm -v
+```
+
+---
+
+## 5. openSUSE
+
+```bash
+# Refresh repositories
+sudo zypper refresh
+
+# Install Node.js and npm
+sudo zypper install -y nodejs npm
+
+# Verify installation
+node -v
+npm -v
+```
+
+---
+
+## 6. Using nvm (Optional, Recommended)
+
+`nvm` allows installing multiple Node.js versions and switching between them easily:
+
+```bash
+# Install nvm
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
+
+# Load nvm
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+
+# Reload shell
+source ~/.bashrc # Or source ~/.zshrc if using Zsh
+
+# Install latest Node.js and npm
+nvm install node
+
+# Or install latest LTS version
+nvm install --lts
+
+# Switch Node versions
+nvm use node
+
+# Verify installation
+node -v
+npm -v
+```
+
diff --git a/mod_packages/testex/package.json b/mod_packages/testex/package.json
new file mode 100644
index 0000000000..f117788923
--- /dev/null
+++ b/mod_packages/testex/package.json
@@ -0,0 +1 @@
+{}
diff --git a/mods/README.md b/mods/README.md
new file mode 100644
index 0000000000..61796e5090
--- /dev/null
+++ b/mods/README.md
@@ -0,0 +1,13 @@
+# Puter Mods
+
+A list of Puter mods which may be expanded in the future.
+
+**Contributions of new mods are welcome.**
+
+## kdmod
+
+- **location:** [./kdmod](./kdmod)
+- **description:**
+ > "kernel dev mod"; specifically for the devex needs of
+ > GitHub user KernelDeimos and provided in case anyone else
+ > finds it of any use.
diff --git a/mods/mods_available/example-singlefile.js b/mods/mods_available/example-singlefile.js
new file mode 100644
index 0000000000..3cac2740a2
--- /dev/null
+++ b/mods/mods_available/example-singlefile.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+extension.get('/example-onefile-get', (req, res) => {
+ res.send('Hello World!');
+});
+
+extension.on('install', ({ services }) => {
+ // console.log('install was called');
+});
diff --git a/mods/mods_available/example/main.js b/mods/mods_available/example/main.js
new file mode 100644
index 0000000000..6ca4b6940b
--- /dev/null
+++ b/mods/mods_available/example/main.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+extension.get('/example-mod-get', (req, res) => {
+ res.send('Hello World!');
+});
+
+extension.on('install', ({ services }) => {
+ // console.log('install was called');
+});
diff --git a/mods/mods_available/example/package.json b/mods/mods_available/example/package.json
new file mode 100644
index 0000000000..175f513aa3
--- /dev/null
+++ b/mods/mods_available/example/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "example-puter-extension",
+ "version": "1.0.0",
+ "description": "",
+ "main": "main.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "AGPL-3.0-only"
+}
diff --git a/mods/mods_available/kdmod/CustomPuterService.js b/mods/mods_available/kdmod/CustomPuterService.js
new file mode 100644
index 0000000000..45266315e0
--- /dev/null
+++ b/mods/mods_available/kdmod/CustomPuterService.js
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+const path = require('path');
+
+class CustomPuterService extends use.Service {
+ async _init () {
+ const svc_puterHomepage = this.services.get('puter-homepage');
+ svc_puterHomepage.register_script('/custom-gui/main.js');
+ }
+ '__on_install.routes' (_, { app }) {
+ const require = this.require;
+ const express = require('express');
+ const path_ = require('path');
+
+ app.use(
+ '/custom-gui',
+ express.static(path.join(__dirname, 'gui')),
+ );
+ }
+}
+
+module.exports = { CustomPuterService };
diff --git a/mods/mods_available/kdmod/README.md b/mods/mods_available/kdmod/README.md
new file mode 100644
index 0000000000..d7fa3de3a7
--- /dev/null
+++ b/mods/mods_available/kdmod/README.md
@@ -0,0 +1,7 @@
+# Kernel Dev Mod
+
+This mod makes testing and debugging easier.
+
+## Current Features:
+- A service-script adds `reqex` to the `window` object in the client,
+ which contains a bunch of example requests to internal API endpoints.
diff --git a/mods/mods_available/kdmod/ShareTestService.js b/mods/mods_available/kdmod/ShareTestService.js
new file mode 100644
index 0000000000..c4854e8f51
--- /dev/null
+++ b/mods/mods_available/kdmod/ShareTestService.js
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+// TODO: accessing these imports directly from a mod is not really
+// the way mods are intended to work; this is temporary until
+// we have these things registered in "useapi".
+const {
+ get_user,
+ invalidate_cached_user,
+ deleteUser,
+} = require('../../../src/backend/src/helpers.js');
+const { HLWrite } = require('../../../src/backend/src/filesystem/hl_operations/hl_write.js');
+const { LLRead } = require('../../../src/backend/src/filesystem/ll_operations/ll_read.js');
+const { Actor, UserActorType }
+ = require('../../../src/backend/src/services/auth/Actor.js');
+const { DB_WRITE } = require('../../../src/backend/src/services/database/consts.js');
+const {
+ RootNodeSelector,
+ NodeChildSelector,
+ NodePathSelector,
+} = require('../../../src/backend/src/filesystem/node/selectors.js');
+const { Context } = require('../../../src/backend/src/util/context.js');
+
+class ShareTestService extends use.Service {
+ static MODULES = {
+ uuidv4: require('uuid').v4,
+ };
+
+ async _init () {
+
+ this.scenarios = require('./data/sharetest_scenarios');
+
+ const svc_db = this.services.get('database');
+ this.db = svc_db.get(svc_db.DB_WRITE, 'share-test');
+ }
+
+ async runit () {
+ await this.teardown_();
+ await this.setup_();
+
+ const results = [];
+
+ for ( const scenario of this.scenarios ) {
+ if ( ! scenario.title ) {
+ scenario.title = scenario.sequence.map(step => step.title).join('; ');
+ }
+ results.push({
+ title: scenario.title,
+ report: await this.run_scenario_(scenario),
+ });
+ }
+
+ await this.teardown_();
+ return results;
+ }
+
+ async setup_ () {
+ await this.create_test_user_('testuser_eric');
+ await this.create_test_user_('testuser_stan');
+ await this.create_test_user_('testuser_kyle');
+ await this.create_test_user_('testuser_kenny');
+ }
+ async run_scenario_ (scenario) {
+ let error;
+ // Run sequence
+ for ( const step of scenario.sequence ) {
+ const method = this[`__scenario:${step.call}`];
+ const user = await get_user({ username: step.as });
+ const actor = await Actor.create(UserActorType, { user });
+ const generated = { user, actor };
+ const report = await Context.get().sub({ user, actor })
+ .arun(async () => {
+ return await method.call(this, generated, step.with);
+ });
+ if ( report ) {
+ error = { step: step.title, report };
+ break;
+ }
+ }
+ return error;
+ }
+ async teardown_ () {
+ await this.delete_test_user_('testuser_eric');
+ await this.delete_test_user_('testuser_stan');
+ await this.delete_test_user_('testuser_kyle');
+ await this.delete_test_user_('testuser_kenny');
+ }
+
+ async create_test_user_ (username) {
+ await this.db.write(
+ `
+ INSERT INTO user (uuid, username, email, free_storage, password)
+ VALUES (?, ?, ?, ?, ?)
+ `,
+ [
+ this.modules.uuidv4(),
+ username,
+ `${username}@example.com`,
+ 1024 * 1024 * 500, // 500 MiB
+ this.modules.uuidv4(),
+ ],
+ );
+ const user = await get_user({ username });
+ const svc_user = this.services.get('user');
+ await svc_user.generate_default_fsentries({ user });
+ invalidate_cached_user(user);
+ return user;
+ }
+
+ async delete_test_user_ (username) {
+ const user = await get_user({ username });
+ if ( ! user ) return;
+ await deleteUser(user.id);
+ }
+
+ // API for scenarios
+ async '__scenario:create-example-file' (
+ { actor, user },
+ { name, contents },
+ ) {
+ const svc_fs = this.services.get('filesystem');
+ const parent = await svc_fs.node(new NodePathSelector(`/${user.username}/Desktop`));
+ console.log(
+ 'test -> create-example-file',
+ user,
+ name,
+ contents,
+ );
+ const buffer = Buffer.from(contents);
+ const file = {
+ size: buffer.length,
+ name: name,
+ type: 'application/octet-stream',
+ buffer,
+ };
+ const hl_write = new HLWrite();
+ await hl_write.run({
+ actor,
+ user,
+ destination_or_parent: parent,
+ specified_name: name,
+ file,
+ });
+ }
+ async '__scenario:assert-no-access' (
+ { actor, user },
+ { path },
+ ) {
+ const svc_fs = this.services.get('filesystem');
+ const node = await svc_fs.node(new NodePathSelector(path));
+ const ll_read = new LLRead();
+ let expected_e; try {
+ const stream = await ll_read.run({
+ fsNode: node,
+ actor,
+ });
+ } catch (e) {
+ expected_e = e;
+ }
+ if ( ! expected_e ) {
+ return { message: 'expected error, got none' };
+ }
+ }
+ async '__scenario:grant' (
+ { actor, user },
+ { to, permission },
+ ) {
+ const svc_permission = this.services.get('permission');
+ await svc_permission.grant_user_user_permission(actor, to, permission, {}, {});
+ }
+ async '__scenario:assert-access' (
+ { actor, user },
+ { path, level },
+ ) {
+ const svc_fs = this.services.get('filesystem');
+ const svc_acl = this.services.get('acl');
+ const node = await svc_fs.node(new NodePathSelector(path));
+ const has_read = await svc_acl.check(actor, node, 'read');
+ const has_write = await svc_acl.check(actor, node, 'write');
+
+ if ( level !== 'write' && level !== 'read' ) {
+ return {
+ message: 'unexpected value for "level" parameter',
+ };
+ }
+
+ if ( level === 'read' && has_write ) {
+ return {
+ message: 'expected read-only but actor can write',
+ };
+ }
+ if ( level === 'read' && !has_read ) {
+ return {
+ message: 'expected read access but no read access',
+ };
+ }
+ if ( level === 'write' && (!has_write || !has_read) ) {
+ return {
+ message: 'expected write access but no write access',
+ };
+ }
+ if ( level === 'manage' && (!has_write || !has_read) ) {
+ return {
+ message: 'expected write access but no write access',
+ };
+ }
+ }
+}
+
+module.exports = {
+ ShareTestService,
+};
diff --git a/mods/mods_available/kdmod/data/sharetest_scenarios.js b/mods/mods_available/kdmod/data/sharetest_scenarios.js
new file mode 100644
index 0000000000..02c3d61ac7
--- /dev/null
+++ b/mods/mods_available/kdmod/data/sharetest_scenarios.js
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+module.exports = [
+ {
+ sequence: [
+ {
+ title: 'Kyle creates a file',
+ call: 'create-example-file',
+ as: 'testuser_kyle',
+ with: {
+ name: 'example.txt',
+ contents: 'secret file',
+ },
+ },
+ {
+ title: 'Eric tries to access it',
+ call: 'assert-no-access',
+ as: 'testuser_eric',
+ with: {
+ path: '/testuser_kyle/Desktop/example.txt',
+ },
+ },
+ ],
+ },
+ {
+ sequence: [
+ {
+ title: 'Stan creates a file',
+ call: 'create-example-file',
+ as: 'testuser_stan',
+ with: {
+ name: 'example.txt',
+ contents: 'secret file',
+ },
+ },
+ {
+ title: 'Stan grants permission to Eric',
+ call: 'grant',
+ as: 'testuser_stan',
+ with: {
+ to: 'testuser_eric',
+ permission: 'fs:/testuser_stan/Desktop/example.txt:read',
+ },
+ },
+ {
+ title: 'Eric tries to access it',
+ call: 'assert-access',
+ as: 'testuser_eric',
+ with: {
+ path: '/testuser_stan/Desktop/example.txt',
+ level: 'read',
+ },
+ },
+ ],
+ },
+ {
+ sequence: [
+ {
+ title: 'Stan grants Kyle\'s file to Eric',
+ call: 'grant',
+ as: 'testuser_stan',
+ with: {
+ to: 'testuser_eric',
+ permission: 'fs:/testuser_kyle/Desktop/example.txt:read',
+ },
+ },
+ {
+ title: 'Eric tries to access it',
+ call: 'assert-no-access',
+ as: 'testuser_eric',
+ with: {
+ path: '/testuser_kyle/Desktop/example.txt',
+ },
+ },
+ ],
+ },
+];
diff --git a/mods/mods_available/kdmod/gui/main.js b/mods/mods_available/kdmod/gui/main.js
new file mode 100644
index 0000000000..cdcb7f7231
--- /dev/null
+++ b/mods/mods_available/kdmod/gui/main.js
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+const request_examples = [
+ {
+ name: 'entity storage app read',
+ fetch: async (args) => {
+ return await fetch(`${window.api_origin}/drivers/call`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${puter.authToken}`,
+ },
+ body: JSON.stringify({
+ interface: 'puter-apps',
+ method: 'read',
+ args,
+ }),
+ method: 'POST',
+ });
+ },
+ out: async (resp) => {
+ const data = await resp.json();
+ if ( ! data.success ) return data;
+ return data.result;
+ },
+ exec: async function exec (...a) {
+ const resp = await this.fetch(...a);
+ return await this.out(resp);
+ },
+ },
+ {
+ name: 'entity storage app select all',
+ fetch: async () => {
+ return await fetch(`${window.api_origin}/drivers/call`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${puter.authToken}`,
+ },
+ body: JSON.stringify({
+ interface: 'puter-apps',
+ method: 'select',
+ args: { predicate: [] },
+ }),
+ method: 'POST',
+ });
+ },
+ out: async (resp) => {
+ const data = await resp.json();
+ if ( ! data.success ) return data;
+ return data.result;
+ },
+ exec: async function exec (...a) {
+ const resp = await this.fetch(...a);
+ return await this.out(resp);
+ },
+ },
+ {
+ name: 'grant permission from a user to a user',
+ fetch: async (user, perm) => {
+ return await fetch(`${window.api_origin}/auth/grant-user-user`, {
+ 'headers': {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${puter.authToken}`,
+ },
+ 'body': JSON.stringify({
+ target_username: user,
+ permission: perm,
+ }),
+ 'method': 'POST',
+ });
+ },
+ out: async (resp) => {
+ const data = await resp.json();
+ return data;
+ },
+ exec: async function exec (...a) {
+ const resp = await this.fetch(...a);
+ return await this.out(resp);
+ },
+ },
+ {
+ name: 'write file',
+ fetch: async (path, str) => {
+ const endpoint = `${window.api_origin}/write`;
+ const token = puter.authToken;
+
+ const blob = new Blob([str], { type: 'text/plain' });
+ const formData = new FormData();
+ formData.append('create_missing_ancestors', true);
+ formData.append('path', path);
+ formData.append('size', 8);
+ formData.append('overwrite', true);
+ formData.append('file', blob, 'something.txt');
+
+ const response = await fetch(endpoint, {
+ method: 'POST',
+ headers: { 'Authorization': `Bearer ${token}` },
+ body: formData,
+ });
+ return await response.json();
+ },
+ },
+];
+
+globalThis.reqex = request_examples;
+
+globalThis.service_script(api => {
+ api.on_ready(() => {
+ });
+});
diff --git a/mods/mods_available/kdmod/module.js b/mods/mods_available/kdmod/module.js
new file mode 100644
index 0000000000..c2d38a5f2d
--- /dev/null
+++ b/mods/mods_available/kdmod/module.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+extension.on('install', ({ services }) => {
+ const { CustomPuterService } = require('./CustomPuterService.js');
+ services.registerService('__custom-puter', CustomPuterService);
+
+ const { ShareTestService } = require('./ShareTestService.js');
+ services.registerService('__share-test', ShareTestService);
+});
diff --git a/mods/mods_available/kdmod/package.json b/mods/mods_available/kdmod/package.json
new file mode 100644
index 0000000000..26da3846e2
--- /dev/null
+++ b/mods/mods_available/kdmod/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "custom-puter-mod",
+ "version": "1.0.0",
+ "description": "",
+ "main": "module.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "AGPL-3.0-only"
+}
diff --git a/mods/mods_available/test-actions/main.js b/mods/mods_available/test-actions/main.js
new file mode 100644
index 0000000000..3d234f151a
--- /dev/null
+++ b/mods/mods_available/test-actions/main.js
@@ -0,0 +1,138 @@
+/*
+ * Test-actions extension: declarative actions page for testing user suspension
+ * and other admin actions. All changes in this single file.
+ */
+
+const { db } = extension.import('data');
+const { invalidate_cached_user } = use('core.util.helpers');
+
+// Declarative actions: id, label, and inputs drive the generated GUI.
+const ACTIONS = [
+ {
+ id: 'suspend-user',
+ label: 'Suspend user',
+ inputs: [
+ { name: 'username', label: 'Username', type: 'text' },
+ ],
+ },
+ // Add more actions here; each needs a handler in INVOKE_HANDLERS.
+];
+
+// Handlers for each action id. Receives (req, res, body).
+const INVOKE_HANDLERS = {
+ 'suspend-user': async (req, res, body) => {
+ const username = body?.username?.trim();
+ if ( ! username ) {
+ return res.status(400).json({ ok: false, error: 'username is required' });
+ }
+ const svc_get_user = req.services.get('get-user');
+ const user = await svc_get_user.get_user({ username });
+ if ( ! user ) {
+ return res.status(404).json({ ok: false, error: 'User not found' });
+ }
+ await db.write('UPDATE `user` SET suspended = 1 WHERE id = ? LIMIT 1', [user.id]);
+ invalidate_cached_user(user);
+ // Cache invalidation would require backend helpers (ESM); skipped here.
+ return res.json({ ok: true, message: `User "${username}" suspended.` });
+ },
+};
+
+const PAGE_HTML = (actionsJson) => `
+
+
+
+ Test actions
+
+
+
+ Test actions
+
+
+
+
+`;
+
+extension.get('/test-actions', (req, res) => {
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
+ res.send(PAGE_HTML(JSON.stringify(ACTIONS)));
+});
+
+extension.post('/test-actions/invoke/:actionId', async (req, res) => {
+ const actionId = req.params.actionId;
+ const handler = INVOKE_HANDLERS[actionId];
+ if ( ! handler ) {
+ return res.status(404).json({ ok: false, error: 'Unknown action' });
+ }
+ return handler(req, res, req.body || {});
+});
+
+extension.on('ai.prompt.validate', async event => {
+ console.log('ai.prompt.validate');
+ const messages = event.parameters?.messages ?? [];
+ console.log(`ai prompt validate: ${messages.length} messages`);
+
+ console.log('is user suspended?', event.actor.type.user.suspended);
+});
diff --git a/mods/mods_available/test-actions/package.json b/mods/mods_available/test-actions/package.json
new file mode 100644
index 0000000000..d75646375c
--- /dev/null
+++ b/mods/mods_available/test-actions/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "@heyputer/test-actions",
+ "version": "1.0.0",
+ "description": "Actions for test purposes",
+ "main": "main.js",
+ "type": "module",
+ "private": true
+}
\ No newline at end of file
diff --git a/mods/mods_available/testex.js b/mods/mods_available/testex.js
new file mode 100644
index 0000000000..07911b8012
--- /dev/null
+++ b/mods/mods_available/testex.js
@@ -0,0 +1,145 @@
+// Test extension for event listeners
+
+extension.on('ai.prompt.complete', event => {
+ console.log('GOT AI.PROMPT.COMPLETE EVENT', event);
+});
+
+extension.on('ai.prompt.validate', event => {
+ console.log('GOT AI.PROMPT.VALIDATE EVENT', event);
+});
+
+extension.on('app.new-icon', event => {
+ console.log('GOT APP.NEW-ICON EVENT', event);
+});
+
+extension.on('app.rename', event => {
+ console.log('GOT APP.RENAME EVENT', event);
+});
+
+extension.on('apps.invalidate', event => {
+ console.log('GOT APPS.INVALIDATE EVENT', event);
+});
+
+extension.on('email.validate', event => {
+ console.log('GOT EMAIL.VALIDATE EVENT', event);
+});
+
+extension.on('fs.create.directory', event => {
+ console.log('GOT FS.CREATE.DIRECTORY EVENT', event);
+});
+
+extension.on('fs.create.file', event => {
+ console.log('GOT FS.CREATE.FILE EVENT', event);
+});
+
+extension.on('fs.create.shortcut', event => {
+ console.log('GOT FS.CREATE.SHORTCUT EVENT', event);
+});
+
+extension.on('fs.create.symlink', event => {
+ console.log('GOT FS.CREATE.SYMLINK EVENT', event);
+});
+
+extension.on('fs.move.file', event => {
+ console.log('GOT FS.MOVE.FILE EVENT', event);
+});
+
+extension.on('fs.pending.file', event => {
+ console.log('GOT FS.PENDING.FILE EVENT', event);
+});
+
+extension.on('fs.storage.progress.copy', event => {
+ console.log('GOT FS.STORAGE.PROGRESS.COPY EVENT', event);
+});
+
+extension.on('fs.storage.upload-progress', event => {
+ console.log('GOT FS.STORAGE.UPLOAD-PROGRESS EVENT', event);
+});
+
+extension.on('fs.write.file', event => {
+ console.log('GOT FS.WRITE.FILE EVENT', event);
+});
+
+extension.on('ip.validate', event => {
+ console.log('GOT IP.VALIDATE EVENT', event);
+});
+
+extension.on('outer.fs.write-hash', event => {
+ console.log('GOT OUTER.FS.WRITE-HASH EVENT', event);
+});
+
+extension.on('outer.gui.item.added', event => {
+ console.log('GOT OUTER.GUI.ITEM.ADDED EVENT', event);
+});
+
+extension.on('outer.gui.item.moved', event => {
+ console.log('GOT OUTER.GUI.ITEM.MOVED EVENT', event);
+});
+
+extension.on('outer.gui.item.pending', event => {
+ console.log('GOT OUTER.GUI.ITEM.PENDING EVENT', event);
+});
+
+extension.on('outer.gui.item.updated', event => {
+ console.log('GOT OUTER.GUI.ITEM.UPDATED EVENT', event);
+});
+
+extension.on('outer.gui.notif.ack', event => {
+ console.log('GOT OUTER.GUI.NOTIF.ACK EVENT', event);
+});
+
+extension.on('outer.gui.notif.message', event => {
+ console.log('GOT OUTER.GUI.NOTIF.MESSAGE EVENT', event);
+});
+
+extension.on('outer.gui.notif.persisted', event => {
+ console.log('GOT OUTER.GUI.NOTIF.PERSISTED EVENT', event);
+});
+
+extension.on('outer.gui.notif.unreads', event => {
+ console.log('GOT OUTER.GUI.NOTIF.UNREADS EVENT', event);
+});
+
+extension.on('outer.gui.submission.done', event => {
+ console.log('GOT OUTER.GUI.SUBMISSION.DONE EVENT', event);
+});
+
+extension.on('puter-exec.submission.done', event => {
+ console.log('GOT PUTER-EXEC.SUBMISSION.DONE EVENT', event);
+});
+
+extension.on('request.measured', event => {
+ console.log('GOT REQUEST.MEASURED EVENT', event);
+});
+
+extension.on('template-service.hello', event => {
+ console.log('GOT TEMPLATE-SERVICE.HELLO EVENT', event);
+});
+
+extension.on('usages.query', event => {
+ console.log('GOT USAGES.QUERY EVENT', event);
+});
+
+extension.on('user.email-changed', event => {
+ console.log('GOT USER.EMAIL-CHANGED EVENT', event);
+});
+
+extension.on('user.email-confirmed', event => {
+ console.log('GOT USER.EMAIL-CONFIRMED EVENT', event);
+});
+
+extension.on('user.save_account', event => {
+ console.log('GOT USER.SAVE_ACCOUNT EVENT', event);
+});
+
+extension.on('web.socket.connected', event => {
+ console.log('GOT WEB.SOCKET.CONNECTED EVENT', event);
+});
+
+extension.on('web.socket.user-connected', event => {
+ console.log('GOT WEB.SOCKET.USER-CONNECTED EVENT', event);
+});
+
+extension.on('wisp.get-policy', event => {
+ console.log('GOT WISP.GET-POLICY EVENT', event);
+});
diff --git a/mods/mods_enabled/.gitignore b/mods/mods_enabled/.gitignore
new file mode 100644
index 0000000000..d6b7ef32c8
--- /dev/null
+++ b/mods/mods_enabled/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/package-lock.json b/package-lock.json
index 143297abaa..f4e2038713 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6179 +1,18946 @@
{
"name": "puter.com",
- "version": "2.1.1",
+ "version": "2.5.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "puter.com",
- "version": "2.1.1",
- "hasInstallScript": true,
+ "version": "2.5.1",
"license": "AGPL-3.0-only",
"workspaces": [
- "packages/*"
+ "src/*",
+ "tools/*",
+ "experiments/js-parse-and-output"
],
"dependencies": {
+ "@ai-sdk/openai": "^3.0.25",
+ "@anthropic-ai/sdk": "^0.68.0",
+ "@aws-sdk/client-dynamodb": "^3.490.0",
+ "@aws-sdk/client-s3": "^3.1020.0",
+ "@aws-sdk/client-secrets-manager": "^3.879.0",
+ "@aws-sdk/client-sns": "^3.907.0",
+ "@aws-sdk/credential-providers": "^3.1021.0",
+ "@aws-sdk/lib-dynamodb": "^3.490.0",
+ "@emnapi/core": "1.9.2",
+ "@emnapi/runtime": "1.9.2",
+ "@google/genai": "^1.19.0",
+ "@heyputer/putility": "^1.0.2",
+ "@paralleldrive/cuid2": "^2.2.2",
+ "@stylistic/eslint-plugin-js": "^4.4.1",
+ "ai": "^6.0.73",
+ "dedent": "^1.5.3",
+ "dynalite": "^4.0.0",
+ "express": "^4.18.2",
+ "express-xml-bodyparser": "^0.4.1",
+ "fauxqs": "^2.5.0",
+ "file-type": "21.3.3",
+ "javascript-time-ago": "^2.5.11",
+ "json-colorizer": "^3.0.1",
+ "music-metadata": "11.12.3",
+ "open": "^10.1.0",
+ "parse-domain": "^8.2.2",
+ "string-template": "^1.0.0",
"uuid": "^9.0.1"
},
"devDependencies": {
+ "@eslint/js": "^9.35.0",
+ "@playwright/test": "^1.56.1",
+ "@stylistic/eslint-plugin": "^5.3.1",
+ "@types/express": "^4.17.21",
+ "@types/mime-types": "^3.0.1",
+ "@types/uuid": "^10.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.46.1",
+ "@typescript-eslint/parser": "^8.46.1",
+ "@vitest/coverage-v8": "^4.0.14",
+ "@vitest/ui": "^4.0.14",
"chalk": "^4.1.0",
"clean-css": "^5.3.2",
"dotenv": "^16.4.5",
- "express": "^4.18.2",
+ "eslint": "^9.35.0",
+ "eslint-rule-composer": "^0.3.0",
+ "globals": "^15.15.0",
"html-entities": "^2.3.3",
+ "html-webpack-plugin": "^5.6.0",
+ "husky": "^9.1.7",
+ "license-check-and-add": "^4.0.5",
+ "mocha": "^7.2.0",
"nodemon": "^3.1.0",
+ "simple-git": "^3.32.3",
+ "typescript": "^5.4.5",
"uglify-js": "^3.17.4",
+ "vite-plugin-static-copy": "^3.3.0",
+ "vitest": "^4.0.14",
"webpack": "^5.88.2",
- "webpack-cli": "^5.1.1"
+ "webpack-cli": "^5.1.1",
+ "yaml": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=24.0.0"
+ },
+ "optionalDependencies": {
+ "@emnapi/core": "^1.9.2",
+ "@emnapi/runtime": "^1.9.2",
+ "sharp": "^0.34.4",
+ "sharp-bmp": "^0.1.5",
+ "sharp-ico": "^0.1.5"
}
},
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "dev": true,
+ "node_modules/@ai-sdk/gateway": {
+ "version": "3.0.95",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.95.tgz",
+ "integrity": "sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/provider-utils": "4.0.23",
+ "@vercel/oidc": "3.1.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
}
},
- "node_modules/@babel/code-frame": {
- "version": "7.24.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
- "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
- "dev": true,
+ "node_modules/@ai-sdk/openai": {
+ "version": "3.0.52",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.52.tgz",
+ "integrity": "sha512-4Rr8NCGmfWTz6DCUvixn9UmyZcMatiHn0zWoMzI3JCUe9R1P/vsPOpCBALKoSzVYOjyJnhtnVIbfUKujcS39uw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/highlight": "^7.24.2",
- "picocolors": "^1.0.0"
+ "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/provider-utils": "4.0.23"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
}
},
- "node_modules/@babel/compat-data": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz",
- "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==",
- "dev": true,
+ "node_modules/@ai-sdk/provider": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz",
+ "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "json-schema": "^0.4.0"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/@babel/core": {
- "version": "7.24.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
- "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.2",
- "@babel/generator": "^7.24.1",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.24.1",
- "@babel/parser": "^7.24.1",
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
+ "node_modules/@ai-sdk/provider-utils": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz",
+ "integrity": "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/provider": "3.0.8",
+ "@standard-schema/spec": "^1.1.0",
+ "eventsource-parser": "^3.0.6"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
}
},
- "node_modules/@babel/core/node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- },
- "node_modules/@babel/core/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
+ "node_modules/@anthropic-ai/sdk": {
+ "version": "0.68.0",
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.68.0.tgz",
+ "integrity": "sha512-SMYAmbbiprG8k1EjEPMTwaTqssDT7Ae+jxcR5kWXiqTlbwMR2AthXtscEVWOHkRfyAV5+y3PFYTJRNa3OJWIEw==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "json-schema-to-ts": "^3.1.1"
},
- "engines": {
- "node": ">=6.0"
+ "bin": {
+ "anthropic-ai-sdk": "bin/cli"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
},
"peerDependenciesMeta": {
- "supports-color": {
+ "zod": {
"optional": true
}
}
},
- "node_modules/@babel/core/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@asamuzakjp/css-color": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.9.tgz",
+ "integrity": "sha512-zd9c/Wdso6v1U7v6w3i/hbAr4K7NaSHImdpvmLt+Y9ea5BhilnIGNkfhOJ7FEIuPipAnE9tZeDOll05WDT0kgg==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^3.1.1",
+ "@csstools/css-color-parser": "^4.0.2",
+ "@csstools/css-parser-algorithms": "^4.0.0",
+ "@csstools/css-tokenizer": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
- "node_modules/@babel/generator": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz",
- "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
+ "node_modules/@asamuzakjp/dom-selector": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.9.tgz",
+ "integrity": "sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.24.0",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
+ "@asamuzakjp/nwsapi": "^2.3.9",
+ "bidi-js": "^1.0.3",
+ "css-tree": "^3.2.1",
+ "is-potential-custom-element-name": "^1.0.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "node_modules/@asamuzakjp/nwsapi": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
+ "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@aws-crypto/crc32": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
+ "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
- "browserslist": "^4.22.2",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=16.0.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
+ "node_modules/@aws-crypto/crc32c": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz",
+ "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==",
+ "license": "Apache-2.0",
"dependencies": {
- "yallist": "^3.0.2"
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/@aws-crypto/sha1-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz",
+ "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
- "dev": true,
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
- "dev": true,
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
- "dev": true,
+ "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-module-imports": {
- "version": "7.24.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz",
- "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
+ "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/types": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "@aws-crypto/sha256-js": "^5.2.0",
+ "@aws-crypto/supports-web-crypto": "^5.2.0",
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/helper-string-parser": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
- "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+ "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^5.2.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=16.0.0"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
+ "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
}
},
- "node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "node_modules/@aws-crypto/util": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+ "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@babel/helpers": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz",
- "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
- "dev": true,
+ "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0"
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.24.2",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz",
- "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
- "dev": true,
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
+ "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "license": "Apache-2.0",
"dependencies": {
- "color-convert": "^1.9.0"
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=4"
+ "node": ">=14.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
+ "node_modules/@aws-sdk/client-cloudwatch": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.1028.0.tgz",
+ "integrity": "sha512-VKo8xQZzCO8CpwfytSP1pr75+YGUPqg2m8Ki3WKhkDOr7qKU6GssDoob3cCR9QThmgTLc7D+pM1SOUmvRccnhw==",
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-compression": "^4.3.43",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/util-waiter": "^4.2.15",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=4"
+ "node": ">=20.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
+ "node_modules/@aws-sdk/client-cloudwatch/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "color-name": "1.1.3"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
+ "node_modules/@aws-sdk/client-cognito-identity": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.1028.0.tgz",
+ "integrity": "sha512-T94NnSifr6PPd66exnzK+QS7tQfo/tTw7ZvkHh6FmcepK4mFNm12s5OEIu/XYiVWSX4RaBCwYIAZvcjqXnWHGQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=0.8.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
+ "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=18.0.0"
}
},
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
+ "node_modules/@aws-sdk/client-dynamodb": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.1028.0.tgz",
+ "integrity": "sha512-OkO2p9Wm+6CccOfQcdYjvCAJdUfBSWbmrIKXGh/qbBjp0B8d1MsYl1Exps5OzRSzqLVuTUVjPJCkgSMJF/mPqg==",
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "has-flag": "^3.0.0"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/dynamodb-codec": "^3.972.28",
+ "@aws-sdk/middleware-endpoint-discovery": "^3.972.10",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/util-waiter": "^4.2.15",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=4"
+ "node": ">=20.0.0"
}
},
- "node_modules/@babel/parser": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
- "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
+ "node_modules/@aws-sdk/client-dynamodb/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@babel/runtime": {
- "version": "7.24.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
- "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
- "dev": true,
+ "node_modules/@aws-sdk/client-polly": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-polly/-/client-polly-3.1028.0.tgz",
+ "integrity": "sha512-/5BvY3U1rR7yqKHQOxOUJkit7rTbOeExUSRCpSNMx1+TzdTWj6u9OAxcNPUwmVCuRWoDTvCsX8DFHbOcOesNAw==",
+ "license": "Apache-2.0",
"dependencies": {
- "regenerator-runtime": "^0.14.0"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/eventstream-handler-node": "^3.972.13",
+ "@aws-sdk/middleware-eventstream": "^3.972.9",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/eventstream-serde-browser": "^4.2.13",
+ "@smithy/eventstream-serde-config-resolver": "^4.3.13",
+ "@smithy/eventstream-serde-node": "^4.2.13",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-stream": "^4.5.22",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@babel/runtime/node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "dev": true
- },
- "node_modules/@babel/template": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
- "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
- "dev": true,
+ "node_modules/@aws-sdk/client-polly/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.24.0",
- "@babel/types": "^7.24.0"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@babel/traverse": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz",
- "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.24.1",
- "@babel/generator": "^7.24.1",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.24.1",
- "@babel/types": "^7.24.0",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1028.0.tgz",
+ "integrity": "sha512-KL8PREFJxyWXUjMQR6Krq/OjZ5qbcV1QFjtA7Q7oMW5XaFO9YoSBtBxQeeXO4um6vYSmRVYVDTvEKZDcNbyeXw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha1-browser": "5.2.0",
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-bucket-endpoint": "^3.972.9",
+ "@aws-sdk/middleware-expect-continue": "^3.972.9",
+ "@aws-sdk/middleware-flexible-checksums": "^3.974.7",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-location-constraint": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-sdk-s3": "^3.972.28",
+ "@aws-sdk/middleware-ssec": "^3.972.9",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/signature-v4-multi-region": "^3.996.16",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/eventstream-serde-browser": "^4.2.13",
+ "@smithy/eventstream-serde-config-resolver": "^4.3.13",
+ "@smithy/eventstream-serde-node": "^4.2.13",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-blob-browser": "^4.2.14",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/hash-stream-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/md5-js": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-stream": "^4.5.22",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/util-waiter": "^4.2.15",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@babel/traverse/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
+ "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "ms": "2.1.2"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">=18.0.0"
}
},
- "node_modules/@babel/traverse/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/@babel/types": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
- "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
- "dev": true,
+ "node_modules/@aws-sdk/client-secrets-manager": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1028.0.tgz",
+ "integrity": "sha512-Vj+pgAb8raFIxUh0WCFI3fhYY68lN1tGFPj+EFauB8EUbgz9BA3TuI8plFRXvq+h9m1gXvW/VbQTzCxkoeChdA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
- "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=0.1.90"
+ "node": ">=18.0.0"
}
},
- "node_modules/@dabh/diagnostics": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
- "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "node_modules/@aws-sdk/client-sns": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.1028.0.tgz",
+ "integrity": "sha512-izYwsbiPwCQxmGAl2KAT2ZWcZd6Gg2+ylw51zOblwxRZIJ0xXHiltDr5gXadXaa3B5h02oW3TNe8Qq/PNK7iBg==",
+ "license": "Apache-2.0",
"dependencies": {
- "colorspace": "1.1.x",
- "enabled": "2.0.x",
- "kuler": "^2.0.0"
- }
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true,
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=10.0.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@grpc/grpc-js": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.4.tgz",
- "integrity": "sha512-MqBisuxTkYvPFnEiu+dag3xG/NBUDzSbAFAWlzfkGnQkjVZ6by3h4atbBc+Ikqup1z5BfB4BN18gKWR1YyppNw==",
+ "node_modules/@aws-sdk/client-sns/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@grpc/proto-loader": "^0.7.10",
- "@js-sdsl/ordered-map": "^4.4.2"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=12.10.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@grpc/proto-loader": {
- "version": "0.7.12",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz",
- "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==",
+ "node_modules/@aws-sdk/client-sqs": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1028.0.tgz",
+ "integrity": "sha512-lysXICi1hSF0J2zUasEhNU8JeQQduJBfdfB0EvqpJ/8Dw904Ls7ZOOKR40Pkyfy4EPdm+VuDBDRVRXZM9hPIcw==",
+ "license": "Apache-2.0",
"dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.4",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-sdk-sqs": "^3.972.19",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/md5-js": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/b64": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz",
- "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==",
+ "node_modules/@aws-sdk/client-sqs/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/hoek": "9.x.x"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/@hapi/boom": {
- "version": "9.1.4",
- "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
- "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
+ "node_modules/@aws-sdk/client-textract": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.1028.0.tgz",
+ "integrity": "sha512-zZ84Kf92/x/HoT9jowB5ulhOJuRtaoXm8XAQE+AGVt6NK1JxECENDnMVHueJqedhIypRjmTLqQjhcGFJE+uNxw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/hoek": "9.x.x"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/bourne": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz",
- "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q=="
- },
- "node_modules/@hapi/cryptiles": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz",
- "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==",
+ "node_modules/@aws-sdk/client-textract/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/boom": "9.x.x"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@hapi/hoek": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
- "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
- },
- "node_modules/@hapi/iron": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz",
- "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==",
+ "node_modules/@aws-sdk/core": {
+ "version": "3.973.27",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.27.tgz",
+ "integrity": "sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/b64": "5.x.x",
- "@hapi/boom": "9.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/cryptiles": "5.x.x",
- "@hapi/hoek": "9.x.x"
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/xml-builder": "^3.972.17",
+ "@smithy/core": "^3.23.14",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/signature-v4": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/podium": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz",
- "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==",
+ "node_modules/@aws-sdk/crc64-nvme": {
+ "version": "3.972.6",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.6.tgz",
+ "integrity": "sha512-NMbiqKdruhwwgI6nzBVe2jWMkXjaoQz2YOs3rFX+2F3gGyrJDkDPwMpV/RsTFeq2vAQ055wZNtOXFK4NYSkM8g==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/hoek": "9.x.x",
- "@hapi/teamwork": "5.x.x",
- "@hapi/validate": "1.x.x"
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/teamwork": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz",
- "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==",
+ "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+ "version": "3.972.22",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.22.tgz",
+ "integrity": "sha512-ih6ORpme4i2qJqGckOQ9Lt2iiZ+5tm3bnfsT5TwoPyFnuDURXv3OdhYa3Nr/m0iJr38biqKYKdGKb5GR1KB2hw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=12.0.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/topo": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
- "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.972.25",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.25.tgz",
+ "integrity": "sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/hoek": "^9.0.0"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@hapi/validate": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz",
- "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==",
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.972.27",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.27.tgz",
+ "integrity": "sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@hapi/hoek": "^9.0.0",
- "@hapi/topo": "^5.0.0"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-stream": "^4.5.22",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@heyputer/backend": {
- "resolved": "packages/backend",
- "link": true
- },
- "node_modules/@heyputer/kv.js": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/@heyputer/kv.js/-/kv.js-0.1.6.tgz",
- "integrity": "sha512-p/aYYHVG6wp/z33rfq2bmc7KgfBP6pE7urnQcnAm8xTN3+U0i2hItXH7bBTJOgsmjqk59I1YUOzcjOTlLrZ26w==",
+ "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "minimatch": "^9.0.0"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/@heyputer/kv.js/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.29.tgz",
+ "integrity": "sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==",
+ "license": "Apache-2.0",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-env": "^3.972.25",
+ "@aws-sdk/credential-provider-http": "^3.972.27",
+ "@aws-sdk/credential-provider-login": "^3.972.29",
+ "@aws-sdk/credential-provider-process": "^3.972.25",
+ "@aws-sdk/credential-provider-sso": "^3.972.29",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.29",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/credential-provider-imds": "^4.2.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@heyputer/kv.js/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "node_modules/@aws-sdk/credential-provider-login": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.29.tgz",
+ "integrity": "sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=20.0.0"
}
},
- "node_modules/@heyputer/multest": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/@heyputer/multest/-/multest-0.0.2.tgz",
- "integrity": "sha512-Hr4U9Z2/oMIyCKv+cgO3pNzncA4PAlkS9RotZwoicfzR2BLLu2Rjjp3/HpcLmtE7UEt0hlRMYP+ImMZPYGNwkg==",
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.972.30",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.30.tgz",
+ "integrity": "sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==",
+ "license": "Apache-2.0",
"dependencies": {
- "append-field": "^1.0.0",
- "busboy": "^1.6.0",
- "form-data": "^4.0.0"
+ "@aws-sdk/credential-provider-env": "^3.972.25",
+ "@aws-sdk/credential-provider-http": "^3.972.27",
+ "@aws-sdk/credential-provider-ini": "^3.972.29",
+ "@aws-sdk/credential-provider-process": "^3.972.25",
+ "@aws-sdk/credential-provider-sso": "^3.972.29",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.29",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/credential-provider-imds": "^4.2.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.972.25",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.25.tgz",
+ "integrity": "sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=20.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.29.tgz",
+ "integrity": "sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==",
+ "license": "Apache-2.0",
"dependencies": {
- "sprintf-js": "~1.0.2"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/token-providers": "3.1026.0",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.29.tgz",
+ "integrity": "sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=20.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-providers": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1028.0.tgz",
+ "integrity": "sha512-ceaO4TnRycUoJl/1hNCdwWJLKHVF4R82YtBY6QE2SF1JVkrnR/WZu/yF1n1fPLuvYQlXW7OIOT9df7t2bfXM2Q==",
+ "license": "Apache-2.0",
"dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "@aws-sdk/client-cognito-identity": "3.1028.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/credential-provider-cognito-identity": "^3.972.22",
+ "@aws-sdk/credential-provider-env": "^3.972.25",
+ "@aws-sdk/credential-provider-http": "^3.972.27",
+ "@aws-sdk/credential-provider-ini": "^3.972.29",
+ "@aws-sdk/credential-provider-login": "^3.972.29",
+ "@aws-sdk/credential-provider-node": "^3.972.30",
+ "@aws-sdk/credential-provider-process": "^3.972.25",
+ "@aws-sdk/credential-provider-sso": "^3.972.29",
+ "@aws-sdk/credential-provider-web-identity": "^3.972.29",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/credential-provider-imds": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@jimp/bmp": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.12.tgz",
- "integrity": "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==",
+ "node_modules/@aws-sdk/dynamodb-codec": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.972.28.tgz",
+ "integrity": "sha512-wx5jKLKPVJRsr/dwK9Xp26+SDb95xHlZU9Bgm2AglnMxQ0DlRlq3PyKlGi9y0OCuWZ7hLNcQJ7uDSN+PgsiuGg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12",
- "bmp-js": "^0.1.0"
+ "@aws-sdk/core": "^3.973.27",
+ "@smithy/core": "^3.23.14",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-base64": "^4.3.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
- }
- },
- "node_modules/@jimp/core": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.12.tgz",
- "integrity": "sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA==",
- "dependencies": {
- "@jimp/utils": "^0.22.12",
- "any-base": "^1.1.0",
- "buffer": "^5.2.0",
- "exif-parser": "^0.1.12",
- "file-type": "^16.5.4",
- "isomorphic-fetch": "^3.0.0",
- "pixelmatch": "^4.0.2",
- "tinycolor2": "^1.6.0"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/core/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
+ "node_modules/@aws-sdk/endpoint-cache": {
+ "version": "3.972.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.972.5.tgz",
+ "integrity": "sha512-itVdge0NozgtgmtbZ25FVwWU3vGlE7x7feE/aOEJNkQfEpbkrF8Rj1QmnK+2blFfYE1xWt/iU+6/jUp/pv1+MA==",
+ "license": "Apache-2.0",
"dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "mnemonist": "0.38.3",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/core/node_modules/file-type": {
- "version": "16.5.4",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz",
- "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==",
+ "node_modules/@aws-sdk/eventstream-handler-node": {
+ "version": "3.972.13",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.972.13.tgz",
+ "integrity": "sha512-2Pi1kD0MDkMAxDHqvpi/hKMs9hXUYbj2GLEjCwy+0jzfLChAsF50SUYnOeTI+RztA+Ic4pnLAdB03f1e8nggxQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "readable-web-to-node-stream": "^3.0.0",
- "strtok3": "^6.2.4",
- "token-types": "^4.1.1"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/eventstream-codec": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/core/node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/@jimp/core/node_modules/peek-readable": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
- "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==",
+ "node_modules/@aws-sdk/lib-dynamodb": {
+ "version": "3.1028.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.1028.0.tgz",
+ "integrity": "sha512-/DRWE5DPlM74xrSf6AqT8mxNo+ZSUiegwTVdZAVxa9iaQqZn4ZVgv8gP8fPrhG7LA8Twr9uuUlVz2B8tb0pSAA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/util-dynamodb": "^3.996.2",
+ "@smithy/core": "^3.23.14",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=20.0.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "peerDependencies": {
+ "@aws-sdk/client-dynamodb": "^3.1028.0"
}
},
- "node_modules/@jimp/core/node_modules/strtok3": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz",
- "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==",
+ "node_modules/@aws-sdk/middleware-bucket-endpoint": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.9.tgz",
+ "integrity": "sha512-COToYKgquDyligbcAep7ygs48RK+mwe/IYprq4+TSrVFzNOYmzWvHf6werpnKV5VYpRiwdn+Wa5ZXkPqLVwcTg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@tokenizer/token": "^0.3.0",
- "peek-readable": "^4.1.0"
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-arn-parser": "^3.972.3",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-config-provider": "^4.2.2",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/core/node_modules/token-types": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz",
- "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==",
+ "node_modules/@aws-sdk/middleware-endpoint-discovery": {
+ "version": "3.972.10",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.972.10.tgz",
+ "integrity": "sha512-b3hf8dPxWonxFKgxBijMehVblgbY0gPprTvyuHYMxnOPfiCIY467kZltPoeOCQYLr9v0v0HuL9fIGtT6utd15w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
+ "@aws-sdk/endpoint-cache": "^3.972.5",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/custom": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz",
- "integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==",
+ "node_modules/@aws-sdk/middleware-eventstream": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.972.9.tgz",
+ "integrity": "sha512-ypgOvpWxQTCnQyDHGxnTviqqANE7FIIzII7VczJnTPCJcJlu17hMQXnvE47aKSKsawVJAaaRsyOEbHQuLJF9ng==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/core": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/gif": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.12.tgz",
- "integrity": "sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg==",
+ "node_modules/@aws-sdk/middleware-expect-continue": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.9.tgz",
+ "integrity": "sha512-V/FNCjFxnh4VGu+HdSiW4Yg5GELihA1MIDSAdsEPvuayXBVmr0Jaa6jdLAZLH38KYXl/vVjri9DQJWnTAujHEA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12",
- "gifwrap": "^0.10.1",
- "omggif": "^1.0.9"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/jpeg": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.12.tgz",
- "integrity": "sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q==",
+ "node_modules/@aws-sdk/middleware-flexible-checksums": {
+ "version": "3.974.7",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.7.tgz",
+ "integrity": "sha512-uU4/ch2CLHB8Phu1oTKnnQ4e8Ujqi49zEnQYBhWYT53zfFvtJCdGsaOoypBr8Fm/pmCBssRmGoIQ4sixgdLP9w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12",
- "jpeg-js": "^0.4.4"
+ "@aws-crypto/crc32": "5.2.0",
+ "@aws-crypto/crc32c": "5.2.0",
+ "@aws-crypto/util": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/crc64-nvme": "^3.972.6",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/is-array-buffer": "^4.2.2",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-stream": "^4.5.22",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-blit": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz",
- "integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==",
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.9.tgz",
+ "integrity": "sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-blur": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz",
- "integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==",
+ "node_modules/@aws-sdk/middleware-location-constraint": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.9.tgz",
+ "integrity": "sha512-TyfOi2XNdOZpNKeTJwRUsVAGa+14nkyMb2VVGG+eDgcWG/ed6+NUo72N3hT6QJioxym80NSinErD+LBRF0Ir1w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-circle": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.12.tgz",
- "integrity": "sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg==",
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.9.tgz",
+ "integrity": "sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-color": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz",
- "integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==",
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.972.10",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.10.tgz",
+ "integrity": "sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12",
- "tinycolor2": "^1.6.0"
+ "@aws-sdk/types": "^3.973.7",
+ "@aws/lambda-invoke-store": "^0.2.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-contain": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.12.tgz",
- "integrity": "sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ==",
+ "node_modules/@aws-sdk/middleware-sdk-s3": {
+ "version": "3.972.28",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.28.tgz",
+ "integrity": "sha512-qJHcJQH9UNPUrnPlRtCozKjtqAaypQ5IgQxTNoPsVYIQeuwNIA8Rwt3NvGij1vCDYDfCmZaPLpnJEHlZXeFqmg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-arn-parser": "^3.972.3",
+ "@smithy/core": "^3.23.14",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/signature-v4": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-config-provider": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-stream": "^4.5.22",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-blit": ">=0.3.5",
- "@jimp/plugin-resize": ">=0.3.5",
- "@jimp/plugin-scale": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-cover": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.12.tgz",
- "integrity": "sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA==",
+ "node_modules/@aws-sdk/middleware-sdk-sqs": {
+ "version": "3.972.19",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.19.tgz",
+ "integrity": "sha512-S7AWsrOTcs52AdS4uWPtP6n7tloOscfeNfJWK4wvNPJBI01lrfHb6g+tYRckwDzruhhdaPpn/CARZ+YPw6oMGw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-crop": ">=0.3.5",
- "@jimp/plugin-resize": ">=0.3.5",
- "@jimp/plugin-scale": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-crop": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz",
- "integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==",
+ "node_modules/@aws-sdk/middleware-ssec": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.9.tgz",
+ "integrity": "sha512-wSA2BR7L0CyBNDJeSrleIIzC+DzL93YNTdfU0KPGLiocK6YsRv1nPAzPF+BFSdcs0Qa5ku5Kcf4KvQcWwKGenQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-displace": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.12.tgz",
- "integrity": "sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA==",
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.972.29",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.29.tgz",
+ "integrity": "sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@smithy/core": "^3.23.14",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-retry": "^4.3.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-dither": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.12.tgz",
- "integrity": "sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw==",
+ "node_modules/@aws-sdk/nested-clients": {
+ "version": "3.996.19",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.19.tgz",
+ "integrity": "sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/middleware-host-header": "^3.972.9",
+ "@aws-sdk/middleware-logger": "^3.972.9",
+ "@aws-sdk/middleware-recursion-detection": "^3.972.10",
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/region-config-resolver": "^3.972.11",
+ "@aws-sdk/types": "^3.973.7",
+ "@aws-sdk/util-endpoints": "^3.996.6",
+ "@aws-sdk/util-user-agent-browser": "^3.972.9",
+ "@aws-sdk/util-user-agent-node": "^3.973.15",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/core": "^3.23.14",
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/hash-node": "^4.2.13",
+ "@smithy/invalid-dependency": "^4.2.13",
+ "@smithy/middleware-content-length": "^4.2.13",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-retry": "^4.5.0",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-body-length-node": "^4.2.3",
+ "@smithy/util-defaults-mode-browser": "^4.3.45",
+ "@smithy/util-defaults-mode-node": "^4.2.49",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-fisheye": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.12.tgz",
- "integrity": "sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q==",
+ "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/@jimp/plugin-flip": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.12.tgz",
- "integrity": "sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q==",
+ "node_modules/@aws-sdk/region-config-resolver": {
+ "version": "3.972.11",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.11.tgz",
+ "integrity": "sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-rotate": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-gaussian": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.12.tgz",
- "integrity": "sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg==",
+ "node_modules/@aws-sdk/signature-v4-multi-region": {
+ "version": "3.996.16",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.16.tgz",
+ "integrity": "sha512-EMdXYB4r/k5RWq86fugjRhid5JA+Z6MpS7n4sij4u5/C+STrkvuf9aFu41rJA9MjUzxCLzv8U2XL8cH2GSRYpQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/middleware-sdk-s3": "^3.972.28",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/signature-v4": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-invert": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.12.tgz",
- "integrity": "sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ==",
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.1026.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1026.0.tgz",
+ "integrity": "sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/core": "^3.973.27",
+ "@aws-sdk/nested-clients": "^3.996.19",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-mask": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.12.tgz",
- "integrity": "sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA==",
+ "node_modules/@aws-sdk/types": {
+ "version": "3.973.7",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.7.tgz",
+ "integrity": "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-normalize": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.12.tgz",
- "integrity": "sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA==",
+ "node_modules/@aws-sdk/util-arn-parser": {
+ "version": "3.972.3",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz",
+ "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-print": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.12.tgz",
- "integrity": "sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ==",
+ "node_modules/@aws-sdk/util-dynamodb": {
+ "version": "3.996.2",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.996.2.tgz",
+ "integrity": "sha512-ddpwaZmjBzcApYN7lgtAXjk+u+GO8fiPsxzuc59UqP+zqdxI1gsenPvkyiHiF9LnYnyRGijz6oN2JylnN561qQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12",
- "load-bmfont": "^1.4.1"
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
},
"peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-blit": ">=0.3.5"
+ "@aws-sdk/client-dynamodb": "^3.1003.0"
}
},
- "node_modules/@jimp/plugin-resize": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz",
- "integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==",
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.996.6",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.6.tgz",
+ "integrity": "sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-endpoints": "^3.3.4",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-rotate": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz",
- "integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==",
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.965.5",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz",
+ "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-blit": ">=0.3.5",
- "@jimp/plugin-crop": ">=0.3.5",
- "@jimp/plugin-resize": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/plugin-scale": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz",
- "integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==",
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.972.9",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.9.tgz",
+ "integrity": "sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
- },
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-resize": ">=0.3.5"
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/types": "^4.14.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
}
},
- "node_modules/@jimp/plugin-shadow": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.12.tgz",
- "integrity": "sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg==",
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.973.15",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.15.tgz",
+ "integrity": "sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/utils": "^0.22.12"
+ "@aws-sdk/middleware-user-agent": "^3.972.29",
+ "@aws-sdk/types": "^3.973.7",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-config-provider": "^4.2.2",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-blur": ">=0.3.5",
- "@jimp/plugin-resize": ">=0.3.5"
- }
- },
- "node_modules/@jimp/plugin-threshold": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.12.tgz",
- "integrity": "sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw==",
- "dependencies": {
- "@jimp/utils": "^0.22.12"
- },
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5",
- "@jimp/plugin-color": ">=0.8.0",
- "@jimp/plugin-resize": ">=0.8.0"
- }
- },
- "node_modules/@jimp/plugins": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.12.tgz",
- "integrity": "sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww==",
- "dependencies": {
- "@jimp/plugin-blit": "^0.22.12",
- "@jimp/plugin-blur": "^0.22.12",
- "@jimp/plugin-circle": "^0.22.12",
- "@jimp/plugin-color": "^0.22.12",
- "@jimp/plugin-contain": "^0.22.12",
- "@jimp/plugin-cover": "^0.22.12",
- "@jimp/plugin-crop": "^0.22.12",
- "@jimp/plugin-displace": "^0.22.12",
- "@jimp/plugin-dither": "^0.22.12",
- "@jimp/plugin-fisheye": "^0.22.12",
- "@jimp/plugin-flip": "^0.22.12",
- "@jimp/plugin-gaussian": "^0.22.12",
- "@jimp/plugin-invert": "^0.22.12",
- "@jimp/plugin-mask": "^0.22.12",
- "@jimp/plugin-normalize": "^0.22.12",
- "@jimp/plugin-print": "^0.22.12",
- "@jimp/plugin-resize": "^0.22.12",
- "@jimp/plugin-rotate": "^0.22.12",
- "@jimp/plugin-scale": "^0.22.12",
- "@jimp/plugin-shadow": "^0.22.12",
- "@jimp/plugin-threshold": "^0.22.12",
- "timm": "^1.6.1"
- },
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
- }
- },
- "node_modules/@jimp/png": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.12.tgz",
- "integrity": "sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg==",
- "dependencies": {
- "@jimp/utils": "^0.22.12",
- "pngjs": "^6.0.0"
+ "engines": {
+ "node": ">=20.0.0"
},
"peerDependencies": {
- "@jimp/custom": ">=0.3.5"
- }
- },
- "node_modules/@jimp/tiff": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.12.tgz",
- "integrity": "sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg==",
- "dependencies": {
- "utif2": "^4.0.1"
+ "aws-crt": ">=1.0.0"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
}
},
- "node_modules/@jimp/types": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.12.tgz",
- "integrity": "sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA==",
+ "node_modules/@aws-sdk/xml-builder": {
+ "version": "3.972.17",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.17.tgz",
+ "integrity": "sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@jimp/bmp": "^0.22.12",
- "@jimp/gif": "^0.22.12",
- "@jimp/jpeg": "^0.22.12",
- "@jimp/png": "^0.22.12",
- "@jimp/tiff": "^0.22.12",
- "timm": "^1.6.1"
+ "@smithy/types": "^4.14.0",
+ "fast-xml-parser": "5.5.8",
+ "tslib": "^2.6.2"
},
- "peerDependencies": {
- "@jimp/custom": ">=0.3.5"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/@jimp/utils": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.12.tgz",
- "integrity": "sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q==",
- "dependencies": {
- "regenerator-runtime": "^0.13.3"
+ "node_modules/@aws/lambda-invoke-store": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
+ "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
+ "node_modules/@babel/code-frame/node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
- "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@js-sdsl/ordered-map": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
- "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/js-sdsl"
+ "url": "https://opencollective.com/babel"
}
},
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
- "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
- "dependencies": {
- "detect-libc": "^2.0.0",
- "https-proxy-agent": "^5.0.0",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.7",
- "nopt": "^5.0.0",
- "npmlog": "^5.0.1",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.11"
- },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
"bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
+ "semver": "bin/semver.js"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "license": "MIT",
"dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=6.9.0"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6.9.0"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
- "engines": {
- "node": ">= 8"
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/@opentelemetry/api": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
- "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "license": "MIT",
"engines": {
- "node": ">=8.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/api-logs": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.40.0.tgz",
- "integrity": "sha512-8WRuvGnfnbeR9ifGjLN8kklk2fkd0gBT6aN7NHO9zeYF/6qacAViD3bwAKqGXKnJgl39l1EU41I9diqUjamEEQ==",
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
- "node": ">=14"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/auto-instrumentations-node": {
- "version": "0.43.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.43.0.tgz",
- "integrity": "sha512-2WvHUSi/QVeVG8ObPD0Ls6WevfIbQjspxIQRuHaQFWXhmEwy/MsEcoQUjbNKXwO5516aS04GTydKEoRKsMwhdA==",
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/instrumentation-amqplib": "^0.35.0",
- "@opentelemetry/instrumentation-aws-lambda": "^0.39.0",
- "@opentelemetry/instrumentation-aws-sdk": "^0.39.1",
- "@opentelemetry/instrumentation-bunyan": "^0.36.0",
- "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0",
- "@opentelemetry/instrumentation-connect": "^0.34.0",
- "@opentelemetry/instrumentation-cucumber": "^0.4.0",
- "@opentelemetry/instrumentation-dataloader": "^0.7.0",
- "@opentelemetry/instrumentation-dns": "^0.34.0",
- "@opentelemetry/instrumentation-express": "^0.36.1",
- "@opentelemetry/instrumentation-fastify": "^0.34.0",
- "@opentelemetry/instrumentation-fs": "^0.10.0",
- "@opentelemetry/instrumentation-generic-pool": "^0.34.0",
- "@opentelemetry/instrumentation-graphql": "^0.38.1",
- "@opentelemetry/instrumentation-grpc": "^0.49.1",
- "@opentelemetry/instrumentation-hapi": "^0.35.0",
- "@opentelemetry/instrumentation-http": "^0.49.1",
- "@opentelemetry/instrumentation-ioredis": "^0.38.0",
- "@opentelemetry/instrumentation-knex": "^0.34.0",
- "@opentelemetry/instrumentation-koa": "^0.38.0",
- "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0",
- "@opentelemetry/instrumentation-memcached": "^0.34.0",
- "@opentelemetry/instrumentation-mongodb": "^0.41.0",
- "@opentelemetry/instrumentation-mongoose": "^0.36.0",
- "@opentelemetry/instrumentation-mysql": "^0.36.0",
- "@opentelemetry/instrumentation-mysql2": "^0.36.0",
- "@opentelemetry/instrumentation-nestjs-core": "^0.35.0",
- "@opentelemetry/instrumentation-net": "^0.34.0",
- "@opentelemetry/instrumentation-pg": "^0.39.1",
- "@opentelemetry/instrumentation-pino": "^0.36.0",
- "@opentelemetry/instrumentation-redis": "^0.37.0",
- "@opentelemetry/instrumentation-redis-4": "^0.37.0",
- "@opentelemetry/instrumentation-restify": "^0.36.0",
- "@opentelemetry/instrumentation-router": "^0.35.0",
- "@opentelemetry/instrumentation-socket.io": "^0.37.0",
- "@opentelemetry/instrumentation-tedious": "^0.8.0",
- "@opentelemetry/instrumentation-winston": "^0.35.0",
- "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7",
- "@opentelemetry/resource-detector-aws": "^1.4.0",
- "@opentelemetry/resource-detector-container": "^0.3.7",
- "@opentelemetry/resource-detector-gcp": "^0.29.7",
- "@opentelemetry/resources": "^1.12.0",
- "@opentelemetry/sdk-node": "^0.49.1"
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
- "node": ">=14"
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.4.1"
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@opentelemetry/context-async-hooks": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz",
- "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==",
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/core": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
- "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.14.0"
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.40.0.tgz",
- "integrity": "sha512-/UW/6s1WBHkFgdwizouUCEGZPt7NE0Y5xpuFuHqQF/KyjcHzTWibXzB/XWOSS81X55FUxrI3Icoeptk7vtxJFQ==",
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "license": "MIT",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/otlp-grpc-exporter-base": "0.40.0",
- "@opentelemetry/otlp-transformer": "0.40.0",
- "@opentelemetry/resources": "1.14.0",
- "@opentelemetry/sdk-trace-base": "1.14.0"
+ "@babel/types": "^7.29.0"
},
- "engines": {
- "node": ">=14"
+ "bin": {
+ "parser": "bin/babel-parser.js"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
- "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "node_modules/@babel/runtime": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/semantic-conventions": "1.14.0"
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz",
- "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==",
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/otlp-exporter-base": "0.49.1",
- "@opentelemetry/otlp-transformer": "0.49.1",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/api-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
- "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
- "node": ">=14"
+ "node": ">=6.9.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
- "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
+ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@bramus/specificity": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz",
+ "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0"
+ "css-tree": "^3.0.0"
},
+ "bin": {
+ "specificity": "bin/cli.js"
+ }
+ },
+ "node_modules/@canvas/image-data": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.1.0.tgz",
+ "integrity": "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==",
+ "license": "MIT"
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": ">=0.1.90"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
- "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
- "dependencies": {
- "@opentelemetry/api-logs": "0.49.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-logs": "0.49.1",
- "@opentelemetry/sdk-metrics": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
- },
+ "node_modules/@csstools/color-helpers": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz",
+ "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
"engines": {
- "node": ">=14"
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz",
+ "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.19.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ "@csstools/css-parser-algorithms": "^4.0.0",
+ "@csstools/css-tokenizer": "^4.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
- "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "node_modules/@csstools/css-color-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz",
+ "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0"
+ "@csstools/color-helpers": "^6.0.2",
+ "@csstools/css-calc": "^3.1.1"
},
"engines": {
- "node": ">=14"
+ "node": ">=20.19.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.9.0",
- "@opentelemetry/api-logs": ">=0.39.1"
+ "@csstools/css-parser-algorithms": "^4.0.0",
+ "@csstools/css-tokenizer": "^4.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
- "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz",
+ "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=14"
+ "node": ">=20.19.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "@csstools/css-tokenizer": "^4.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@csstools/css-syntax-patches-for-csstree": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.2.tgz",
+ "integrity": "sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "peerDependencies": {
+ "css-tree": "^3.2.1"
+ },
+ "peerDependenciesMeta": {
+ "css-tree": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz",
+ "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=14"
+ "node": ">=20.19.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz",
- "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==",
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
+ "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/otlp-exporter-base": "0.49.1",
- "@opentelemetry/otlp-proto-exporter-base": "0.49.1",
- "@opentelemetry/otlp-transformer": "0.49.1",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
- },
+ "@so-ric/colorspace": "^1.1.6",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": ">=10.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/api-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
- "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
+ "node_modules/@emnapi/core": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz",
+ "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@opentelemetry/api": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "node_modules/@emnapi/runtime": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz",
+ "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
- "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@opentelemetry/core": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
- "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "node_modules/@ericcornelissen/lregexp": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@ericcornelissen/lregexp/-/lregexp-1.0.8.tgz",
+ "integrity": "sha512-asaQOkMr8CzYVpmCnBvEe8zejcv8Q1+f3Q1qssOF85njH1VTJfSQUYwwClE41SRdvZmN26uL08GuQk04VN2myA==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/api-logs": "0.49.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-logs": "0.49.1",
- "@opentelemetry/sdk-metrics": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
+ "is-supported-regexp-flag": "^2.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ "bun": "^1.2.0",
+ "deno": "^2.0.0",
+ "node": "^12.20.0 || ^14.13.0 || ^15 || ^16 || ^17 || ^18 || ^19 || ^20 || ^21 || ^22 || ^23 || ^24 || ^25"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
- "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz",
+ "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": ">=14"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.9.0",
- "@opentelemetry/api-logs": ">=0.39.1"
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
- "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@opentelemetry/exporter-zipkin": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz",
- "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "node_modules/@eslint/config-array/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
- "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
+ "brace-expansion": "^1.1.7"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
- }
- },
- "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
"engines": {
- "node": ">=14"
+ "node": "*"
}
},
- "node_modules/@opentelemetry/instrumentation": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz",
- "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "0.49.1",
- "@types/shimmer": "^1.0.2",
- "import-in-the-middle": "1.7.1",
- "require-in-the-middle": "^7.1.1",
- "semver": "^7.5.2",
- "shimmer": "^1.2.1"
+ "@eslint/core": "^0.17.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-amqplib": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz",
- "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==",
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "@types/json-schema": "^7.0.15"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-aws-lambda": {
- "version": "0.39.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz",
- "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==",
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/propagator-aws-xray": "^1.3.1",
- "@opentelemetry/resources": "^1.8.0",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/aws-lambda": "8.10.122"
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">=14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@opentelemetry/instrumentation-aws-sdk": {
- "version": "0.39.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz",
- "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==",
+ "node_modules/@eslint/eslintrc/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/propagation-utils": "^0.30.7",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/@opentelemetry/instrumentation-bunyan": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz",
- "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==",
- "dependencies": {
- "@opentelemetry/api-logs": "^0.49.1",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@types/bunyan": "1.8.9"
- },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=18"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/api-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
- "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
- "dependencies": {
- "@opentelemetry/api": "^1.0.0"
- },
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">= 4"
}
},
- "node_modules/@opentelemetry/instrumentation-cassandra-driver": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz",
- "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==",
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": "*"
}
},
- "node_modules/@opentelemetry/instrumentation-connect": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz",
- "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==",
- "dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/connect": "3.4.36"
- },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
- "node_modules/@opentelemetry/instrumentation-cucumber": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz",
- "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-dataloader": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz",
- "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==",
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1"
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-dns": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz",
- "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "semver": "^7.5.4"
- },
+ "node_modules/@exodus/bytes": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz",
+ "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@noble/hashes": "^1.8.0 || ^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@noble/hashes": {
+ "optional": true
+ }
}
},
- "node_modules/@opentelemetry/instrumentation-express": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz",
- "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==",
+ "node_modules/@fastify/ajv-compiler": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz",
+ "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "ajv": "^8.12.0",
+ "ajv-formats": "^3.0.1",
+ "fast-uri": "^3.0.0"
}
},
- "node_modules/@opentelemetry/instrumentation-fastify": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz",
- "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==",
+ "node_modules/@fastify/ajv-compiler/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@opentelemetry/instrumentation-fs": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz",
- "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==",
+ "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/@fastify/busboy": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz",
+ "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "text-decoding": "^1.0.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/instrumentation-generic-pool": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz",
- "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==",
+ "node_modules/@fastify/cors": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz",
+ "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "fastify-plugin": "^5.0.0",
+ "toad-cache": "^3.7.0"
}
},
- "node_modules/@opentelemetry/instrumentation-graphql": {
- "version": "0.38.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz",
- "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==",
+ "node_modules/@fastify/error": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz",
+ "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@fastify/fast-json-stringify-compiler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz",
+ "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "fast-json-stringify": "^6.0.0"
}
},
- "node_modules/@opentelemetry/instrumentation-grpc": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz",
- "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==",
+ "node_modules/@fastify/forwarded": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz",
+ "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@fastify/merge-json-schemas": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz",
+ "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/instrumentation": "0.49.1",
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "dequal": "^2.0.3"
}
},
- "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
- "engines": {
- "node": ">=14"
+ "node_modules/@fastify/proxy-addr": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz",
+ "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@fastify/forwarded": "^3.0.0",
+ "ipaddr.js": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-hapi": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz",
- "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==",
+ "node_modules/@firebase/app-types": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.4.tgz",
+ "integrity": "sha512-crX9TA5SVYZwLPG7/R16IsH8FLlgkPXjJUVhsVpHVDSqJiq3D/NuFTM5ctxGTExXAOeIn//69tQw47CPerM8MQ==",
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/hapi__hapi": "20.0.13"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@firebase/logger": "0.5.0"
}
},
- "node_modules/@opentelemetry/instrumentation-http": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz",
- "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==",
+ "node_modules/@firebase/app-types/node_modules/@firebase/logger": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz",
+ "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==",
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/instrumentation": "0.49.1",
- "@opentelemetry/semantic-conventions": "1.22.0",
- "semver": "^7.5.2"
+ "tslib": "^2.1.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=20.0.0"
}
},
- "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
+ "node_modules/@firebase/auth-interop-types": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.7.tgz",
+ "integrity": "sha512-yA/dTveGGPcc85JP8ZE/KZqfGQyQTBCV10THdI8HTlP1GDvNrhr//J5jAt58MlsCOaO3XmC4DqScPBbtIsR/EA==",
+ "license": "Apache-2.0",
"peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "@firebase/app-types": "0.x",
+ "@firebase/util": "1.x"
}
},
- "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
- "engines": {
- "node": ">=14"
+ "node_modules/@firebase/component": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.21.tgz",
+ "integrity": "sha512-12MMQ/ulfygKpEJpseYMR0HunJdlsLrwx2XcEs40M18jocy2+spyzHHEwegN3x/2/BLFBjR5247Etmz0G97Qpg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@firebase/util": "1.7.3",
+ "tslib": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-ioredis": {
- "version": "0.38.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz",
- "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==",
+ "node_modules/@firebase/database": {
+ "version": "0.13.10",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.10.tgz",
+ "integrity": "sha512-KRucuzZ7ZHQsRdGEmhxId5jyM2yKsjsQWF9yv0dIhlxYg0D8rCVDZc/waoPKA5oV3/SEIoptF8F7R1Vfe7BCQA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/ioredis4": "npm:@types/ioredis@^4.28.10"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@firebase/auth-interop-types": "0.1.7",
+ "@firebase/component": "0.5.21",
+ "@firebase/logger": "0.3.4",
+ "@firebase/util": "1.7.3",
+ "faye-websocket": "0.11.4",
+ "tslib": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-knex": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz",
- "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==",
+ "node_modules/@firebase/database-compat": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.10.tgz",
+ "integrity": "sha512-fK+IgUUqVKcWK/gltzDU+B1xauCOfY6vulO8lxoNTkcCGlSxuTtwsdqjGkFmgFRMYjXFWWJ6iFcJ/vXahzwCtA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@firebase/component": "0.5.21",
+ "@firebase/database": "0.13.10",
+ "@firebase/database-types": "0.9.17",
+ "@firebase/logger": "0.3.4",
+ "@firebase/util": "1.7.3",
+ "tslib": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-koa": {
- "version": "0.38.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz",
- "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==",
+ "node_modules/@firebase/database-types": {
+ "version": "0.9.17",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.17.tgz",
+ "integrity": "sha512-YQm2tCZyxNtEnlS5qo5gd2PAYgKCy69tUKwioGhApCFThW+mIgZs7IeYeJo2M51i4LCixYUl+CvnOyAnb/c3XA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/koa": "2.14.0",
- "@types/koa__router": "12.0.3"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@firebase/app-types": "0.8.1",
+ "@firebase/util": "1.7.3"
}
},
- "node_modules/@opentelemetry/instrumentation-lru-memoizer": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz",
- "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==",
+ "node_modules/@firebase/database-types/node_modules/@firebase/app-types": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.1.tgz",
+ "integrity": "sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@firebase/logger": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.4.tgz",
+ "integrity": "sha512-hlFglGRgZEwoyClZcGLx/Wd+zoLfGmbDkFx56mQt/jJ0XMbfPqwId1kiPl0zgdWZX+D8iH+gT6GuLPFsJWgiGw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "tslib": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-memcached": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz",
- "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==",
+ "node_modules/@firebase/util": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.7.3.tgz",
+ "integrity": "sha512-wxNqWbqokF551WrJ9BIFouU/V5SL1oYCGx1oudcirdhadnQRFH5v1sjgGL7cUV/UsekSycygphdrF2lxBxOYKg==",
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/memcached": "^2.2.6"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "tslib": "^2.1.0"
}
},
- "node_modules/@opentelemetry/instrumentation-mongodb": {
- "version": "0.41.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.41.0.tgz",
- "integrity": "sha512-DlSH0oyEuTW5gprCUppb0Qe3pK3cpUUFW5eTmayWNyICI1LFunwtcrULTNv6UiThD/V5ykAf/GGGEa7KFAmkog==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/sdk-metrics": "^1.9.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node_modules/@fontsource/inter": {
+ "version": "5.2.8",
+ "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz",
+ "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
}
},
- "node_modules/@opentelemetry/instrumentation-mongoose": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz",
- "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==",
+ "node_modules/@google-cloud/firestore": {
+ "version": "4.15.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz",
+ "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "fast-deep-equal": "^3.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "google-gax": "^2.24.1",
+ "protobufjs": "^6.8.6"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10.10.0"
}
},
- "node_modules/@opentelemetry/instrumentation-mysql": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz",
- "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==",
+ "node_modules/@google-cloud/firestore/node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/@google-cloud/firestore/node_modules/protobufjs": {
+ "version": "6.11.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
+ "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/mysql": "2.15.22"
- },
- "engines": {
- "node": ">=14"
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": ">=13.7.0",
+ "long": "^4.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
}
},
- "node_modules/@opentelemetry/instrumentation-mysql2": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz",
- "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==",
+ "node_modules/@google-cloud/paginator": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz",
+ "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@opentelemetry/sql-common": "^0.40.0"
+ "arrify": "^2.0.0",
+ "extend": "^3.0.2"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-nestjs-core": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz",
- "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@google-cloud/projectify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz",
+ "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==",
+ "license": "Apache-2.0",
+ "optional": true,
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-net": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz",
- "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@google-cloud/promisify": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz",
+ "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==",
+ "license": "Apache-2.0",
+ "optional": true,
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-pg": {
- "version": "0.39.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz",
- "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==",
+ "node_modules/@google-cloud/storage": {
+ "version": "5.20.5",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.20.5.tgz",
+ "integrity": "sha512-lOs/dCyveVF8TkVFnFSF7IGd0CJrTm91qiK6JLu+Z8qiT+7Ag0RyVhxZIWkhiACqwABo7kSHDm8FdH8p2wxSSw==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@opentelemetry/sql-common": "^0.40.0",
- "@types/pg": "8.6.1",
- "@types/pg-pool": "2.0.4"
+ "@google-cloud/paginator": "^3.0.7",
+ "@google-cloud/projectify": "^2.0.0",
+ "@google-cloud/promisify": "^2.0.0",
+ "abort-controller": "^3.0.0",
+ "arrify": "^2.0.0",
+ "async-retry": "^1.3.3",
+ "compressible": "^2.0.12",
+ "configstore": "^5.0.0",
+ "duplexify": "^4.0.0",
+ "ent": "^2.2.0",
+ "extend": "^3.0.2",
+ "gaxios": "^4.0.0",
+ "google-auth-library": "^7.14.1",
+ "hash-stream-validation": "^0.2.2",
+ "mime": "^3.0.0",
+ "mime-types": "^2.0.8",
+ "p-limit": "^3.0.1",
+ "pumpify": "^2.0.0",
+ "retry-request": "^4.2.2",
+ "stream-events": "^1.0.4",
+ "teeny-request": "^7.1.3",
+ "uuid": "^8.0.0",
+ "xdg-basedir": "^4.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-pino": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz",
- "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==",
+ "node_modules/@google-cloud/storage/node_modules/gcp-metadata": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+ "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1"
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-redis": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz",
- "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==",
+ "node_modules/@google-cloud/storage/node_modules/google-auth-library": {
+ "version": "7.14.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz",
+ "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^4.0.0",
+ "gcp-metadata": "^4.2.0",
+ "gtoken": "^5.0.4",
+ "jws": "^4.0.0",
+ "lru-cache": "^6.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-redis-4": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz",
- "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==",
+ "node_modules/@google-cloud/storage/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
+ "optional": true,
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=10"
}
},
- "node_modules/@opentelemetry/instrumentation-restify": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz",
- "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==",
+ "node_modules/@google-cloud/storage/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@google/genai": {
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.49.0.tgz",
+ "integrity": "sha512-hO69Zl0H3x+L0KL4stl1pLYgnqnwHoLqtKy6MRlNnW8TAxjqMdOUVafomKd4z1BePkzoxJWbYILny9a2Zk43VQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "google-auth-library": "^10.3.0",
+ "p-retry": "^4.6.2",
+ "protobufjs": "^7.5.4",
+ "ws": "^8.18.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=20.0.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@modelcontextprotocol/sdk": "^1.25.2"
+ },
+ "peerDependenciesMeta": {
+ "@modelcontextprotocol/sdk": {
+ "optional": true
+ }
}
},
- "node_modules/@opentelemetry/instrumentation-router": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz",
- "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==",
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@google/generative-ai": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz",
+ "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@opentelemetry/instrumentation-socket.io": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz",
- "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==",
+ "node_modules/@grpc/grpc-js": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz",
+ "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
+ "@grpc/proto-loader": "^0.8.0",
+ "@js-sdsl/ordered-map": "^4.4.2"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "node": ">=12.10.0"
}
},
- "node_modules/@opentelemetry/instrumentation-tedious": {
+ "node_modules/@grpc/proto-loader": {
"version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz",
- "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
+ "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/tedious": "^4.0.10"
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.5.3",
+ "yargs": "^17.7.2"
},
- "engines": {
- "node": ">=14"
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@opentelemetry/instrumentation-winston": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz",
- "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==",
+ "node_modules/@hapi/b64": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz",
+ "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.49.1"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@hapi/hoek": "9.x.x"
}
},
- "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
- "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
+ "node_modules/@hapi/boom": {
+ "version": "9.1.4",
+ "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
+ "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@opentelemetry/api": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
+ "@hapi/hoek": "9.x.x"
}
},
- "node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.40.0.tgz",
- "integrity": "sha512-AUmMUPM1/oYGbOWYRBBQz4Ic/adMYA/mIMnAy+QAEmCzjBIC/fyRReVhJmF2cpkvYh7QOkX3017zl2dgWLHpvQ==",
+ "node_modules/@hapi/bourne": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz",
+ "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/cryptiles": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz",
+ "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@opentelemetry/core": "1.14.0"
+ "@hapi/boom": "9.x.x"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": ">=12.0.0"
}
},
- "node_modules/@opentelemetry/otlp-grpc-exporter-base": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.40.0.tgz",
- "integrity": "sha512-rgfyCofGMpou1OsCF1fNr/2iBzgeZj3rjplEBi0yfX6s3nNcJ6ZfhDvyblKG6dd/UydPSHYAtFAstZwwuucFJA==",
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/iron": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz",
+ "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/otlp-exporter-base": "0.40.0",
- "protobufjs": "^7.2.2"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@hapi/b64": "5.x.x",
+ "@hapi/boom": "9.x.x",
+ "@hapi/bourne": "2.x.x",
+ "@hapi/cryptiles": "5.x.x",
+ "@hapi/hoek": "9.x.x"
}
},
- "node_modules/@opentelemetry/otlp-proto-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz",
- "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==",
+ "node_modules/@hapi/podium": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz",
+ "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/otlp-exporter-base": "0.49.1",
- "protobufjs": "^7.2.3"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@hapi/hoek": "9.x.x",
+ "@hapi/teamwork": "5.x.x",
+ "@hapi/validate": "1.x.x"
}
},
- "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@hapi/teamwork": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz",
+ "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=12.0.0"
}
},
- "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
- "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@opentelemetry/core": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@hapi/hoek": "^9.0.0"
}
},
- "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
- "engines": {
- "node": ">=14"
+ "node_modules/@hapi/validate": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz",
+ "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/topo": "^5.0.0"
}
},
- "node_modules/@opentelemetry/otlp-transformer": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.40.0.tgz",
- "integrity": "sha512-YrJgVVAsJHibENSbYmC1x+5jAmkAGZ9yrgmHxc6IyqM3D1mryhqBvMRDD31JoavPYelkS7dmrXWM8g7swX0B+g==",
+ "node_modules/@heyputer/backend": {
+ "resolved": "src/backend",
+ "link": true
+ },
+ "node_modules/@heyputer/gui": {
+ "resolved": "src/gui",
+ "link": true
+ },
+ "node_modules/@heyputer/kv.js": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@heyputer/kv.js/-/kv.js-0.2.1.tgz",
+ "integrity": "sha512-YhVtzz7ZA/HmuaDvzZZhhUyQWBvp3/TXeY4jULssTdLJwT+tEM4BTYHXttORX+V5auvrYinjj8dNFQnby5T82w==",
+ "license": "MIT"
+ },
+ "node_modules/@heyputer/multest": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@heyputer/multest/-/multest-0.0.2.tgz",
+ "integrity": "sha512-Hr4U9Z2/oMIyCKv+cgO3pNzncA4PAlkS9RotZwoicfzR2BLLu2Rjjp3/HpcLmtE7UEt0hlRMYP+ImMZPYGNwkg==",
+ "license": "UNLICENSED",
"dependencies": {
- "@opentelemetry/api-logs": "0.40.0",
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/resources": "1.14.0",
- "@opentelemetry/sdk-logs": "0.40.0",
- "@opentelemetry/sdk-metrics": "1.14.0",
- "@opentelemetry/sdk-trace-base": "1.14.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ "append-field": "^1.0.0",
+ "busboy": "^1.6.0",
+ "form-data": "^4.0.0"
}
},
- "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
- "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
- "dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/semantic-conventions": "1.14.0"
- },
+ "node_modules/@heyputer/puter-wisp": {
+ "resolved": "src/puter-wisp",
+ "link": true
+ },
+ "node_modules/@heyputer/puter.js": {
+ "resolved": "src/puter-js",
+ "link": true
+ },
+ "node_modules/@heyputer/putility": {
+ "resolved": "src/putility",
+ "link": true
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "node": ">=18.18.0"
}
},
- "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.14.0.tgz",
- "integrity": "sha512-F0JXmLqT4LmsaiaE28fl0qMtc5w0YuMWTHt1hnANTNX8hxW4IKSv9+wrYG7BZd61HEbPm032Re7fXyzzNA6nIw==",
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/resources": "1.14.0",
- "lodash.merge": "4.6.2"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ "node": ">=18.18.0"
}
},
- "node_modules/@opentelemetry/propagation-utils": {
- "version": "0.30.7",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.7.tgz",
- "integrity": "sha512-QkxOkuCQdq8YgJstEMF4ntSyr0ivCrcQc49uvO2pyccrniu2DwA+JD071aM4BXfNVSCeOuhIyW/3QPiZYl4zdA==",
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
+ "node": ">=12.22"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@opentelemetry/propagator-aws-xray": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz",
- "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==",
- "dependencies": {
- "@opentelemetry/core": "^1.0.0"
- },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=14"
+ "node": ">=18.18"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@opentelemetry/propagator-b3": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz",
- "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0"
- },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
- "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=14"
- }
- },
- "node_modules/@opentelemetry/propagator-jaeger": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz",
- "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "engines": {
- "node": ">=14"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
- "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
- "engines": {
- "node": ">=14"
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/redis-common": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz",
- "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==",
- "engines": {
- "node": ">=14"
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.28.7",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.7.tgz",
- "integrity": "sha512-7o/waBJ08JrKED4blHGyBPIN1HMM1KEvhbO1HmdA+tsUqsGwZdTjsdMKFW7hc1TvAu4AQEnuvMy/Q5OByVr95A==",
- "dependencies": {
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
}
},
- "node_modules/@opentelemetry/resource-detector-aws": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.0.tgz",
- "integrity": "sha512-Cn8eQ/heLqrNrPuHGG7xUkk//VQt4hzVIPurmLlCI0wrDV6HR+yykBvRkJBuSdLzbjeQ/qNbGel9OvTmA6PBQA==",
- "dependencies": {
- "@opentelemetry/core": "^1.0.0",
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
- "node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.7.tgz",
- "integrity": "sha512-AYqwffGVuGLuzzVOQMLNHTztwyvsep9noxN9HTQ/grwmJSWZ6851kNx+W735K7v6GZEDmXeLpBn+J3TeqKQUJA==",
- "dependencies": {
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp": {
- "version": "0.29.7",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.7.tgz",
- "integrity": "sha512-uUHKfoOgBCZCEPCU6FWnRrbYuz1miaeIfos0Xe38YuR06vQvddhqZ0tewYunJpfECfKEcjSjY0eDe2QIRLMkXw==",
- "dependencies": {
- "@opentelemetry/core": "^1.0.0",
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "gcp-metadata": "^6.0.0"
- },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
- "node_modules/@opentelemetry/resources": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
- "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
- "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
}
},
- "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
- "node_modules/@opentelemetry/sdk-logs": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.40.0.tgz",
- "integrity": "sha512-/JG7DOLo/Y3VR9azPXlXNRGQff3gp7nQbWl5cFD2SmlYqUrzMq1OjbksZLVztDu1+ynbFunseUG11SxhoxvSRg==",
- "dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/resources": "1.14.0"
- },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.5.0",
- "@opentelemetry/api-logs": ">=0.39.1"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
- "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
- "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
"dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/semantic-conventions": "1.14.0"
+ "@emnapi/runtime": "^1.7.0"
},
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/sdk-metrics": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
- "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "lodash.merge": "^4.6.2"
- },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
- },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@opentelemetry/sdk-node": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz",
- "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==",
+ "node_modules/@ioredis/as-callback": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@ioredis/as-callback/-/as-callback-3.0.0.tgz",
+ "integrity": "sha512-Kqv1rZ3WbgOrS+hgzJ5xG5WQuhvzzSTRYvNeyPMLOAM78MHSnuKI20JeJGbpuAt//LCuP0vsexZcorqW7kWhJg==",
+ "license": "MIT"
+ },
+ "node_modules/@ioredis/commands": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz",
+ "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==",
+ "license": "MIT"
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@opentelemetry/api-logs": "0.49.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1",
- "@opentelemetry/exporter-trace-otlp-http": "0.49.1",
- "@opentelemetry/exporter-trace-otlp-proto": "0.49.1",
- "@opentelemetry/exporter-zipkin": "1.22.0",
- "@opentelemetry/instrumentation": "0.49.1",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-logs": "0.49.1",
- "@opentelemetry/sdk-metrics": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0",
- "@opentelemetry/sdk-trace-node": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ "node": ">=8"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
- "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/api": "^1.0.0"
- },
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=6"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=8"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz",
- "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/otlp-grpc-exporter-base": "0.49.1",
- "@opentelemetry/otlp-transformer": "0.49.1",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
- },
- "engines": {
- "node": ">=14"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
- "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "node": ">=8"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-grpc-exporter-base": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz",
- "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/otlp-exporter-base": "0.49.1",
- "protobufjs": "^7.2.3"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=6"
},
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-transformer": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
- "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/api-logs": "0.49.1",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/sdk-logs": "0.49.1",
- "@opentelemetry/sdk-metrics": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ "node": ">=8"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-logs": {
- "version": "0.49.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
- "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
- "dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0"
- },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jimp/core": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/core/-/core-1.6.1.tgz",
+ "integrity": "sha512-+BoKC5G6hkrSy501zcJ2EpfnllP+avPevcBfRcZe/CW+EwEfY6X1EZ8QWyT7NpDIvEEJb1fdJnMMfUnFkxmw9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jimp/file-ops": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "await-to-js": "^3.0.0",
+ "exif-parser": "^0.1.12",
+ "file-type": "^21.3.3",
+ "mime": "3"
},
- "peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.9.0",
- "@opentelemetry/api-logs": ">=0.39.1"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
- "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "node_modules/@jimp/diff": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/diff/-/diff-1.6.1.tgz",
+ "integrity": "sha512-YkKDPdHjLgo1Api3+Bhc0GLAygldlpt97NfOKoNg1U6IUNXA6X2MgosCjPfSBiSvJvrrz1fsIR+/4cfYXBI/HQ==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "pixelmatch": "^5.3.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@jimp/file-ops": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/file-ops/-/file-ops-1.6.1.tgz",
+ "integrity": "sha512-T+gX6osHjprbDRad0/B71Evyre7ZdVY1z/gFGEG9Z8KOtZPKboWvPeP2UjbZYWQLy9UKCPQX1FNAnDiOPkJL7w==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.14.0.tgz",
- "integrity": "sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ==",
+ "node_modules/@jimp/js-bmp": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/js-bmp/-/js-bmp-1.6.1.tgz",
+ "integrity": "sha512-xzWzNT4/u5zGrTT3Tme9sGU7YzIKxi13+BCQwLqACbt5DXf9SAfdzRkopZQnmDko+6In5nqaT89Gjs43/WdnYQ==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/resources": "1.14.0",
- "@opentelemetry/semantic-conventions": "1.14.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "bmp-ts": "^1.0.9"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
- "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "node_modules/@jimp/js-gif": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/js-gif/-/js-gif-1.6.1.tgz",
+ "integrity": "sha512-YjY2W26rQa05XhanYhRZ7dingCiNN+T2Ymb1JiigIbABY0B28wHE3v3Cf1/HZPWGu0hOg36ylaKgV5KxF2M58w==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.14.0",
- "@opentelemetry/semantic-conventions": "1.14.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "gifwrap": "^0.10.1",
+ "omggif": "^1.0.10"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-node": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz",
- "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==",
+ "node_modules/@jimp/js-jpeg": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/js-jpeg/-/js-jpeg-1.6.1.tgz",
+ "integrity": "sha512-HT9H3yOmlOFzYmdI15IYdfy6ggQhSRIaHeA+OTJSEORXBqEo97sUZu/DsgHIcX5NJ7TkJBTgZ9BZXsV6UbsyMg==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/context-async-hooks": "1.22.0",
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/propagator-b3": "1.22.0",
- "@opentelemetry/propagator-jaeger": "1.22.0",
- "@opentelemetry/sdk-trace-base": "1.22.0",
- "semver": "^7.5.2"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "jpeg-js": "^0.4.4"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
- "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "node_modules/@jimp/js-png": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/js-png/-/js-png-1.6.1.tgz",
+ "integrity": "sha512-SZ/KVhI5UjcSzzlXsXdIi/LhJ7UShf2NkMOtVrbZQcGzsqNtynAelrOXeoTxcanfVqmNhAoVHg8yR2cYoqrYjA==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "pngjs": "^7.0.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
- "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "node_modules/@jimp/js-tiff": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/js-tiff/-/js-tiff-1.6.1.tgz",
+ "integrity": "sha512-jDG/eJquID1M4MBlKMmDRBmz2TpXMv7TUyu2nIRUxhlUc2ogC82T+VQUkca9GJH1BBJ9dx5sSE5dGkWNjIbZxw==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "1.22.0",
- "@opentelemetry/resources": "1.22.0",
- "@opentelemetry/semantic-conventions": "1.22.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "utif2": "^4.1.0"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
- "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "node_modules/@jimp/plugin-blit": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-1.6.1.tgz",
+ "integrity": "sha512-MwnI7C7K81uWddY9FLw1fCOIy6SsPIUftUz36Spt7jisCn8/40DhQMlSxpxTNelnZb/2SnloFimQfRZAmHLOqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
+ },
"engines": {
- "node": ">=14"
+ "node": ">=18"
}
},
- "node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
- "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
- "engines": {
- "node": ">=14"
+ "node_modules/@jimp/plugin-blit/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
}
},
- "node_modules/@opentelemetry/sql-common": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz",
- "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==",
+ "node_modules/@jimp/plugin-blur": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-1.6.1.tgz",
+ "integrity": "sha512-lIo7Tzp5jQu30EFFSK/phXANK3citKVEjepDjQ6ljHoIFtuMRrnybnmI2Md24ulvWlDaz+hh3n6qrMb8ydwhZQ==",
+ "license": "MIT",
"dependencies": {
- "@opentelemetry/core": "^1.1.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/utils": "1.6.1"
},
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.1.0"
+ "node": ">=18"
}
},
- "node_modules/@pagerduty/pdjs": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/@pagerduty/pdjs/-/pdjs-2.2.4.tgz",
- "integrity": "sha512-MMZvxos7PJnGJ8z3ijsu/gsMQLIfO8peeigKCjUDmviXk8FIaZZjX0X889NIKuFDhGirYbJVwGTaDYCEw4baLg==",
+ "node_modules/@jimp/plugin-circle": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-1.6.1.tgz",
+ "integrity": "sha512-kK1PavY6cKHNNKce37vdV4Tmpc1/zDKngGoeOV3j+EMatoHFZUinV3s6F9aWryPs3A0xhCLZgdJ6Zeea1d5LCQ==",
+ "license": "MIT",
"dependencies": {
- "browser-or-node": "^2.0.0",
- "cross-fetch": "^3.0.6"
+ "@jimp/types": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "engines": {
- "node": ">=14"
+ "node_modules/@jimp/plugin-circle/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
}
},
- "node_modules/@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
- },
- "node_modules/@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
- },
- "node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
- },
- "node_modules/@protobufjs/eventemitter": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
- },
- "node_modules/@protobufjs/fetch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "node_modules/@jimp/plugin-color": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-1.6.1.tgz",
+ "integrity": "sha512-LtUN1vAP+LRlZAtTNVhDRSiXx+26Kbz3zJaG6a5k59gQ95jgT5mknnF8lxkHcqJthM4MEk3/tPxkdJpEybyF/A==",
+ "license": "MIT",
"dependencies": {
- "@protobufjs/aspromise": "^1.1.1",
- "@protobufjs/inquire": "^1.1.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "tinycolor2": "^1.6.0",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
- },
- "node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
- },
- "node_modules/@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
- },
- "node_modules/@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
- },
- "node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
- },
- "node_modules/@putersh/terminal-emulator": {
- "resolved": "packages/terminal",
- "link": true
+ "node_modules/@jimp/plugin-color/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
},
- "node_modules/@rollup/plugin-commonjs": {
- "version": "24.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz",
- "integrity": "sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==",
- "dev": true,
+ "node_modules/@jimp/plugin-contain": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-1.6.1.tgz",
+ "integrity": "sha512-m0qhrfA8jkTqretGv4w+T/ADFR4GwBpE0sCOC2uJ0dzr44/ddOMsIdrpi89kabqYiPYIrxkgdCVCLm3zn1Vkkg==",
+ "license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "commondir": "^1.0.1",
- "estree-walker": "^2.0.2",
- "glob": "^8.0.3",
- "is-reference": "1.2.1",
- "magic-string": "^0.27.0"
+ "@jimp/core": "1.6.1",
+ "@jimp/plugin-blit": "1.6.1",
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.68.0||^3.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/@rollup/plugin-node-resolve": {
- "version": "15.2.3",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
- "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
- "dev": true,
+ "node_modules/@jimp/plugin-contain/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-cover": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-1.6.1.tgz",
+ "integrity": "sha512-hZytnsth0zoll6cPf434BrT+p/v569Wr5tyO6Dp0dH1IDPhzhB5F38sZGMLDo7bzQiN9JFVB3fxkcJ/WYCJ3Mg==",
+ "license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "@types/resolve": "1.20.2",
- "deepmerge": "^4.2.2",
- "is-builtin-module": "^3.2.1",
- "is-module": "^1.0.0",
- "resolve": "^1.22.1"
+ "@jimp/core": "1.6.1",
+ "@jimp/plugin-crop": "1.6.1",
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.78.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/@rollup/plugin-replace": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz",
- "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==",
- "dev": true,
+ "node_modules/@jimp/plugin-cover/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-crop": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-1.6.1.tgz",
+ "integrity": "sha512-EerRSLlclXyKDnYc/H9w/1amZW7b7v3OGi/VlerPd2M/pAu5X8TkyYWtfqYCXnNp1Ixtd8oCo9zGfY9zoXT4rg==",
+ "license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^5.0.1",
- "magic-string": "^0.30.3"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/@rollup/plugin-replace/node_modules/magic-string": {
- "version": "0.30.9",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz",
- "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==",
- "dev": true,
+ "node_modules/@jimp/plugin-crop/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-displace": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-1.6.1.tgz",
+ "integrity": "sha512-K07QVl7xQwIfD6KfxRV/c3E9e7ZBXxUXdWuvoTWcKHL2qV48MOF5Nqbz/aJW4ThnQARIsxvYlZjPFiqkCjlU+g==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@rollup/pluginutils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
- "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
- "dev": true,
+ "node_modules/@jimp/plugin-displace/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-dither": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-1.6.1.tgz",
+ "integrity": "sha512-+2V+GCV2WycMoX1/z977TkZ8Zq/4MVSKElHYatgUqtwXMi2fDK2gKYU2g9V39IqFvTJsTIsK0+58VFz/ROBVew==",
+ "license": "MIT",
"dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^2.3.1"
+ "@jimp/types": "1.6.1"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/@sideway/address": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
- "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "node_modules/@jimp/plugin-fisheye": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-1.6.1.tgz",
+ "integrity": "sha512-XtS5ZyoZ0vxZxJ6gkqI63SivhtI58vX95foMPM+cyzYkRsJXMOYCr8DScxF5bp4Xr003NjYm/P+7+08tibwzHA==",
+ "license": "MIT",
"dependencies": {
- "@hapi/hoek": "^9.0.0"
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@sideway/formula": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
- "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="
- },
- "node_modules/@sideway/pinpoint": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
- "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
- },
- "node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "dependencies": {
- "type-detect": "4.0.8"
+ "node_modules/@jimp/plugin-fisheye/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
}
},
- "node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
- "dev": true,
+ "node_modules/@jimp/plugin-flip": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-1.6.1.tgz",
+ "integrity": "sha512-ws38W/sGj7LobNRayQ83garxiktOyWxM5vO/y4a/2cy9v65SLEUzVkrj+oeAaUSSObdz4HcCEla7XtGlnAGAaA==",
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "@jimp/types": "1.6.1",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@sinonjs/samsam": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
- "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
- "dependencies": {
- "@sinonjs/commons": "^2.0.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
+ "node_modules/@jimp/plugin-flip/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
}
},
- "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
- "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "node_modules/@jimp/plugin-hash": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-hash/-/plugin-hash-1.6.1.tgz",
+ "integrity": "sha512-sZt6ZcMX6i8vFWb4GYnw0pR/o9++ef0dTVcboTB5B/g7nrxCODIB4wfEkJ/YqZM5wUvol77K1qeS0/rVO6z21A==",
+ "license": "MIT",
"dependencies": {
- "type-detect": "4.0.8"
+ "@jimp/core": "1.6.1",
+ "@jimp/js-bmp": "1.6.1",
+ "@jimp/js-jpeg": "1.6.1",
+ "@jimp/js-png": "1.6.1",
+ "@jimp/js-tiff": "1.6.1",
+ "@jimp/plugin-color": "1.6.1",
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "any-base": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@sinonjs/text-encoding": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
- "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ=="
- },
- "node_modules/@smithy/abort-controller": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz",
- "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==",
+ "node_modules/@jimp/plugin-mask": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-1.6.1.tgz",
+ "integrity": "sha512-SIG0/FcmEj3tkwFxc7fAGLO8o4uNzMpSOdQOhbCgxefQKq5wOVMk9BQx/sdMPBwtMLr9WLq0GzLA/rk6t2v20A==",
+ "license": "MIT",
"dependencies": {
- "@smithy/types": "^2.12.0",
- "tslib": "^2.6.2"
+ "@jimp/types": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@smithy/node-http-handler": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz",
- "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==",
+ "node_modules/@jimp/plugin-mask/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-print": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-1.6.1.tgz",
+ "integrity": "sha512-BYVz/X3Xzv8XYilVeDy11NOp0h7BTDjlOtu0BekIFHP1yHVd24AXNzbOy52XlzYZWQ0Dl36HOHEpl/nSNrzc6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@jimp/core": "1.6.1",
+ "@jimp/js-jpeg": "1.6.1",
+ "@jimp/js-png": "1.6.1",
+ "@jimp/plugin-blit": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "parse-bmfont-ascii": "^1.0.6",
+ "parse-bmfont-binary": "^1.0.6",
+ "parse-bmfont-xml": "^1.1.6",
+ "simple-xml-to-json": "^1.2.2",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@jimp/plugin-print/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-quantize": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-quantize/-/plugin-quantize-1.6.1.tgz",
+ "integrity": "sha512-J2En9PLURfP+vwYDtuZ9T8yBW6BWYZBScydAjRiPBmJfEhTcNQqiiQODrZf7EqbbX/Sy5H6dAeRiqkgoV9N6Ww==",
+ "license": "MIT",
"dependencies": {
- "@smithy/abort-controller": "^2.2.0",
- "@smithy/protocol-http": "^3.3.0",
- "@smithy/querystring-builder": "^2.2.0",
- "@smithy/types": "^2.12.0",
- "tslib": "^2.6.2"
+ "image-q": "^4.0.0",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@smithy/protocol-http": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz",
- "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==",
+ "node_modules/@jimp/plugin-quantize/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-resize": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-1.6.1.tgz",
+ "integrity": "sha512-CLkrtJoIz2HdWnpYiN6p8KYcPc00rCH/SUu6o+lfZL05Q4uhecJlnvXuj9x+U6mDn3ldPmJj6aZqMHuUJzdVqg==",
+ "license": "MIT",
"dependencies": {
- "@smithy/types": "^2.12.0",
- "tslib": "^2.6.2"
+ "@jimp/core": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@smithy/querystring-builder": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz",
- "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==",
+ "node_modules/@jimp/plugin-resize/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-rotate": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-1.6.1.tgz",
+ "integrity": "sha512-nOjVjbbj705B02ksysKnh0POAwEBXZtJ9zQ5qC+X7Tavl3JNn+P3BzQovbBxLPSbUSld6XID9z5ijin4PtOAUg==",
+ "license": "MIT",
"dependencies": {
- "@smithy/types": "^2.12.0",
- "@smithy/util-uri-escape": "^2.2.0",
- "tslib": "^2.6.2"
+ "@jimp/core": "1.6.1",
+ "@jimp/plugin-crop": "1.6.1",
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@smithy/types": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
- "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
+ "node_modules/@jimp/plugin-rotate/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/plugin-threshold": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-1.6.1.tgz",
+ "integrity": "sha512-JOKv9F8s6tnVLf4sB/2fF0F339EFnHvgEdFYugO6VhowKLsap0pEZmLyE/DlRnYtIj2RddHZVxVMp/eKJ04l2Q==",
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.6.2"
+ "@jimp/core": "1.6.1",
+ "@jimp/plugin-color": "1.6.1",
+ "@jimp/plugin-hash": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1",
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@smithy/util-uri-escape": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz",
- "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==",
+ "node_modules/@jimp/plugin-threshold/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@jimp/types": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/types/-/types-1.6.1.tgz",
+ "integrity": "sha512-leI7YbveTNi565m910XgIOwXyuu074H5qazAD1357HImJSv2hqxnWXpwxQbadGWZ7goZRYBDZy5lpqud0p7q5w==",
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.6.2"
+ "zod": "^3.23.8"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=18"
}
},
- "node_modules/@socket.io/component-emitter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
- },
- "node_modules/@tokenizer/token": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
+ "node_modules/@jimp/types/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
},
- "node_modules/@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "node_modules/@jimp/utils": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-1.6.1.tgz",
+ "integrity": "sha512-veFPRd93FCnS7AgmCkPgARVGoDRrJ9cm1ujuNyA+UfQ5VKbED2002sm5XfFLFwTsKC8j04heTrwe+tU1dluXOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jimp/types": "1.6.1",
+ "tinycolor2": "^1.6.0"
+ },
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
}
},
- "node_modules/@types/accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@types/aws-lambda": {
- "version": "8.10.122",
- "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz",
- "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw=="
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@types/bunyan": {
- "version": "1.8.9",
- "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz",
- "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==",
- "dependencies": {
- "@types/node": "*"
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/@types/connect": {
- "version": "3.4.36",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz",
- "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==",
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
}
},
- "node_modules/@types/content-disposition": {
- "version": "0.5.8",
- "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz",
- "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg=="
- },
- "node_modules/@types/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
},
- "node_modules/@types/cookies": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz",
- "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==",
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
"dependencies": {
- "@types/connect": "*",
- "@types/express": "*",
- "@types/keygrip": "*",
- "@types/node": "*"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@types/cors": {
- "version": "2.8.17",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
- "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
- "dependencies": {
- "@types/node": "*"
+ "node_modules/@js-sdsl/ordered-map": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
+ "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
}
},
- "node_modules/@types/eslint": {
- "version": "8.56.5",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz",
- "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==",
+ "node_modules/@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
+ "debug": "^4.1.1"
}
},
- "node_modules/@types/eslint-scope": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
- "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "node_modules/@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
"dev": true,
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
+ "license": "MIT"
},
- "node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
}
},
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.43",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz",
- "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==",
+ "node_modules/@mistralai/mistralai": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.15.1.tgz",
+ "integrity": "sha512-fb995eiz3r0KsBGtRjFV+/iLbX+UpfalxpF+YitT3R6ukrPD4PN+FGwwmYcRFhNAzVzDUtTVxQYnjQWEnwV5nw==",
"dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
+ "ws": "^8.18.0",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-to-json-schema": "^3.24.1"
}
},
- "node_modules/@types/fs-extra": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz",
- "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
+ "node_modules/@msgpack/msgpack": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.8.0.tgz",
+ "integrity": "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz",
+ "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/hapi__catbox": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz",
- "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w=="
- },
- "node_modules/@types/hapi__hapi": {
- "version": "20.0.13",
- "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz",
- "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==",
- "dependencies": {
- "@hapi/boom": "^9.0.0",
- "@hapi/iron": "^6.0.0",
- "@hapi/podium": "^4.1.3",
- "@types/hapi__catbox": "*",
- "@types/hapi__mimos": "*",
- "@types/hapi__shot": "*",
- "@types/node": "*",
- "joi": "^17.3.0"
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
}
},
- "node_modules/@types/hapi__mimos": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz",
- "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==",
- "dependencies": {
- "@types/mime-db": "*"
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@types/hapi__shot": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz",
- "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==",
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@types/http-assert": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz",
- "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g=="
- },
- "node_modules/@types/http-errors": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="
- },
- "node_modules/@types/ioredis4": {
- "name": "@types/ioredis",
- "version": "4.28.10",
- "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz",
- "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==",
- "dependencies": {
- "@types/node": "*"
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true
- },
- "node_modules/@types/keygrip": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz",
- "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="
- },
- "node_modules/@types/koa": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz",
- "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/accepts": "*",
- "@types/content-disposition": "*",
- "@types/cookies": "*",
- "@types/http-assert": "*",
- "@types/http-errors": "*",
- "@types/keygrip": "*",
- "@types/koa-compose": "*",
- "@types/node": "*"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@types/koa__router": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz",
- "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==",
- "dependencies": {
- "@types/koa": "*"
+ "node_modules/@opentelemetry/api": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "node_modules/@types/koa-compose": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz",
- "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==",
+ "node_modules/@opentelemetry/api-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz",
+ "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==",
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@types/koa": "*"
+ "@opentelemetry/api": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
}
},
- "node_modules/@types/memcached": {
- "version": "2.2.10",
- "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz",
- "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==",
+ "node_modules/@opentelemetry/auto-instrumentations-node": {
+ "version": "0.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.43.0.tgz",
+ "integrity": "sha512-2WvHUSi/QVeVG8ObPD0Ls6WevfIbQjspxIQRuHaQFWXhmEwy/MsEcoQUjbNKXwO5516aS04GTydKEoRKsMwhdA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/mime": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="
- },
- "node_modules/@types/mime-db": {
- "version": "1.43.5",
- "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz",
- "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A=="
- },
- "node_modules/@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
- "dev": true
- },
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/instrumentation-amqplib": "^0.35.0",
+ "@opentelemetry/instrumentation-aws-lambda": "^0.39.0",
+ "@opentelemetry/instrumentation-aws-sdk": "^0.39.1",
+ "@opentelemetry/instrumentation-bunyan": "^0.36.0",
+ "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0",
+ "@opentelemetry/instrumentation-connect": "^0.34.0",
+ "@opentelemetry/instrumentation-cucumber": "^0.4.0",
+ "@opentelemetry/instrumentation-dataloader": "^0.7.0",
+ "@opentelemetry/instrumentation-dns": "^0.34.0",
+ "@opentelemetry/instrumentation-express": "^0.36.1",
+ "@opentelemetry/instrumentation-fastify": "^0.34.0",
+ "@opentelemetry/instrumentation-fs": "^0.10.0",
+ "@opentelemetry/instrumentation-generic-pool": "^0.34.0",
+ "@opentelemetry/instrumentation-graphql": "^0.38.1",
+ "@opentelemetry/instrumentation-grpc": "^0.49.1",
+ "@opentelemetry/instrumentation-hapi": "^0.35.0",
+ "@opentelemetry/instrumentation-http": "^0.49.1",
+ "@opentelemetry/instrumentation-ioredis": "^0.38.0",
+ "@opentelemetry/instrumentation-knex": "^0.34.0",
+ "@opentelemetry/instrumentation-koa": "^0.38.0",
+ "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0",
+ "@opentelemetry/instrumentation-memcached": "^0.34.0",
+ "@opentelemetry/instrumentation-mongodb": "^0.41.0",
+ "@opentelemetry/instrumentation-mongoose": "^0.36.0",
+ "@opentelemetry/instrumentation-mysql": "^0.36.0",
+ "@opentelemetry/instrumentation-mysql2": "^0.36.0",
+ "@opentelemetry/instrumentation-nestjs-core": "^0.35.0",
+ "@opentelemetry/instrumentation-net": "^0.34.0",
+ "@opentelemetry/instrumentation-pg": "^0.39.1",
+ "@opentelemetry/instrumentation-pino": "^0.36.0",
+ "@opentelemetry/instrumentation-redis": "^0.37.0",
+ "@opentelemetry/instrumentation-redis-4": "^0.37.0",
+ "@opentelemetry/instrumentation-restify": "^0.36.0",
+ "@opentelemetry/instrumentation-router": "^0.35.0",
+ "@opentelemetry/instrumentation-socket.io": "^0.37.0",
+ "@opentelemetry/instrumentation-tedious": "^0.8.0",
+ "@opentelemetry/instrumentation-winston": "^0.35.0",
+ "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7",
+ "@opentelemetry/resource-detector-aws": "^1.4.0",
+ "@opentelemetry/resource-detector-container": "^0.3.7",
+ "@opentelemetry/resource-detector-gcp": "^0.29.7",
+ "@opentelemetry/resources": "^1.12.0",
+ "@opentelemetry/sdk-node": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.4.1"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz",
+ "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.49.1",
+ "@opentelemetry/otlp-transformer": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
+ "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
+ "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.9.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
+ "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "lodash.merge": "^4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-grpc-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-exporter-base": "0.49.1",
+ "protobufjs": "^7.2.3"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz",
+ "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1",
+ "@opentelemetry/exporter-trace-otlp-http": "0.49.1",
+ "@opentelemetry/exporter-trace-otlp-proto": "0.49.1",
+ "@opentelemetry/exporter-zipkin": "1.22.0",
+ "@opentelemetry/instrumentation": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0",
+ "@opentelemetry/sdk-trace-node": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
+ "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.9.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
+ "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "lodash.merge": "^4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz",
+ "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/context-async-hooks": "1.22.0",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/propagator-b3": "1.22.0",
+ "@opentelemetry/propagator-jaeger": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/context-async-hooks": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz",
+ "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/propagator-b3": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz",
+ "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/propagator-jaeger": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz",
+ "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/core": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz",
+ "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz",
+ "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.40.0.tgz",
+ "integrity": "sha512-1kIEi2G4uVrxqZV+9M09Il2XeylAUOpNXg1vpS50R2CgP99u6ICzu+xhENXWucaVya+tRduwrhkVzSagyP7Mtw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/exporter-metrics-otlp-http": "0.40.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.40.0",
+ "@opentelemetry/otlp-transformer": "0.40.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-metrics": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/api-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.40.0.tgz",
+ "integrity": "sha512-8WRuvGnfnbeR9ifGjLN8kklk2fkd0gBT6aN7NHO9zeYF/6qacAViD3bwAKqGXKnJgl39l1EU41I9diqUjamEEQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
+ "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.40.0.tgz",
+ "integrity": "sha512-YrJgVVAsJHibENSbYmC1x+5jAmkAGZ9yrgmHxc6IyqM3D1mryhqBvMRDD31JoavPYelkS7dmrXWM8g7swX0B+g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.40.0",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-logs": "0.40.0",
+ "@opentelemetry/sdk-metrics": "1.14.0",
+ "@opentelemetry/sdk-trace-base": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.40.0.tgz",
+ "integrity": "sha512-/JG7DOLo/Y3VR9azPXlXNRGQff3gp7nQbWl5cFD2SmlYqUrzMq1OjbksZLVztDu1+ynbFunseUG11SxhoxvSRg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.5.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.14.0.tgz",
+ "integrity": "sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
+ "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.14.0.tgz",
+ "integrity": "sha512-F0JXmLqT4LmsaiaE28fl0qMtc5w0YuMWTHt1hnANTNX8hxW4IKSv9+wrYG7BZd61HEbPm032Re7fXyzzNA6nIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "lodash.merge": "4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
+ "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.40.0.tgz",
+ "integrity": "sha512-4ferfcHOyYAhy+7Xk/vMWGBI6yafeOxpLWKrRjzNFAGKzD78teOnPTvyaCecPF0nviTF4VuwT2ECgon6Q/bFBQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/otlp-exporter-base": "0.40.0",
+ "@opentelemetry/otlp-transformer": "0.40.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-metrics": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.40.0.tgz",
+ "integrity": "sha512-8WRuvGnfnbeR9ifGjLN8kklk2fkd0gBT6aN7NHO9zeYF/6qacAViD3bwAKqGXKnJgl39l1EU41I9diqUjamEEQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
+ "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.40.0.tgz",
+ "integrity": "sha512-YrJgVVAsJHibENSbYmC1x+5jAmkAGZ9yrgmHxc6IyqM3D1mryhqBvMRDD31JoavPYelkS7dmrXWM8g7swX0B+g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.40.0",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-logs": "0.40.0",
+ "@opentelemetry/sdk-metrics": "1.14.0",
+ "@opentelemetry/sdk-trace-base": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.40.0.tgz",
+ "integrity": "sha512-/JG7DOLo/Y3VR9azPXlXNRGQff3gp7nQbWl5cFD2SmlYqUrzMq1OjbksZLVztDu1+ynbFunseUG11SxhoxvSRg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.5.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.14.0.tgz",
+ "integrity": "sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
+ "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.14.0.tgz",
+ "integrity": "sha512-F0JXmLqT4LmsaiaE28fl0qMtc5w0YuMWTHt1hnANTNX8hxW4IKSv9+wrYG7BZd61HEbPm032Re7fXyzzNA6nIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "lodash.merge": "4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
+ "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.40.0.tgz",
+ "integrity": "sha512-/UW/6s1WBHkFgdwizouUCEGZPt7NE0Y5xpuFuHqQF/KyjcHzTWibXzB/XWOSS81X55FUxrI3Icoeptk7vtxJFQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.40.0",
+ "@opentelemetry/otlp-transformer": "0.40.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-trace-base": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/api-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.40.0.tgz",
+ "integrity": "sha512-8WRuvGnfnbeR9ifGjLN8kklk2fkd0gBT6aN7NHO9zeYF/6qacAViD3bwAKqGXKnJgl39l1EU41I9diqUjamEEQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
+ "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.40.0.tgz",
+ "integrity": "sha512-YrJgVVAsJHibENSbYmC1x+5jAmkAGZ9yrgmHxc6IyqM3D1mryhqBvMRDD31JoavPYelkS7dmrXWM8g7swX0B+g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.40.0",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/sdk-logs": "0.40.0",
+ "@opentelemetry/sdk-metrics": "1.14.0",
+ "@opentelemetry/sdk-trace-base": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.40.0.tgz",
+ "integrity": "sha512-/JG7DOLo/Y3VR9azPXlXNRGQff3gp7nQbWl5cFD2SmlYqUrzMq1OjbksZLVztDu1+ynbFunseUG11SxhoxvSRg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.5.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.14.0.tgz",
+ "integrity": "sha512-F0JXmLqT4LmsaiaE28fl0qMtc5w0YuMWTHt1hnANTNX8hxW4IKSv9+wrYG7BZd61HEbPm032Re7fXyzzNA6nIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "lodash.merge": "4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.14.0.tgz",
+ "integrity": "sha512-qRfWIgBxxl3z47E036Aey0Lj2ZjlFb27Q7Xnj1y1z/P293RXJZGLtcfn/w8JF7v1Q2hs3SDGxz7Wb9Dko1YUQA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.14.0.tgz",
+ "integrity": "sha512-NzRGt3PS+HPKfQYMb6Iy8YYc5OKA73qDwci/6ujOIvyW9vcqBJSWbjZ8FeLEAmuatUB5WrRhEKu9b0sIiIYTrQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/resources": "1.14.0",
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
+ "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz",
+ "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-exporter-base": "0.49.1",
+ "@opentelemetry/otlp-transformer": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
+ "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
+ "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.9.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
+ "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "lodash.merge": "^4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz",
+ "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-exporter-base": "0.49.1",
+ "@opentelemetry/otlp-proto-exporter-base": "0.49.1",
+ "@opentelemetry/otlp-transformer": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
+ "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
+ "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.9.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
+ "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "lodash.merge": "^4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz",
+ "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz",
+ "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@types/shimmer": "^1.0.2",
+ "import-in-the-middle": "1.7.1",
+ "require-in-the-middle": "^7.1.1",
+ "semver": "^7.5.2",
+ "shimmer": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-amqplib": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz",
+ "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-lambda": {
+ "version": "0.39.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz",
+ "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/propagator-aws-xray": "^1.3.1",
+ "@opentelemetry/resources": "^1.8.0",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/aws-lambda": "8.10.122"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-sdk": {
+ "version": "0.39.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz",
+ "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/propagation-utils": "^0.30.7",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-bunyan": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz",
+ "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "^0.49.1",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@types/bunyan": "1.8.9"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-cassandra-driver": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz",
+ "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-connect": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz",
+ "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/connect": "3.4.36"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-cucumber": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz",
+ "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dataloader": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz",
+ "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dns": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz",
+ "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-express": {
+ "version": "0.36.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz",
+ "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fastify": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz",
+ "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fs": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz",
+ "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-generic-pool": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz",
+ "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-graphql": {
+ "version": "0.38.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz",
+ "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-grpc": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz",
+ "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "0.49.1",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-hapi": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz",
+ "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/hapi__hapi": "20.0.13"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz",
+ "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/instrumentation": "0.49.1",
+ "@opentelemetry/semantic-conventions": "1.22.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-ioredis": {
+ "version": "0.38.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz",
+ "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/redis-common": "^0.36.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/ioredis4": "npm:@types/ioredis@^4.28.10"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-knex": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz",
+ "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-koa": {
+ "version": "0.38.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz",
+ "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/koa": "2.14.0",
+ "@types/koa__router": "12.0.3"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-lru-memoizer": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz",
+ "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-memcached": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz",
+ "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/memcached": "^2.2.6"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongodb": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.41.0.tgz",
+ "integrity": "sha512-DlSH0oyEuTW5gprCUppb0Qe3pK3cpUUFW5eTmayWNyICI1LFunwtcrULTNv6UiThD/V5ykAf/GGGEa7KFAmkog==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/sdk-metrics": "^1.9.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongoose": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz",
+ "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mysql": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz",
+ "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/mysql": "2.15.22"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mysql2": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz",
+ "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@opentelemetry/sql-common": "^0.40.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-nestjs-core": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz",
+ "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-net": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz",
+ "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-pg": {
+ "version": "0.39.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz",
+ "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@opentelemetry/sql-common": "^0.40.0",
+ "@types/pg": "8.6.1",
+ "@types/pg-pool": "2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-pino": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz",
+ "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-redis": {
+ "version": "0.37.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz",
+ "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/redis-common": "^0.36.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-redis-4": {
+ "version": "0.37.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz",
+ "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/redis-common": "^0.36.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-restify": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz",
+ "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-router": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz",
+ "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-socket.io": {
+ "version": "0.37.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz",
+ "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-tedious": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz",
+ "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1",
+ "@opentelemetry/semantic-conventions": "^1.0.0",
+ "@types/tedious": "^4.0.10"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-winston": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz",
+ "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.49.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.40.0.tgz",
+ "integrity": "sha512-AUmMUPM1/oYGbOWYRBBQz4Ic/adMYA/mIMnAy+QAEmCzjBIC/fyRReVhJmF2cpkvYh7QOkX3017zl2dgWLHpvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
+ "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
+ "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.40.0.tgz",
+ "integrity": "sha512-rgfyCofGMpou1OsCF1fNr/2iBzgeZj3rjplEBi0yfX6s3nNcJ6ZfhDvyblKG6dd/UydPSHYAtFAstZwwuucFJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.14.0",
+ "@opentelemetry/otlp-exporter-base": "0.40.0",
+ "protobufjs": "^7.2.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.14.0.tgz",
+ "integrity": "sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.14.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.5.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz",
+ "integrity": "sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-proto-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-exporter-base": "0.49.1",
+ "protobufjs": "^7.2.3"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-proto-exporter-base/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/propagation-utils": {
+ "version": "0.30.16",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz",
+ "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/propagator-aws-xray": {
+ "version": "1.26.2",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz",
+ "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/redis-common": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz",
+ "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
+ "version": "0.28.10",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.10.tgz",
+ "integrity": "sha512-TZv/1Y2QCL6sJ+X9SsPPBXe4786bc/Qsw0hQXFsNTbJzDTGGUmOAlSZ2qPiuqAd4ZheUYfD+QA20IvAjUz9Hhg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/resources": "^1.0.0",
+ "@opentelemetry/semantic-conventions": "^1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/resource-detector-aws": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz",
+ "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.0.0",
+ "@opentelemetry/resources": "^1.10.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/resource-detector-container": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.11.tgz",
+ "integrity": "sha512-22ndMDakxX+nuhAYwqsciexV8/w26JozRUV0FN9kJiqSWtA1b5dCVtlp3J6JivG5t8kDN9UF5efatNnVbqRT9Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/resources": "^1.0.0",
+ "@opentelemetry/semantic-conventions": "^1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/resource-detector-gcp": {
+ "version": "0.29.13",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz",
+ "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.0.0",
+ "@opentelemetry/resources": "^1.10.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0",
+ "gcp-metadata": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/resources": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz",
+ "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.30.1",
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz",
+ "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz",
+ "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.30.1",
+ "@opentelemetry/resources": "1.30.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
+ "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/sql-common": {
+ "version": "0.40.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz",
+ "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.124.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz",
+ "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@pagerduty/pdjs": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@pagerduty/pdjs/-/pdjs-2.2.4.tgz",
+ "integrity": "sha512-MMZvxos7PJnGJ8z3ijsu/gsMQLIfO8peeigKCjUDmviXk8FIaZZjX0X889NIKuFDhGirYbJVwGTaDYCEw4baLg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "browser-or-node": "^2.0.0",
+ "cross-fetch": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@panva/asn1.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz",
+ "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
+ "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@pinojs/redact": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz",
+ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
+ "license": "MIT"
+ },
+ "node_modules/@playwright/test": {
+ "version": "1.59.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz",
+ "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.59.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz",
+ "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz",
+ "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz",
+ "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz",
+ "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz",
+ "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz",
+ "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz",
+ "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz",
+ "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz",
+ "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz",
+ "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz",
+ "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz",
+ "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz",
+ "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.9.2",
+ "@emnapi/runtime": "1.9.2",
+ "@napi-rs/wasm-runtime": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz",
+ "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz",
+ "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz",
+ "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@simple-git/args-pathspec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.2.tgz",
+ "integrity": "sha512-nEFVejViHUoL8wU8GTcwqrvqfUG40S5ts6S4fr1u1Ki5CklXlRDYThPVA/qurTmCYFGnaX3XpVUmICLHdvhLaA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@simple-git/argv-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.0.3.tgz",
+ "integrity": "sha512-NMKv9sJcSN2VvnPT9Ja7eKfGy8Q8mMFLwPTCcuZMtv3+mYcLIZflg31S/tp2XCCyiY7YAx6cgBHQ0fwA2fWHpQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@simple-git/args-pathspec": "^1.0.2"
+ }
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/commons/node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz",
+ "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1",
+ "type-detect": "^4.1.0"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz",
+ "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==",
+ "deprecated": "Deprecated: no longer maintained and no longer used by Sinon packages. See\n https://github.com/sinonjs/nise/issues/243 for replacement details.",
+ "dev": true,
+ "license": "(Unlicense OR Apache-2.0)"
+ },
+ "node_modules/@smithy/abort-controller": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz",
+ "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/abort-controller/node_modules/@smithy/types": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
+ "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz",
+ "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader-native": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz",
+ "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-base64": "^4.3.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/config-resolver": {
+ "version": "4.4.14",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.14.tgz",
+ "integrity": "sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-config-provider": "^4.2.2",
+ "@smithy/util-endpoints": "^3.3.4",
+ "@smithy/util-middleware": "^4.2.13",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/core": {
+ "version": "3.23.14",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.14.tgz",
+ "integrity": "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-body-length-browser": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-stream": "^4.5.22",
+ "@smithy/util-utf8": "^4.2.2",
+ "@smithy/uuid": "^1.1.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz",
+ "integrity": "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-codec": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.13.tgz",
+ "integrity": "sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/crc32": "5.2.0",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-browser": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.13.tgz",
+ "integrity": "sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-config-resolver": {
+ "version": "4.3.13",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.13.tgz",
+ "integrity": "sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-node": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.13.tgz",
+ "integrity": "sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-universal": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.13.tgz",
+ "integrity": "sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/eventstream-codec": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "5.3.16",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz",
+ "integrity": "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-base64": "^4.3.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-blob-browser": {
+ "version": "4.2.14",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.14.tgz",
+ "integrity": "sha512-rtQ5es8r/5v4rav7q5QTsfx9CtCyzrz/g7ZZZBH2xtMmd6G/KQrLOWfSHTvFOUPlVy59RQvxeBYJaLRoybMEyA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/chunked-blob-reader": "^5.2.2",
+ "@smithy/chunked-blob-reader-native": "^4.2.3",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-node": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.13.tgz",
+ "integrity": "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-stream-node": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.13.tgz",
+ "integrity": "sha512-WdQ7HwUjINXETeh6dqUeob1UHIYx8kAn9PSp1HhM2WWegiZBYVy2WXIs1lB07SZLan/udys9SBnQGt9MQbDpdg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/invalid-dependency": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz",
+ "integrity": "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/is-array-buffer": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz",
+ "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/md5-js": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.13.tgz",
+ "integrity": "sha512-cNm7I9NXolFxtS20ojROddOEpSAeI1Obq6pd1Kj5HtHws3s9Fkk8DdHDfQSs5KuxCewZuVK6UqrJnfJmiMzDuQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-compression": {
+ "version": "4.3.43",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.3.43.tgz",
+ "integrity": "sha512-MphcLSNTvBN9G2/ko7NBV2psEfsQRZviXmf612ZwvbSY7dJZNroc2+WPHBf+I9KO2SFl4VFz11rTTueihwWjlQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.14",
+ "@smithy/is-array-buffer": "^4.2.2",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-config-provider": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-utf8": "^4.2.2",
+ "fflate": "0.8.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-content-length": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz",
+ "integrity": "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-endpoint": {
+ "version": "4.4.29",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz",
+ "integrity": "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.14",
+ "@smithy/middleware-serde": "^4.2.17",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "@smithy/url-parser": "^4.2.13",
+ "@smithy/util-middleware": "^4.2.13",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.1.tgz",
+ "integrity": "sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.14",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/service-error-classification": "^4.2.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-retry": "^4.3.1",
+ "@smithy/uuid": "^1.1.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-serde": {
+ "version": "4.2.17",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz",
+ "integrity": "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.14",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-stack": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz",
+ "integrity": "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/node-config-provider": {
+ "version": "4.3.13",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz",
+ "integrity": "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/shared-ini-file-loader": "^4.4.8",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz",
+ "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/abort-controller": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/querystring-builder": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz",
+ "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler/node_modules/@smithy/querystring-builder": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz",
+ "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-uri-escape": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler/node_modules/@smithy/types": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
+ "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler/node_modules/@smithy/util-uri-escape": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz",
+ "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/property-provider": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.13.tgz",
+ "integrity": "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/protocol-http": {
+ "version": "5.3.13",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz",
+ "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-builder": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz",
+ "integrity": "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-uri-escape": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-parser": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz",
+ "integrity": "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/service-error-classification": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz",
+ "integrity": "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/shared-ini-file-loader": {
+ "version": "4.4.8",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz",
+ "integrity": "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "5.3.13",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz",
+ "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^4.2.2",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "@smithy/util-middleware": "^4.2.13",
+ "@smithy/util-uri-escape": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/smithy-client": {
+ "version": "4.12.9",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.9.tgz",
+ "integrity": "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^3.23.14",
+ "@smithy/middleware-endpoint": "^4.4.29",
+ "@smithy/middleware-stack": "^4.2.13",
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-stream": "^4.5.22",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.0.tgz",
+ "integrity": "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/url-parser": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.13.tgz",
+ "integrity": "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/querystring-parser": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-base64": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz",
+ "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-browser": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz",
+ "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-node": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz",
+ "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-buffer-from": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz",
+ "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-config-provider": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz",
+ "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-browser": {
+ "version": "4.3.45",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz",
+ "integrity": "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-node": {
+ "version": "4.2.49",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.49.tgz",
+ "integrity": "sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/config-resolver": "^4.4.14",
+ "@smithy/credential-provider-imds": "^4.2.13",
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/property-provider": "^4.2.13",
+ "@smithy/smithy-client": "^4.12.9",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-endpoints": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.4.tgz",
+ "integrity": "sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^4.3.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-hex-encoding": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz",
+ "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-middleware": {
+ "version": "4.2.13",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.13.tgz",
+ "integrity": "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-retry": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.1.tgz",
+ "integrity": "sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/service-error-classification": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream": {
+ "version": "4.5.22",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.22.tgz",
+ "integrity": "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/fetch-http-handler": "^5.3.16",
+ "@smithy/node-http-handler": "^4.5.2",
+ "@smithy/types": "^4.14.0",
+ "@smithy/util-base64": "^4.3.2",
+ "@smithy/util-buffer-from": "^4.2.2",
+ "@smithy/util-hex-encoding": "^4.2.2",
+ "@smithy/util-utf8": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-uri-escape": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz",
+ "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-utf8": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz",
+ "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^4.2.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/util-waiter": {
+ "version": "4.2.15",
+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.15.tgz",
+ "integrity": "sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@smithy/uuid": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz",
+ "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@so-ric/colorspace": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
+ "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
+ "license": "MIT",
+ "dependencies": {
+ "color": "^5.0.2",
+ "text-hex": "1.0.x"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "license": "MIT"
+ },
+ "node_modules/@socket.io/redis-streams-adapter": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@socket.io/redis-streams-adapter/-/redis-streams-adapter-0.3.1.tgz",
+ "integrity": "sha512-J+kcx5w4TUYSSmvimMC+UZKdxdVAmppiVoscoOPkeJeLDgsf154Sth/NRVNNn8PUg5/bEYV5Q9MxDm+ztTx1LQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@msgpack/msgpack": "~2.8.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "socket.io-adapter": "^2.5.4"
+ }
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
+ "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/types": "^8.56.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.0.0 || ^10.0.0"
+ }
+ },
+ "node_modules/@stylistic/eslint-plugin-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.4.1.tgz",
+ "integrity": "sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.0.0"
+ }
+ },
+ "node_modules/@tokenizer/inflate": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@tokenizer/inflate/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
+ "license": "MIT"
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/aws-lambda": {
+ "version": "8.10.122",
+ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz",
+ "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.6",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bunyan": {
+ "version": "1.8.9",
+ "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz",
+ "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/chai/node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.36",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz",
+ "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/content-disposition": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.9.tgz",
+ "integrity": "sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/cookies": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.2.tgz",
+ "integrity": "sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/express": "*",
+ "@types/keygrip": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.19",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
+ "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.25",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
+ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "^1"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.19.8",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz",
+ "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hapi__catbox": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz",
+ "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hapi__hapi": {
+ "version": "20.0.13",
+ "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz",
+ "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@hapi/boom": "^9.0.0",
+ "@hapi/iron": "^6.0.0",
+ "@hapi/podium": "^4.1.3",
+ "@types/hapi__catbox": "*",
+ "@types/hapi__mimos": "*",
+ "@types/hapi__shot": "*",
+ "@types/node": "*",
+ "joi": "^17.3.0"
+ }
+ },
+ "node_modules/@types/hapi__mimos": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz",
+ "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime-db": "*"
+ }
+ },
+ "node_modules/@types/hapi__shot": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz",
+ "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/highlight.js": {
+ "version": "9.12.4",
+ "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz",
+ "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/http-assert": {
+ "version": "1.5.6",
+ "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz",
+ "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ioredis-mock": {
+ "version": "8.2.7",
+ "resolved": "https://registry.npmjs.org/@types/ioredis-mock/-/ioredis-mock-8.2.7.tgz",
+ "integrity": "sha512-YsGiaOIYBKeVvu/7GYziAD8qX3LJem5LK00d5PKykzsQJMLysAqXA61AkNuYWCekYl64tbMTqVOMF4SYoCPbQg==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "ioredis": ">=5"
+ }
+ },
+ "node_modules/@types/ioredis4": {
+ "name": "@types/ioredis",
+ "version": "4.28.10",
+ "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz",
+ "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/jquery": {
+ "version": "3.5.34",
+ "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.34.tgz",
+ "integrity": "sha512-3m3939S3erqmTLJANS/uy0B6V7BorKx7RorcGZVjZ62dF5PAGbKEDZK1CuLtKombJkFA2T1jl8LAIIs7IV6gBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/sizzle": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/jsonwebtoken": {
+ "version": "8.5.9",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz",
+ "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/keygrip": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz",
+ "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/koa": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz",
+ "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/accepts": "*",
+ "@types/content-disposition": "*",
+ "@types/cookies": "*",
+ "@types/http-assert": "*",
+ "@types/http-errors": "*",
+ "@types/keygrip": "*",
+ "@types/koa-compose": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/koa__router": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz",
+ "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/koa": "*"
+ }
+ },
+ "node_modules/@types/koa-compose": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.9.tgz",
+ "integrity": "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/koa": "*"
+ }
+ },
+ "node_modules/@types/long": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/memcached": {
+ "version": "2.2.10",
+ "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz",
+ "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime-db": {
+ "version": "1.43.6",
+ "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.6.tgz",
+ "integrity": "sha512-r2cqxAt/Eo5yWBOQie1lyM1JZFCiORa5xtLlhSZI0w8RJggBPKw8c4g/fgQCzWydaDR5bL4imnmix2d1n52iBw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/mysql": {
"version": "2.15.22",
"resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz",
"integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz",
+ "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^4.0.4"
+ }
+ },
+ "node_modules/@types/pg": {
+ "version": "8.6.1",
+ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
+ "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "pg-protocol": "*",
+ "pg-types": "^2.2.0"
+ }
+ },
+ "node_modules/@types/pg-pool": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz",
+ "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/pg": "*"
+ }
+ },
+ "node_modules/@types/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "<1"
+ }
+ },
+ "node_modules/@types/serve-static/node_modules/@types/send": {
+ "version": "0.17.6",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/shimmer": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz",
+ "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz",
+ "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/tedious": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz",
+ "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz",
+ "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/type-utils": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.58.1",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz",
+ "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz",
+ "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.58.1",
+ "@typescript-eslint/types": "^8.58.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz",
+ "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz",
+ "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz",
+ "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1",
+ "@typescript-eslint/utils": "8.58.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz",
+ "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz",
+ "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.58.1",
+ "@typescript-eslint/tsconfig-utils": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/visitor-keys": "8.58.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz",
+ "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.58.1",
+ "@typescript-eslint/types": "8.58.1",
+ "@typescript-eslint/typescript-estree": "8.58.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.58.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz",
+ "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@vercel/oidc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz",
+ "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@vitest/coverage-v8": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.4.tgz",
+ "integrity": "sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^1.0.2",
+ "@vitest/utils": "4.1.4",
+ "ast-v8-to-istanbul": "^1.0.0",
+ "istanbul-lib-coverage": "^3.2.2",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-reports": "^3.2.0",
+ "magicast": "^0.5.2",
+ "obug": "^2.1.1",
+ "std-env": "^4.0.0-rc.1",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@vitest/browser": "4.1.4",
+ "vitest": "4.1.4"
+ },
+ "peerDependenciesMeta": {
+ "@vitest/browser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.4.tgz",
+ "integrity": "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.4",
+ "@vitest/utils": "4.1.4",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.4.tgz",
+ "integrity": "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "4.1.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.4.tgz",
+ "integrity": "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.4.tgz",
+ "integrity": "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.4",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.4.tgz",
+ "integrity": "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.4",
+ "@vitest/utils": "4.1.4",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.4.tgz",
+ "integrity": "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/ui": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.4.tgz",
+ "integrity": "sha512-EgFR7nlj5iTDYZYCvavjFokNYwr3c3ry0sFiCg+N7B233Nwp+NNx7eoF/XvMWDCKY71xXAG3kFkt97ZHBJVL8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.4",
+ "fflate": "^0.8.2",
+ "flatted": "^3.4.2",
+ "pathe": "^2.0.3",
+ "sirv": "^3.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": "4.1.4"
+ }
+ },
+ "node_modules/@vitest/ui/node_modules/fflate": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.4.tgz",
+ "integrity": "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.4",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+ "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+ "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "license": "ISC"
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/abstract-level": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-3.1.1.tgz",
+ "integrity": "sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "is-buffer": "^2.0.5",
+ "level-supports": "^6.2.0",
+ "level-transcoder": "^1.0.1",
+ "maybe-combine-errors": "^1.0.0",
+ "module-error": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/abstract-logging": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz",
+ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==",
+ "license": "MIT"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "deprecated": "package has been renamed to acorn-import-attributes",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-import-phases": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
+ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "acorn": "^8.14.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/agentkeepalive": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
+ "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "humanize-ms": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ai": {
+ "version": "6.0.156",
+ "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.156.tgz",
+ "integrity": "sha512-uyi/5LYbugHQxZsR2PeAFOZEL4WqKkzZw4pv0nQvvdgxgVOsM7snOmGrYkp5fShxH/vnd08SXvHCVTX7oUW7xQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ai-sdk/gateway": "3.0.95",
+ "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/provider-utils": "4.0.23",
+ "@opentelemetry/api": "1.9.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.76 || ^4.1.8"
+ }
+ },
+ "node_modules/ai/node_modules/@opentelemetry/api": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-base": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
+ "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/append-field": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
+ "license": "MIT"
+ },
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aproba": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
+ "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==",
+ "license": "ISC"
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "Python-2.0"
+ },
+ "node_modules/args": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz",
+ "integrity": "sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "5.0.0",
+ "chalk": "2.4.2",
+ "leven": "2.1.0",
+ "mri": "1.1.4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/args/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/args/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/args/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/args/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/args/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/args/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/args/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz",
+ "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "is-string": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz",
+ "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.31",
+ "estree-walker": "^3.0.3",
+ "js-tokens": "^10.0.0"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/async-retry": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "retry": "0.13.1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/avvio": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz",
+ "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@fastify/error": "^4.0.0",
+ "fastq": "^1.17.1"
+ }
+ },
+ "node_modules/await-to-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz",
+ "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz",
+ "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
+ "proxy-from-env": "^2.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "license": "MIT",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.17",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz",
+ "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/basic-auth/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/bcrypt": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
+ "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.11",
+ "node-addon-api": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "license": "Unlicense"
+ },
+ "node_modules/better-sqlite3": {
+ "version": "12.8.0",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.8.0.tgz",
+ "integrity": "sha512-RxD2Vd96sQDjQr20kdP+F+dK/1OUNiVOl200vKBZY8u0vTwysfolF6Hq+3ZK2+h8My9YvZhHsF+RSGZW2VYrPQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "prebuild-install": "^7.1.1"
+ },
+ "engines": {
+ "node": "20.x || 22.x || 23.x || 24.x || 25.x"
+ }
+ },
+ "node_modules/bidi-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
+ "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "require-from-string": "^2.0.2"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz",
+ "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bigjs"
+ }
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/bl/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/bmp-js": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
+ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
+ "license": "MIT"
+ },
+ "node_modules/bmp-ts": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/bmp-ts/-/bmp-ts-1.0.9.tgz",
+ "integrity": "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.14.0",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/bowser": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
+ "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-level": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-3.0.0.tgz",
+ "integrity": "sha512-kGXtLh29jMwqKaskz5xeDLtCtN1KBz/DbQSqmvH7QdJiyGRC7RAM8PPg6gvUiNMa+wVnaxS9eSmEtP/f5ajOVw==",
+ "license": "MIT",
+ "dependencies": {
+ "abstract-level": "^3.1.0"
+ }
+ },
+ "node_modules/browser-or-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz",
+ "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==",
+ "license": "MIT"
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "license": "ISC"
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/buildcheck": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.7.tgz",
+ "integrity": "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==",
+ "optional": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001787",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz",
+ "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chai-as-promised": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz",
+ "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==",
+ "license": "WTFPL",
+ "dependencies": {
+ "check-error": "^1.0.2"
+ },
+ "peerDependencies": {
+ "chai": ">= 2.1.2 < 6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
+ "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.2.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.1.1"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "license": "MIT"
+ },
+ "node_modules/classic-level": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-3.0.0.tgz",
+ "integrity": "sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-level": "^3.1.0",
+ "module-error": "^1.0.1",
+ "napi-macros": "^2.2.2",
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-regexp": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz",
+ "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-regexp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
+ "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+ "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/color-string/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "license": "ISC",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/color/node_modules/color-convert": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/color/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/comment-parser": {
+ "resolved": "tools/comment-parser",
+ "link": true
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/composite-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/composite-error/-/composite-error-1.0.2.tgz",
+ "integrity": "sha512-kr6tZNUb15tHkSGhS6kNxxLHpgYguU6r5F+bUXcxbNYkLGIPX/Z2KKyXgli5t83FjGkBJ+GrludBoj3O8E/1Hw==",
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "engines": [
+ "node >= 6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concurrently": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
+ "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "date-fns": "^2.30.0",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.8.1",
+ "shell-quote": "^1.8.1",
+ "spawn-command": "0.0.2",
+ "supports-color": "^8.1.1",
+ "tree-kill": "^1.2.2",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": "^14.13.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^3.0.0",
+ "unique-string": "^2.0.0",
+ "write-file-atomic": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "license": "ISC"
+ },
+ "node_modules/console-table-printer": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz",
+ "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==",
+ "license": "MIT",
+ "dependencies": {
+ "simple-wcswidth": "^1.1.2"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-hrtime": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz",
+ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convertapi": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/convertapi/-/convertapi-1.15.0.tgz",
+ "integrity": "sha512-wu1pJ27SuIc/mNlbjs8lP1hAsEN16AmKzMZNo9Qx/Z3CrH1ozGQYF2jGXaceXWSRNvKFoCuF0m5ek+vz8Nswrw==",
+ "license": "MIT",
+ "dependencies": {
+ "axios": "^1.6.2"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-parser": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/cors": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/corser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
+ "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/cpu-features": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
+ "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "buildcheck": "~0.0.6",
+ "nan": "^2.19.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
+ "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.7.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.27.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/cssstyle": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
+ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/css-color": "^3.2.0",
+ "rrweb-cssom": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@asamuzakjp/css-color": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+ "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.3",
+ "@csstools/css-color-parser": "^3.0.9",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "lru-cache": "^10.4.3"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@csstools/color-helpers": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@csstools/css-calc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+ "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@csstools/css-color-parser": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.1.0",
+ "@csstools/css-calc": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.4"
+ }
+ },
+ "node_modules/cssstyle/node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cssstyle/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/data-urls": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz",
+ "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-mimetype": "^5.0.0",
+ "whatwg-url": "^16.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "license": "MIT"
+ },
+ "node_modules/decode-bmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz",
+ "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@canvas/image-data": "^1.0.0",
+ "to-data-view": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/decode-ico": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz",
+ "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@canvas/image-data": "^1.0.0",
+ "decode-bmp": "^0.2.0",
+ "to-data-view": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "license": "MIT",
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/default-browser": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz",
+ "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==",
+ "license": "MIT",
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/diff-match-patch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
+ "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns2": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.1.0.tgz",
+ "integrity": "sha512-m27K11aQalRbmUs7RLaz6aPyceLjAoqjPRNTdE7qUouQpl+PC8Bi67O+i9SuJUPbQC8dxFrczAxfmTPuTKHNkw==",
+ "license": "MIT"
+ },
+ "node_modules/docs": {
+ "resolved": "src/docs",
+ "link": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+ "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.2"
+ }
+ },
+ "node_modules/dynalite": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/dynalite/-/dynalite-4.0.0.tgz",
+ "integrity": "sha512-EIDzWEhyz4XT4tDuDTrp8rAV3pOyOf2ETg7htxhERQfJ7B5CPrQNMS9Un9PVCiXM5WVN1w0CxgHXztP8LqT+SA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.4",
+ "big.js": "^6.2.1",
+ "buffer-crc32": "^0.2.13",
+ "lazy": "^1.0.11",
+ "level": "^10.0.0",
+ "lock": "^1.1.0",
+ "memory-level": "^3.0.0",
+ "minimist": "^1.2.8",
+ "once": "^1.4.0"
+ },
+ "bin": {
+ "dynalite": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.334",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz",
+ "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "6.6.6",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz",
+ "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "@types/ws": "^8.5.12",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.4.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.18.3"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-client": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz",
+ "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==",
+ "license": "MIT",
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.18.3",
+ "xmlhttprequest-ssl": "~2.1.1"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io-client/node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io/node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/enquirer/node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz",
+ "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "punycode": "^1.4.1",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz",
+ "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+ "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-abstract/node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-rule-composer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
+ "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz",
+ "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/exif-parser": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
+ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.3",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.14.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-xml-bodyparser": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/express-xml-bodyparser/-/express-xml-bodyparser-0.4.1.tgz",
+ "integrity": "sha512-PlojEEQXdwc68ofPiAanknPf4QBTrFWXPZ+5jDhfrXP/CdLaqEQxQuuzrCqnvy1kETciTxz6OFnDZW/rIxtmlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "xml2js": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-decode-uri-component": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
+ "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stringify": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz",
+ "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@fastify/merge-json-schemas": "^0.2.0",
+ "ajv": "^8.12.0",
+ "ajv-formats": "^3.0.1",
+ "fast-uri": "^3.0.0",
+ "json-schema-ref-resolver": "^3.0.0",
+ "rfdc": "^1.2.0"
+ }
+ },
+ "node_modules/fast-json-stringify/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/fast-json-stringify/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-querystring": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz",
+ "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-decode-uri-component": "^1.0.1"
+ }
+ },
+ "node_modules/fast-text-encoding": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz",
+ "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
+ "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.1.3"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.5.8",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
+ "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "fast-xml-builder": "^1.1.4",
+ "path-expression-matcher": "^1.2.0",
+ "strnum": "^2.2.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastify": {
+ "version": "5.8.4",
+ "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.4.tgz",
+ "integrity": "sha512-sa42J1xylbBAYUWALSBoyXKPDUvM3OoNOibIefA+Oha57FryXKKCZarA1iDntOCWp3O35voZLuDg2mdODXtPzQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@fastify/ajv-compiler": "^4.0.5",
+ "@fastify/error": "^4.0.0",
+ "@fastify/fast-json-stringify-compiler": "^5.0.0",
+ "@fastify/proxy-addr": "^5.0.0",
+ "abstract-logging": "^2.0.1",
+ "avvio": "^9.0.0",
+ "fast-json-stringify": "^6.0.0",
+ "find-my-way": "^9.0.0",
+ "light-my-request": "^6.0.0",
+ "pino": "^9.14.0 || ^10.1.0",
+ "process-warning": "^5.0.0",
+ "rfdc": "^1.3.1",
+ "secure-json-parse": "^4.0.0",
+ "semver": "^7.6.0",
+ "toad-cache": "^3.7.0"
+ }
+ },
+ "node_modules/fastify-plugin": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz",
+ "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fauxqs": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/fauxqs/-/fauxqs-2.5.0.tgz",
+ "integrity": "sha512-p7M2i2vo+Ywm7qrsvWbhqAPMCX+T1hxvAzwslOPVIKEEFoPpXzQItAIngbK3rxXpDIPEwPkh3UKNFR6trdTa3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@aws-sdk/client-s3": "^3.1017.0",
+ "@aws-sdk/client-sns": "^3.1017.0",
+ "@aws-sdk/client-sqs": "^3.1017.0",
+ "@fastify/cors": "^11.2.0",
+ "@smithy/node-http-handler": "^4.5.0",
+ "fastify": "^5.8.4",
+ "toad-cache": "^3.7.0",
+ "valibot": "^1.3.1"
+ },
+ "bin": {
+ "fauxqs": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=22.5.0"
+ }
+ },
+ "node_modules/fauxqs/node_modules/@smithy/node-http-handler": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz",
+ "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^5.3.13",
+ "@smithy/querystring-builder": "^4.2.13",
+ "@smithy/types": "^4.14.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "license": "MIT"
+ },
+ "node_modules/fengari": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/fengari/-/fengari-0.1.5.tgz",
+ "integrity": "sha512-0DS4Nn4rV8qyFlQCpKK8brT61EUtswynrpfFTcgLErcilBIBskSMQ86fO2WVuybr14ywyKdRjv91FiRZwnEuvQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "readline-sync": "^1.4.10",
+ "sprintf-js": "^1.1.3",
+ "tmp": "^0.2.5"
+ }
+ },
+ "node_modules/fengari-interop": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/fengari-interop/-/fengari-interop-0.1.4.tgz",
+ "integrity": "sha512-4/CW/3PJUo3ebD4ACgE1g/3NGEYSq7OQAyETyypsAl/WeySDBbxExikkayNkZzbpgyC9GyJp8v1DU2VOXxNq7Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "fengari": "^0.1.0"
+ }
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/fflate": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz",
+ "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==",
+ "license": "MIT"
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/file-stream-rotator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz",
+ "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": "^2.29.1"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "21.3.3",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.3.tgz",
+ "integrity": "sha512-pNwbwz8c3aZ+GvbJnIsCnDjKvgCZLHxkFWLEFxU3RMa+Ey++ZSEfisvsWQMcdys6PpxQjWUOIDi1fifXsW3YRg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.1",
+ "uint8array-extras": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT"
+ },
+ "node_modules/file-walker": {
+ "resolved": "tools/file-walker",
+ "link": true
+ },
+ "node_modules/fill-keys": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz",
+ "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-object": "~1.0.1",
+ "merge-descriptors": "~1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-my-way": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz",
+ "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-querystring": "^1.0.0",
+ "safe-regex2": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/firebase-admin": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-10.3.0.tgz",
+ "integrity": "sha512-A0wgMLEjyVyUE+heyMJYqHRkPVjpebhOYsa47RHdrTM4ltApcx8Tn86sUmjqxlfh09gNnILAm7a8q5+FmgBYpg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@fastify/busboy": "^1.1.0",
+ "@firebase/database-compat": "^0.2.0",
+ "@firebase/database-types": "^0.9.7",
+ "@types/node": ">=12.12.47",
+ "jsonwebtoken": "^8.5.1",
+ "jwks-rsa": "^2.0.2",
+ "node-forge": "^1.3.1",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "optionalDependencies": {
+ "@google-cloud/firestore": "^4.15.1",
+ "@google-cloud/storage": "^5.18.3"
+ }
+ },
+ "node_modules/firebase-admin/node_modules/jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "license": "MIT",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/firebase-admin/node_modules/jwa": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
+ "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/firebase-admin/node_modules/jws": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz",
+ "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^1.4.2",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/firebase-admin/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/firebase-admin/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "license": "ISC"
+ },
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "license": "MIT"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data-encoder": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
+ "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==",
+ "license": "MIT"
+ },
+ "node_modules/formdata-node": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
+ "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "1.0.0",
+ "web-streams-polyfill": "4.0.0-beta.3"
+ },
+ "engines": {
+ "node": ">= 12.20"
+ }
+ },
+ "node_modules/formdata-node/node_modules/web-streams-polyfill": {
+ "version": "4.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+ "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "license": "MIT"
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.4",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz",
+ "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function-timeout": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz",
+ "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gaxios": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz",
+ "integrity": "sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.7"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/genwiki": {
+ "resolved": "tools/genwiki",
+ "link": true
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/getopts": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+ "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==",
+ "license": "MIT"
+ },
+ "node_modules/gifwrap": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz",
+ "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==",
+ "license": "MIT",
+ "dependencies": {
+ "image-q": "^4.0.0",
+ "omggif": "^1.0.10"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "license": "MIT"
+ },
+ "node_modules/gitignore-to-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz",
+ "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.4 <5 || >=6.9"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/globby/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/google-auth-library": {
+ "version": "10.6.2",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz",
+ "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^7.1.4",
+ "gcp-metadata": "8.1.2",
+ "google-logging-utils": "1.1.3",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/gaxios": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
+ "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "node-fetch": "^3.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^7.0.0",
+ "google-logging-utils": "^1.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/google-gax": {
+ "version": "2.30.5",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.30.5.tgz",
+ "integrity": "sha512-Jey13YrAN2hfpozHzbtrwEfEHdStJh1GwaQ2+Akh1k0Tv/EuNVSuBtHZoKSBm5wBMvNsxTsEIZ/152NrYyZgxQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@grpc/grpc-js": "~1.6.0",
+ "@grpc/proto-loader": "^0.6.12",
+ "@types/long": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "duplexify": "^4.0.0",
+ "fast-text-encoding": "^1.0.3",
+ "google-auth-library": "^7.14.0",
+ "is-stream-ended": "^0.1.4",
+ "node-fetch": "^2.6.1",
+ "object-hash": "^3.0.0",
+ "proto3-json-serializer": "^0.1.8",
+ "protobufjs": "6.11.3",
+ "retry-request": "^4.0.0"
+ },
+ "bin": {
+ "compileProtos": "build/tools/compileProtos.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-gax/node_modules/@grpc/grpc-js": {
+ "version": "1.6.12",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.12.tgz",
+ "integrity": "sha512-JmvQ03OTSpVd9JTlj/K3IWHSz4Gk/JMLUTtW7Zb0KvO1LcOYGATh5cNuRYzCAeDR3O8wq+q8FZe97eO9MBrkUw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@grpc/proto-loader": "^0.7.0",
+ "@types/node": ">=12.12.47"
+ },
+ "engines": {
+ "node": "^8.13.0 || >=10.10.0"
+ }
+ },
+ "node_modules/google-gax/node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
+ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/google-gax/node_modules/@grpc/grpc-js/node_modules/protobufjs": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
+ "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/google-gax/node_modules/@grpc/proto-loader": {
+ "version": "0.6.13",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz",
+ "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@types/long": "^4.0.1",
+ "lodash.camelcase": "^4.3.0",
+ "long": "^4.0.0",
+ "protobufjs": "^6.11.3",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/google-gax/node_modules/@grpc/proto-loader/node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/google-gax/node_modules/@grpc/proto-loader/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-gax/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/google-gax/node_modules/gcp-metadata": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+ "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-gax/node_modules/google-auth-library": {
+ "version": "7.14.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz",
+ "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^4.0.0",
+ "gcp-metadata": "^4.2.0",
+ "gtoken": "^5.0.4",
+ "jws": "^4.0.0",
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-gax/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-gax/node_modules/protobufjs": {
+ "version": "6.11.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
+ "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": ">=13.7.0",
+ "long": "^4.0.0"
+ },
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ }
+ },
+ "node_modules/google-gax/node_modules/protobufjs/node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/google-gax/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-p12-pem": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.4.tgz",
+ "integrity": "sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==",
+ "deprecated": "Package is no longer maintained",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-forge": "^1.3.1"
+ },
+ "bin": {
+ "gp12-pem": "build/src/bin/gp12-pem.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/groq-sdk": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz",
+ "integrity": "sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/node": "^18.11.18",
+ "@types/node-fetch": "^2.6.4",
+ "abort-controller": "^3.0.0",
+ "agentkeepalive": "^4.2.1",
+ "form-data-encoder": "1.7.2",
+ "formdata-node": "^4.3.2",
+ "node-fetch": "^2.6.7",
+ "web-streams-polyfill": "^3.2.1"
+ }
+ },
+ "node_modules/groq-sdk/node_modules/@types/node": {
+ "version": "18.19.130",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz",
+ "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/groq-sdk/node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "license": "MIT"
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/gtoken": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz",
+ "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^4.0.0",
+ "google-p12-pem": "^3.1.3",
+ "jws": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.9",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
+ "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "license": "ISC"
+ },
+ "node_modules/hash-stream-validation": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz",
+ "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/helmet": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz",
+ "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/hi-base32": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz",
+ "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==",
+ "license": "MIT"
+ },
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.6",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz",
+ "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
+ "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-server": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
+ "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "basic-auth": "^2.0.1",
+ "chalk": "^4.1.2",
+ "corser": "^2.0.1",
+ "he": "^1.2.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy": "^1.18.1",
+ "mime": "^1.6.0",
+ "minimist": "^1.2.6",
+ "opener": "^1.5.1",
+ "portfinder": "^1.0.28",
+ "secure-compare": "3.0.1",
+ "union": "~0.5.0",
+ "url-join": "^4.0.1"
+ },
+ "bin": {
+ "http-server": "bin/http-server"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/http-server/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/humanize-ms": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.0.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/ico-endec": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz",
+ "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==",
+ "license": "MPL-2.0"
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/image-q": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz",
+ "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "16.9.1"
+ }
+ },
+ "node_modules/image-q/node_modules/@types/node": {
+ "version": "16.9.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz",
+ "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==",
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-in-the-middle": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz",
+ "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "acorn": "^8.8.2",
+ "acorn-import-assertions": "^1.9.0",
+ "cjs-module-lexer": "^1.2.2",
+ "module-details-from-path": "^1.0.3"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/ioredis": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz",
+ "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@ioredis/commands": "1.5.1",
+ "cluster-key-slot": "^1.1.0",
+ "debug": "^4.3.4",
+ "denque": "^2.1.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.isarguments": "^3.1.0",
+ "redis-errors": "^1.2.0",
+ "redis-parser": "^3.0.0",
+ "standard-as-callback": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ioredis"
+ }
+ },
+ "node_modules/ioredis-mock": {
+ "version": "8.13.1",
+ "resolved": "https://registry.npmjs.org/ioredis-mock/-/ioredis-mock-8.13.1.tgz",
+ "integrity": "sha512-Wsi50AU+cMiI32nAgfwpUaJVBtb4iQdVsOHl9M6R3tePCO/8vGsToCVIG82XWAxN4Se55TZoOzVseu+QngFLyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@ioredis/as-callback": "^3.0.0",
+ "@ioredis/commands": "^1.4.0",
+ "fengari": "^0.1.4",
+ "fengari-interop": "^0.1.3",
+ "semver": "^7.7.2"
+ },
+ "engines": {
+ "node": ">=12.22"
+ },
+ "peerDependencies": {
+ "@types/ioredis-mock": "^8",
+ "ioredis": "^5"
+ }
+ },
+ "node_modules/ip-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz",
+ "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
+ "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-ip": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz",
+ "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==",
+ "license": "MIT",
+ "dependencies": {
+ "ip-regex": "^5.0.0",
+ "super-regex": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz",
+ "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-stream-ended": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
+ "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-supported-regexp-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-2.0.0.tgz",
+ "integrity": "sha512-8i4+OYUjdUaJ88KAs1WojIThDFjIpeYNrSlYy1g/At2p9YjQ7HEmB1yn60un0jRFjM3TQbKPMAluTPEPncZfqA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isbot": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz",
+ "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/node": "*"
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@types/node": {
- "version": "20.11.24",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
- "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "undici-types": "~5.26.4"
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@types/node-fetch": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
- "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
+ "node_modules/istanbul-lib-processinfo/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/node": "*",
- "form-data": "^4.0.0"
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@types/pg": {
- "version": "8.6.1",
- "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
- "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==",
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/node": "*",
- "pg-protocol": "*",
- "pg-types": "^2.2.0"
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@types/pg-pool": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz",
- "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==",
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/pg": "*"
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@types/qs": {
- "version": "6.9.14",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz",
- "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA=="
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@types/range-parser": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
+ "node_modules/javascript-time-ago": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.6.4.tgz",
+ "integrity": "sha512-7K/Z37LuwVaxxjutUDd1pXpznufPcox0b1UYu00ksAMMlV6IsxIvduwL3kgfPxuBVF8jVj7nhrKMPDslMq94aQ==",
+ "license": "MIT",
+ "dependencies": {
+ "relative-time-format": "^1.1.12"
+ }
},
- "node_modules/@types/resolve": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
- "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
- "dev": true
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
},
- "node_modules/@types/send": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/@types/serve-static": {
- "version": "1.15.5",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
- "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
+ "node_modules/jimp": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/jimp/-/jimp-1.6.1.tgz",
+ "integrity": "sha512-hNQh6rZtWfSVWSNVmvq87N5BPJsNH7k7I7qyrXf9DOma9xATQk3fsyHazCQe51nCjdkoWdTmh0vD7bjVSLoxxw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jimp/core": "1.6.1",
+ "@jimp/diff": "1.6.1",
+ "@jimp/js-bmp": "1.6.1",
+ "@jimp/js-gif": "1.6.1",
+ "@jimp/js-jpeg": "1.6.1",
+ "@jimp/js-png": "1.6.1",
+ "@jimp/js-tiff": "1.6.1",
+ "@jimp/plugin-blit": "1.6.1",
+ "@jimp/plugin-blur": "1.6.1",
+ "@jimp/plugin-circle": "1.6.1",
+ "@jimp/plugin-color": "1.6.1",
+ "@jimp/plugin-contain": "1.6.1",
+ "@jimp/plugin-cover": "1.6.1",
+ "@jimp/plugin-crop": "1.6.1",
+ "@jimp/plugin-displace": "1.6.1",
+ "@jimp/plugin-dither": "1.6.1",
+ "@jimp/plugin-fisheye": "1.6.1",
+ "@jimp/plugin-flip": "1.6.1",
+ "@jimp/plugin-hash": "1.6.1",
+ "@jimp/plugin-mask": "1.6.1",
+ "@jimp/plugin-print": "1.6.1",
+ "@jimp/plugin-quantize": "1.6.1",
+ "@jimp/plugin-resize": "1.6.1",
+ "@jimp/plugin-rotate": "1.6.1",
+ "@jimp/plugin-threshold": "1.6.1",
+ "@jimp/types": "1.6.1",
+ "@jimp/utils": "1.6.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@types/http-errors": "*",
- "@types/mime": "*",
- "@types/node": "*"
+ "@hapi/hoek": "^9.3.0",
+ "@hapi/topo": "^5.1.0",
+ "@sideway/address": "^4.1.5",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
}
},
- "node_modules/@types/shimmer": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz",
- "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww=="
+ "node_modules/jose": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.7.tgz",
+ "integrity": "sha512-5hFWIigKqC+e/lRyQhfnirrAqUdIPMB7SJRqflJaO29dW7q5DFvH1XCSTmv6PQ6pb++0k6MJlLRoS0Wv4s38Wg==",
+ "license": "MIT",
+ "dependencies": {
+ "@panva/asn1.js": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0 < 13 || >=13.7.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
},
- "node_modules/@types/tedious": {
- "version": "4.0.14",
- "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz",
- "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==",
+ "node_modules/jpeg-js": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
+ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/jquery": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz",
+ "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==",
+ "license": "MIT"
+ },
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-sha256": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
+ "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
+ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/@types/triple-beam": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
- "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
+ "node_modules/jsdom": {
+ "version": "29.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.0.tgz",
+ "integrity": "sha512-9FshNB6OepopZ08unmmGpsF7/qCjxGPbo3NbgfJAnPeHXnsODE9WWffXZtRFRFe0ntzaAOcSKNJFz8wiyvF1jQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@asamuzakjp/css-color": "^5.0.1",
+ "@asamuzakjp/dom-selector": "^7.0.2",
+ "@bramus/specificity": "^2.4.2",
+ "@csstools/css-syntax-patches-for-csstree": "^1.1.1",
+ "@exodus/bytes": "^1.15.0",
+ "css-tree": "^3.2.1",
+ "data-urls": "^7.0.0",
+ "decimal.js": "^10.6.0",
+ "html-encoding-sniffer": "^6.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "lru-cache": "^11.2.7",
+ "parse5": "^8.0.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^6.0.1",
+ "undici": "^7.24.3",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^8.0.1",
+ "whatwg-mimetype": "^5.0.0",
+ "whatwg-url": "^16.0.1",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "canvas": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
},
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
- "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "node_modules/jsdom/node_modules/html-encoding-sniffer": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz",
+ "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ "@exodus/bytes": "^1.6.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "dev": true
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "dev": true
+ "node_modules/json-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.0.0"
+ }
},
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
- "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
- "dev": true
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
},
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "node_modules/json-colorizer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-colorizer/-/json-colorizer-3.0.1.tgz",
+ "integrity": "sha512-4YyRAbD6eHeRnJD9vo0zjiU5fyY9QR6T+iYuH5DpO0XPThKWozpD4MaeY/8nLZIkHC3yEQMFLL+6P94E+JekDw==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.20"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-ref-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz",
+ "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/json-schema-to-ts": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz",
+ "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "ts-algebra": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
}
},
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
- "dev": true
+ "node_modules/json-schema-traverse": {
+ "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==",
+ "license": "MIT"
},
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
- "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6"
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
- "dev": true,
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
"dependencies": {
- "@xtuc/ieee754": "^1.2.0"
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
- "dev": true,
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
+ "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
+ "license": "MIT",
"dependencies": {
- "@xtuc/long": "4.2.2"
+ "jws": "^4.0.1",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
}
},
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
- "dev": true
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
- "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
- "dev": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-opt": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6",
- "@webassemblyjs/wast-printer": "1.11.6"
+ "node_modules/jssha": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz",
+ "integrity": "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
}
},
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
- "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "node_modules/just-extend": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
+ "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jwa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
- "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
- "dev": true,
+ "node_modules/jwks-rsa": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz",
+ "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6"
+ "@types/express": "^4.17.14",
+ "@types/jsonwebtoken": "^8.5.9",
+ "debug": "^4.3.4",
+ "jose": "^2.0.6",
+ "limiter": "^1.1.5",
+ "lru-memoizer": "^2.1.4"
+ },
+ "engines": {
+ "node": ">=10 < 13 || >=14"
}
},
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
- "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
- "dev": true,
+ "node_modules/jws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
+ "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "jwa": "^2.0.1",
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
- "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
- "dev": true,
+ "node_modules/keygen": {
+ "resolved": "tools/keygen",
+ "link": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@xtuc/long": "4.2.2"
+ "json-buffer": "3.0.1"
}
},
- "node_modules/@webpack-cli/configtest": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
- "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=14.15.0"
- },
- "peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
+ "node": ">=0.10.0"
}
},
- "node_modules/@webpack-cli/info": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
- "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
- "dev": true,
+ "node_modules/knex": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/knex/-/knex-3.2.9.tgz",
+ "integrity": "sha512-dtAILTjBMaG8YloP5oBxohDIKyIsdQ/TkcVvSjhsksvsjeH63Y0PADyuMDfNZKbVT3Rlx3vEYVBlecbPT/KerA==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "2.0.19",
+ "commander": "^10.0.0",
+ "debug": "4.3.4",
+ "escalade": "^3.1.1",
+ "esm": "^3.2.25",
+ "get-package-type": "^0.1.0",
+ "getopts": "2.3.0",
+ "interpret": "^2.2.0",
+ "lodash": "^4.17.21",
+ "pg-connection-string": "2.6.2",
+ "rechoir": "^0.8.0",
+ "resolve-from": "^5.0.0",
+ "tarn": "^3.0.2",
+ "tildify": "2.0.0"
+ },
+ "bin": {
+ "knex": "bin/cli.js"
+ },
"engines": {
- "node": ">=14.15.0"
+ "node": ">=16"
},
"peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
+ "pg-query-stream": "^4.14.0"
+ },
+ "peerDependenciesMeta": {
+ "better-sqlite3": {
+ "optional": true
+ },
+ "mysql": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-native": {
+ "optional": true
+ },
+ "pg-query-stream": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
}
},
- "node_modules/@webpack-cli/serve": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
- "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
- "dev": true,
+ "node_modules/knex/node_modules/colorette": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
+ "license": "MIT"
+ },
+ "node_modules/knex/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
"engines": {
- "node": ">=14.15.0"
+ "node": ">=14"
+ }
+ },
+ "node_modules/knex/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
},
- "peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
+ "engines": {
+ "node": ">=6.0"
},
"peerDependenciesMeta": {
- "webpack-dev-server": {
+ "supports-color": {
"optional": true
}
}
},
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
+ "node_modules/knex/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "license": "MIT"
},
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
+ "node_modules/knex/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "license": "MIT"
},
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "node_modules/lazy": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
+ "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.2.0"
+ }
+ },
+ "node_modules/level": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/level/-/level-10.0.0.tgz",
+ "integrity": "sha512-aZJvdfRr/f0VBbSRF5C81FHON47ZsC2TkGxbBezXpGGXAUEL/s6+GP73nnhAYRSCIqUNsmJjfeOF4lzRDKbUig==",
+ "license": "MIT",
"dependencies": {
- "event-target-shim": "^5.0.0"
+ "abstract-level": "^3.1.0",
+ "browser-level": "^3.0.0",
+ "classic-level": "^3.0.0"
},
"engines": {
- "node": ">=6.5"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/level"
}
},
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "node_modules/level-supports": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-6.2.0.tgz",
+ "integrity": "sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/level-transcoder": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz",
+ "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==",
+ "license": "MIT",
"dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
+ "buffer": "^6.0.3",
+ "module-error": "^1.0.1"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=12"
}
},
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "bin": {
- "acorn": "bin/acorn"
- },
+ "node_modules/leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "peerDependencies": {
- "acorn": "^8"
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "node_modules/license-check-and-add": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/license-check-and-add/-/license-check-and-add-4.0.5.tgz",
+ "integrity": "sha512-FySnMi3Kf/vO5jka8tcbVF1FhDFb8PWsQ8pg5Y7U/zkQgta+fIrJGcGHO58WFjfKlgvhneG1uQ00Fpxzhau3QA==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "debug": "4"
+ "fs-extra": "^8.1.0",
+ "gitignore-to-glob": "^0.3.0",
+ "globby": "^10.0.1",
+ "ignore": "^5.1.2",
+ "yargs": "^13.3.0"
},
+ "bin": {
+ "license-check-and-add": "dist/src/cli.js"
+ }
+ },
+ "node_modules/license-check-and-add/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=6"
}
},
- "node_modules/agent-base/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/license-check-and-add/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "color-convert": "^1.9.0"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">=4"
}
},
- "node_modules/agent-base/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "node_modules/license-check-and-add/node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
},
- "node_modules/agentkeepalive": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
- "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
+ "node_modules/license-check-and-add/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "humanize-ms": "^1.2.1"
- },
- "engines": {
- "node": ">= 8.0.0"
+ "color-name": "1.1.3"
}
},
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "node_modules/license-check-and-add/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/license-check-and-add/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/license-check-and-add/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
+ "locate-path": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/license-check-and-add/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "engines": {
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "node_modules/license-check-and-add/node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
}
},
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "node_modules/license-check-and-add/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "node_modules/license-check-and-add/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/license-check-and-add/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/license-check-and-add/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/any-base": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
- "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "node_modules/license-check-and-add/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "p-limit": "^2.0.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6"
}
},
- "node_modules/append-field": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
- "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
+ "node_modules/license-check-and-add/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/append-transform": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
- "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "node_modules/license-check-and-add/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "default-require-extensions": "^3.0.0"
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/aproba": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
- },
- "node_modules/archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
- "dev": true
- },
- "node_modules/are-we-there-yet": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
- "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "node_modules/license-check-and-add/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
+ "ansi-regex": "^4.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/are-we-there-yet/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "node_modules/license-check-and-add/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/license-check-and-add/node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": ">=6"
}
},
- "node_modules/argle": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/argle/-/argle-1.1.2.tgz",
- "integrity": "sha512-2sQZC5HeeSH9cQEwnZZhmHiKfvJkQ6ncpf8zl9Hv629aiMUsOw8jzYqOhpaMleQGzpQ7avCwrwyqSW1f4t7v0Q==",
+ "node_modules/license-check-and-add/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/license-check-and-add/node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "lodash.isfunction": "^3.0.8",
- "lodash.isnumber": "^3.0.3"
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
}
},
- "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/license-headers": {
+ "resolved": "tools/license-headers",
+ "link": true
},
- "node_modules/args": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz",
- "integrity": "sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==",
+ "node_modules/light-my-request": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz",
+ "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause",
"dependencies": {
- "camelcase": "5.0.0",
- "chalk": "2.4.2",
- "leven": "2.1.0",
- "mri": "1.1.4"
+ "cookie": "^1.0.1",
+ "process-warning": "^4.0.0",
+ "set-cookie-parser": "^2.6.0"
+ }
+ },
+ "node_modules/light-my-request/node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/light-my-request/node_modules/process-warning": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz",
+ "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
},
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
- "node_modules/args/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=0.8.0"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/args/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dependencies": {
- "safer-buffer": "~2.1.0"
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": "*"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ "node_modules/limiter": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
+ "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
+ "node_modules/loader-runner": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
+ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.11.5"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "node_modules/aws-sdk": {
- "version": "2.1588.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1588.0.tgz",
- "integrity": "sha512-FbayuJZd8xlaVPNpIGfj111pqZ7ZIeWsUkBTQ/nXx4t7y9dTnT41SeOvSObpMCCti8xxkJkN15mIBaI3EkjWbg==",
- "hasInstallScript": true,
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
"dependencies": {
- "buffer": "4.9.2",
- "events": "1.1.1",
- "ieee754": "1.1.13",
- "jmespath": "0.16.0",
- "querystring": "0.2.0",
- "sax": "1.2.1",
- "url": "0.10.3",
- "util": "^0.12.4",
- "uuid": "8.0.0",
- "xml2js": "0.6.2"
+ "p-locate": "^5.0.0"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/aws-sdk/node_modules/events": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
- "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==",
- "engines": {
- "node": ">=0.4.x"
- }
+ "node_modules/lock": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz",
+ "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==",
+ "license": "MIT"
},
- "node_modules/aws-sdk/node_modules/uuid": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
- "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
},
- "node_modules/axios": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
- "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "license": "MIT"
},
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+ "license": "MIT"
},
- "node_modules/base-64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
- "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="
+ "node_modules/lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
+ "license": "MIT"
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "license": "MIT"
},
- "node_modules/base64id": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
- "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
- "engines": {
- "node": "^4.5.0 || >= 5.9"
- }
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "license": "MIT"
},
- "node_modules/basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
- "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
- "dependencies": {
- "safe-buffer": "5.1.2"
- },
- "engines": {
- "node": ">= 0.8"
- }
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "license": "MIT"
},
- "node_modules/basic-auth/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT"
},
- "node_modules/bcrypt": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
- "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
- "hasInstallScript": true,
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "license": "MIT",
"dependencies": {
- "@mapbox/node-pre-gyp": "^1.0.11",
- "node-addon-api": "^5.0.0"
+ "chalk": "^2.4.2"
},
"engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dependencies": {
- "tweetnacl": "^0.14.3"
+ "node": ">=8"
}
},
- "node_modules/better-sqlite3": {
- "version": "9.4.3",
- "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.4.3.tgz",
- "integrity": "sha512-ud0bTmD9O3uWJGuXDltyj3R47Nz0OHX8iqPOT5PMspGqlu/qQFn+5S2eFBUCrySpavTjFXbi4EgrfVvPAHlImw==",
- "hasInstallScript": true,
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
"dependencies": {
- "bindings": "^1.5.0",
- "prebuild-install": "^7.1.1"
- }
- },
- "node_modules/bignumber.js": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz",
- "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==",
+ "color-convert": "^1.9.0"
+ },
"engines": {
- "node": "*"
+ "node": ">=4"
}
},
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
"dependencies": {
- "file-uri-to-path": "1.0.0"
+ "color-name": "1.1.3"
}
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
},
- "node_modules/bl/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "node_modules/log-symbols/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "node_modules/bl/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
"engines": {
- "node": ">= 6"
+ "node": ">=4"
}
},
- "node_modules/bmp-js": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
- "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="
- },
- "node_modules/body-parser": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
- "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "node": ">=4"
}
},
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
+ "license": "MIT",
"dependencies": {
- "fill-range": "^7.0.1"
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/browser-or-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz",
- "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg=="
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
+ "node_modules/long": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+ "license": "Apache-2.0"
},
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "node_modules/lorem-ipsum": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/lorem-ipsum/-/lorem-ipsum-2.0.8.tgz",
+ "integrity": "sha512-5RIwHuCb979RASgCJH0VKERn9cQo/+NcAi2BMe9ddj+gp7hujl6BI+qdOG4nVsLDpwWEJwTVYXNKP6BGgbcoGA==",
+ "license": "ISC",
"dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
+ "commander": "^9.3.0"
},
"bin": {
- "browserslist": "cli.js"
+ "lorem-ipsum": "dist/bin/lorem-ipsum.bin.js"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "dependencies": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "node_modules/buffer-equal": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
- "engines": {
- "node": ">=0.4.0"
+ "node": ">= 8.x",
+ "npm": ">= 5.x"
}
},
- "node_modules/buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/buildcheck": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz",
- "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==",
- "optional": true,
+ "node_modules/lorem-ipsum/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": "^12.20.0 || >=14"
}
},
- "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/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.1"
}
},
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
+ "tslib": "^2.0.3"
}
},
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "node_modules/lru-cache": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz",
+ "integrity": "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 0.8"
+ "node": "20 || >=22"
}
},
- "node_modules/caching-transform": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
- "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
- "dev": true,
+ "node_modules/lru-memoizer": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz",
+ "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==",
+ "license": "MIT",
"dependencies": {
- "hasha": "^5.0.0",
- "make-dir": "^3.0.0",
- "package-hash": "^4.0.0",
- "write-file-atomic": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "lodash.clonedeep": "^4.5.0",
+ "lru-cache": "6.0.0"
}
},
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "node_modules/lru-memoizer/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=10"
}
},
- "node_modules/camelcase": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
- "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
- "engines": {
- "node": ">=6"
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001591",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz",
- "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==",
+ "node_modules/magicast": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz",
+ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/capture-console": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/capture-console/-/capture-console-1.0.2.tgz",
- "integrity": "sha512-vQNTSFr0cmHAYXXG3KG7ZJQn0XxC3K2di/wUZVb6yII6gqSN/10Egd3vV4XqJ00yCRNHy2wkN4uWHE+rJstDrw==",
+ "license": "MIT",
"dependencies": {
- "argle": "~1.1.1",
- "lodash.isfunction": "~3.0.8",
- "randomstring": "^1.3.0"
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "source-map-js": "^1.2.1"
}
},
- "node_modules/chai": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
- "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "license": "MIT",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
+ "semver": "^6.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dependencies": {
- "check-error": "^1.0.2"
- },
- "peerDependencies": {
- "chai": ">= 2.1.2 < 5"
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "node_modules/marked": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz",
+ "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">= 0.4"
}
},
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
+ "node_modules/maybe-combine-errors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz",
+ "integrity": "sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==",
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=10"
}
},
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "node_modules/mdn-data": {
+ "version": "2.27.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
"dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/memory-level": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-3.1.0.tgz",
+ "integrity": "sha512-mTqFVi5iReKcjue/pag0OY4VNU7dlagCyjjPwWGierpk1Bpl9WjOxgXIswymPW3Q9bj3Foay+Z16mPGnKzvTkQ==",
+ "license": "MIT",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
+ "abstract-level": "^3.1.0",
+ "functional-red-black-tree": "^1.0.1",
+ "module-error": "^1.0.1"
},
"engines": {
- "node": ">= 8.10.0"
- },
+ "node": ">=18"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
"funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/chownr": {
+ "node_modules/merge-stream": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "engines": {
- "node": ">=10"
- }
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6.0"
+ "node": ">= 8"
}
},
- "node_modules/chronokinesis": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/chronokinesis/-/chronokinesis-6.0.0.tgz",
- "integrity": "sha512-NxGxNuzROLws2VVvSj9r1qrq0JK0AwR44FNk+sGfPZlG5EW3viz6z2elg6ZwE2YFCn6+Qg3sPqkfIYLyZ0wAtQ=="
- },
- "node_modules/cjs-module-lexer": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
- "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "node_modules/clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
"dependencies": {
- "source-map": "~0.6.0"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">= 10.0"
+ "node": ">=8.6"
}
},
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/cli-columns": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz",
- "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==",
- "dependencies": {
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
+ "node_modules/migrations-test": {
+ "resolved": "tools/migrations-test",
+ "link": true
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
},
"engines": {
- "node": ">= 10"
+ "node": ">=10.0.0"
}
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">= 0.6"
}
},
- "node_modules/cliui/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "mime-db": "1.52.0"
},
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "engines": {
- "node": ">=0.8"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
+ "node": "18 || 20 || >=22"
},
- "engines": {
- "node": ">=7.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "bin": {
- "color-support": "bin.js"
+ "node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true
- },
- "node_modules/colorspace": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
- "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "license": "MIT",
"dependencies": {
- "color": "^3.1.3",
- "text-hex": "1.0.x"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/colorspace/node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
"dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/colorspace/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "license": "MIT",
"dependencies": {
- "color-name": "1.1.3"
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "node_modules/colorspace/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "license": "MIT"
},
- "node_modules/columnify": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz",
- "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==",
+ "node_modules/mnemonist": {
+ "version": "0.38.3",
+ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz",
+ "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==",
+ "license": "MIT",
"dependencies": {
- "strip-ansi": "^6.0.1",
- "wcwidth": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
+ "obliterator": "^1.6.1"
}
},
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/mocha": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
+ "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
+ "license": "MIT",
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.3.0",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "find-up": "3.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.13.1",
+ "log-symbols": "3.0.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.5",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.6",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "1.6.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
}
},
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
- "dev": true
- },
- "node_modules/composite-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/composite-error/-/composite-error-1.0.2.tgz",
- "integrity": "sha512-kr6tZNUb15tHkSGhS6kNxxLHpgYguU6r5F+bUXcxbNYkLGIPX/Z2KKyXgli5t83FjGkBJ+GrludBoj3O8E/1Hw=="
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
+ "node_modules/mocha/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=6"
}
},
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "node_modules/mocha/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
"dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
+ "color-convert": "^1.9.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=4"
}
},
- "node_modules/compression/node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
- "engines": {
- "node": ">= 0.8"
+ "node_modules/mocha/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
}
},
- "node_modules/compression/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ "node_modules/mocha/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
},
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "engines": [
- "node >= 0.8"
- ],
+ "node_modules/mocha/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
"dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/concurrently": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
- "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
- "dev": true,
+ "node_modules/mocha/node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "license": "ISC",
"dependencies": {
- "chalk": "^4.1.2",
- "date-fns": "^2.30.0",
- "lodash": "^4.17.21",
- "rxjs": "^7.8.1",
- "shell-quote": "^1.8.1",
- "spawn-command": "0.0.2",
- "supports-color": "^8.1.1",
- "tree-kill": "^1.2.2",
- "yargs": "^17.7.2"
- },
- "bin": {
- "conc": "dist/bin/concurrently.js",
- "concurrently": "dist/bin/concurrently.js"
- },
- "engines": {
- "node": "^14.13.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
}
},
- "node_modules/concurrently/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
+ "node_modules/mocha/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "color-name": "1.1.3"
}
},
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+ "node_modules/mocha/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
},
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "node_modules/mocha/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "engines": {
- "node": ">= 0.6"
+ "ms": "^2.1.1"
}
},
- "node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "dev": true
+ "node_modules/mocha/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "license": "MIT"
},
- "node_modules/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=0.8.0"
}
},
- "node_modules/cookie-parser": {
- "version": "1.4.6",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
- "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
"dependencies": {
- "cookie": "0.4.1",
- "cookie-signature": "1.0.6"
+ "locate-path": "^3.0.0"
},
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/cookie-parser/node_modules/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
- "engines": {
- "node": ">= 0.6"
+ "node": ">=6"
}
},
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
"dependencies": {
- "object-assign": "^4",
- "vary": "^1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">= 0.10"
+ "node": "*"
}
},
- "node_modules/corser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
- "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
- "dev": true,
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4.0"
+ "node": ">=4"
}
},
- "node_modules/cpu-features": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz",
- "integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==",
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "buildcheck": "~0.0.6",
- "nan": "^2.17.0"
- },
+ "node_modules/mocha/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=4"
}
},
- "node_modules/cross-fetch": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
- "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
+ "node_modules/mocha/node_modules/js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "license": "MIT",
"dependencies": {
- "node-fetch": "^2.6.12"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6"
}
},
- "node_modules/crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
"node": "*"
}
},
- "node_modules/css-select": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
- "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.1.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "license": "MIT"
},
- "node_modules/css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "node_modules/mocha/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
"dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "engines": {
- "node": ">= 6"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/sponsors/fb55"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/csso": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
"dependencies": {
- "css-tree": "~2.2.0"
+ "p-limit": "^2.0.0"
},
"engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
+ "node": ">=6"
}
},
- "node_modules/csso/node_modules/css-tree": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
- "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
- "dependencies": {
- "mdn-data": "2.0.28",
- "source-map-js": "^1.0.1"
- },
+ "node_modules/mocha/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
"engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
+ "node": ">=4"
}
},
- "node_modules/csso/node_modules/mdn-data": {
- "version": "2.0.28",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
- "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
+ "node_modules/mocha/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
},
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dev": true,
+ "node_modules/mocha/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.21.0"
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
},
"engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
+ "node": ">=6"
}
},
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/mocha/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
+ "node_modules/mocha/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/decompress-response": {
+ "node_modules/mocha/node_modules/supports-color": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "license": "MIT",
"dependencies": {
- "mimic-response": "^3.1.0"
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=6"
}
},
- "node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "node_modules/mocha/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
"dependencies": {
- "type-detect": "^4.0.0"
+ "isexe": "^2.0.0"
},
- "engines": {
- "node": ">=6"
+ "bin": {
+ "which": "bin/which"
}
},
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "node_modules/mocha/node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
"engines": {
- "node": ">=4.0.0"
+ "node": ">=6"
}
},
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "node_modules/mocha/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "license": "ISC"
},
- "node_modules/default-require-extensions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
- "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
- "dev": true,
+ "node_modules/mocha/node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "license": "MIT",
"dependencies": {
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
}
},
- "node_modules/defaults": {
+ "node_modules/module-details-from-path": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz",
+ "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==",
+ "license": "MIT"
+ },
+ "node_modules/module-docgen": {
+ "resolved": "tools/module-docgen",
+ "link": true
+ },
+ "node_modules/module-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz",
+ "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
+ "node_modules/module-not-found-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz",
+ "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==",
+ "license": "MIT"
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "*"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/morgan": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz",
+ "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==",
+ "license": "MIT",
+ "dependencies": {
+ "basic-auth": "~2.0.1",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.1.0"
+ },
"engines": {
- "node": ">=0.4.0"
+ "node": ">= 0.8.0"
}
},
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+ "node_modules/morgan/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
},
- "node_modules/depd": {
+ "node_modules/morgan/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
},
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "node_modules/morgan/node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
+ "node": ">= 0.8"
}
},
- "node_modules/detect-libc": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
- "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "node_modules/mri": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
+ "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/dev-ansi-terminal": {
- "resolved": "packages/phoenix",
- "link": true
- },
- "node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.3.1"
+ "node": ">=10"
}
},
- "node_modules/digest-fetch": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz",
- "integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==",
- "dependencies": {
- "base-64": "^0.1.0",
- "md5": "^2.3.0"
- }
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
},
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
+ "node_modules/multer": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz",
+ "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==",
+ "license": "MIT",
"dependencies": {
- "path-type": "^4.0.0"
+ "append-field": "^1.0.0",
+ "busboy": "^1.6.0",
+ "concat-stream": "^2.0.0",
+ "type-is": "^1.6.18"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
+ "node": ">= 10.16.0"
},
"funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/dom-walk": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
- "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ "node_modules/multi-progress": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz",
+ "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "progress": "^2.0.0"
+ }
},
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "node_modules/murmurhash": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/murmurhash/-/murmurhash-2.0.1.tgz",
+ "integrity": "sha512-5vQEh3y+DG/lMPM0mCGPDnyV8chYg/g7rl6v3Gd8WMF9S429ox3Xk8qrk174kWhG767KQMqqxLD1WnGd77hiew==",
+ "license": "MIT"
+ },
+ "node_modules/music-metadata": {
+ "version": "11.12.3",
+ "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-11.12.3.tgz",
+ "integrity": "sha512-n6hSTZkuD59qWgHh6IP5dtDlDZQXoxk/bcA85Jywg8Z1iFrlNgl2+GTFgjZyn52W5UgQpV42V4XqrQZZAMbZTQ==",
"funding": [
{
"type": "github",
- "url": "https://github.com/sponsors/fb55"
+ "url": "https://github.com/sponsors/Borewit"
+ },
+ {
+ "type": "buymeacoffee",
+ "url": "https://buymeacoffee.com/borewit"
}
- ]
- },
- "node_modules/domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ ],
+ "license": "MIT",
"dependencies": {
- "domelementtype": "^2.3.0"
+ "@borewit/text-codec": "^0.2.2",
+ "@tokenizer/token": "^0.3.0",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "file-type": "^21.3.1",
+ "media-typer": "^1.1.0",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.2",
+ "uint8array-extras": "^1.5.0",
+ "win-guid": "^0.2.1"
},
"engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "node_modules/music-metadata/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
+ "ms": "^2.1.3"
},
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/dotenv": {
- "version": "16.4.5",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "node_modules/nan": {
+ "version": "2.26.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.26.2.tgz",
+ "integrity": "sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
- "engines": {
- "node": ">=12"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
},
- "funding": {
- "url": "https://dotenvx.com"
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT"
},
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ "node_modules/napi-macros": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz",
+ "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==",
+ "license": "MIT"
},
- "node_modules/electron-to-chromium": {
- "version": "1.4.690",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz",
- "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==",
- "dev": true
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
},
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "node_modules/enabled": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
- "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
},
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
+ "node_modules/nise": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz",
+ "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0",
+ "@sinonjs/fake-timers": "^11.2.2",
+ "@sinonjs/text-encoding": "^0.7.2",
+ "just-extend": "^6.2.0",
+ "path-to-regexp": "^6.2.1"
}
},
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "node_modules/nise/node_modules/@sinonjs/fake-timers": {
+ "version": "11.3.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz",
+ "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "once": "^1.4.0"
+ "@sinonjs/commons": "^3.0.1"
}
},
- "node_modules/engine.io": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
- "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
+ "node_modules/nise/node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/cookie": "^0.4.1",
- "@types/cors": "^2.8.12",
- "@types/node": ">=10.0.0",
- "accepts": "~1.3.4",
- "base64id": "2.0.0",
- "cookie": "~0.4.1",
- "cors": "~2.8.5",
- "debug": "~4.3.1",
- "engine.io-parser": "~5.2.1",
- "ws": "~8.11.0"
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-abi": {
+ "version": "3.89.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz",
+ "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
},
"engines": {
- "node": ">=10.2.0"
+ "node": ">=10"
}
},
- "node_modules/engine.io-parser": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz",
- "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==",
+ "node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
+ "license": "MIT"
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=10.5.0"
}
},
- "node_modules/engine.io/node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "engines": {
- "node": ">= 0.6"
+ "node_modules/node-environment-flags": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
+ "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "object.getownpropertydescriptors": "^2.0.3",
+ "semver": "^5.7.0"
}
},
- "node_modules/engine.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/node-environment-flags/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "whatwg-url": "^5.0.0"
},
"engines": {
- "node": ">=6.0"
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
},
"peerDependenciesMeta": {
- "supports-color": {
+ "encoding": {
"optional": true
}
}
},
- "node_modules/engine.io/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
},
- "node_modules/enhanced-resolve": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz",
- "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==",
- "dev": true,
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
}
},
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "node_modules/node-forge": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
+ "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
"engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "node": ">= 6.13.0"
}
},
- "node_modules/envinfo": {
- "version": "7.11.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz",
- "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==",
- "dev": true,
+ "node_modules/node-gyp-build": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
+ "license": "MIT",
"bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4"
+ "process-on-spawn": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
- "dev": true
- },
- "node_modules/es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "dev": true
+ "node_modules/node-releases": {
+ "version": "2.0.37",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
+ "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "node_modules/nodemailer": {
+ "version": "7.0.13",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.13.tgz",
+ "integrity": "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==",
+ "license": "MIT-0",
"engines": {
- "node": ">=6"
+ "node": ">=6.0.0"
}
},
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/nodemon": {
+ "version": "3.1.14",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz",
+ "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^4",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^10.2.1",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
}
},
- "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==",
+ "node_modules/nodemon/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
},
"engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/esm": {
- "version": "3.2.25",
- "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
- "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
- "engines": {
- "node": ">=6"
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/nodemon/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=4"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "node_modules/nodemon/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "estraverse": "^5.2.0"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/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": ">= 6"
}
},
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "node_modules/nodemon/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "node_modules/nodemon/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/exif-parser": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
- "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
- },
- "node_modules/expand-template": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
- "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/express": {
- "version": "4.19.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
- "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.2",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.6.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
+ "node": ">=8.6"
},
- "engines": {
- "node": ">= 0.10.0"
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/fast-deep-equal": {
- "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
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "node_modules/nodemon/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "picomatch": "^2.2.1"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">=8.10.0"
}
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "node_modules/nodemon/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
"engines": {
- "node": ">= 4.9.1"
+ "node": ">=4"
}
},
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "license": "ISC",
"dependencies": {
- "reusify": "^1.0.4"
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/fecha": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
- "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/file-stream-rotator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz",
- "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==",
+ "node_modules/npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
"dependencies": {
- "moment": "^2.29.1"
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
}
},
- "node_modules/file-type": {
- "version": "18.7.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz",
- "integrity": "sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==",
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "readable-web-to-node-stream": "^3.0.2",
- "strtok3": "^7.0.0",
- "token-types": "^5.0.1"
- },
- "engines": {
- "node": ">=14.16"
+ "boolbase": "^1.0.0"
},
"funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
- "node_modules/file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+ "node_modules/nwsapi": {
+ "version": "2.2.23",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
+ "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
+ "license": "MIT"
},
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
},
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
+ "bin": {
+ "nyc": "bin/nyc.js"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=8.9"
}
},
- "node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
}
},
- "node_modules/find-up": {
+ "node_modules/nyc/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nyc/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -6182,2079 +18949,2527 @@
"node": ">=8"
}
},
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "bin": {
- "flat": "cli.js"
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/fn.name": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
- "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
- },
- "node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
"engines": {
- "node": ">=4.0"
+ "node": ">=6"
},
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/foreground-child": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
- "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "node_modules/nyc/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^3.0.2"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">=8"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
},
"engines": {
- "node": ">= 6"
+ "node": ">=8"
}
},
- "node_modules/form-data-encoder": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
- "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
- },
- "node_modules/formdata-node": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
- "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "node-domexception": "1.0.0",
- "web-streams-polyfill": "4.0.0-beta.3"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
},
"engines": {
- "node": ">= 12.20"
+ "node": ">=6"
}
},
- "node_modules/formdata-node/node_modules/web-streams-polyfill": {
- "version": "4.0.0-beta.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
- "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
"engines": {
- "node": ">= 14"
+ "node": ">=0.10.0"
}
},
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">= 0.6"
+ "node": ">= 6"
}
},
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fromentries": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
- "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
- },
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
+ "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==",
+ "license": "MIT",
"engines": {
- "node": ">=6 <7 || >=8"
+ "node": ">= 0.4"
}
},
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "node_modules/object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "license": "MIT",
"dependencies": {
- "minipass": "^3.0.0"
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 0.4"
}
},
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz",
+ "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==",
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "array.prototype.reduce": "^1.0.8",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "gopd": "^1.2.0",
+ "safe-array-concat": "^1.1.3"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fs-mode-to-string": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/fs-mode-to-string/-/fs-mode-to-string-0.0.2.tgz",
- "integrity": "sha512-8Pik0/TZnN1uuEO5TdmDoXkjTNA98BUD1uM3RWepPXDLAO9tbmiluyu+fVwWX7C4sKKxDX+64rWNwtNwDJA3Yg=="
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ "node_modules/obliterator": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz",
+ "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==",
+ "license": "MIT"
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/obug": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
"dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
+ "license": "MIT"
},
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/omggif": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
+ "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+ "license": "MIT"
+ },
+ "node_modules/on-exit-leak-free": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
+ "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
}
},
- "node_modules/gauge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
- "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
"dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.2",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.1",
- "object-assign": "^4.1.1",
- "signal-exit": "^3.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.2"
+ "ee-first": "1.1.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8"
}
},
- "node_modules/gaxios": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.3.0.tgz",
- "integrity": "sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==",
- "dependencies": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9"
- },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">= 0.8"
}
},
- "node_modules/gaxios/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
"dependencies": {
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
+ "wrappy": "1"
}
},
- "node_modules/gaxios/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "fn.name": "1.x.x"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
+ "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
+ "license": "MIT",
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "wsl-utils": "^0.1.0"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/openai": {
+ "version": "6.34.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-6.34.0.tgz",
+ "integrity": "sha512-yEr2jdGf4tVFYG6ohmr3pF6VJuveP0EA/sS8TBx+4Eq5NT10alu5zg2dmxMXMgqpihRDQlFGpRt2XwsGj+Fyxw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "openai": "bin/cli"
+ },
+ "peerDependencies": {
+ "ws": "^8.18.0",
+ "zod": "^3.25 || ^4.0"
},
"peerDependenciesMeta": {
- "supports-color": {
+ "ws": {
+ "optional": true
+ },
+ "zod": {
"optional": true
}
}
},
- "node_modules/gaxios/node_modules/https-proxy-agent": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
- "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true,
+ "license": "(WTFPL OR MIT)",
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/opentype.js": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-0.7.3.tgz",
+ "integrity": "sha512-Veui5vl2bLonFJ/SjX/WRWJT3SncgiZNnKUyahmXCc2sa1xXW15u3R/3TN5+JFiP7RsjK5ER4HA5eWaEmV9deA==",
+ "license": "MIT",
"dependencies": {
- "agent-base": "^7.0.2",
- "debug": "4"
+ "tiny-inflate": "^1.0.2"
},
- "engines": {
- "node": ">= 14"
+ "bin": {
+ "ot": "bin/ot"
}
},
- "node_modules/gaxios/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/gcp-metadata": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
- "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
"dependencies": {
- "gaxios": "^6.0.0",
- "json-bigint": "^1.0.0"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
- "node": ">=14"
+ "node": ">= 0.8.0"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "node_modules/otpauth": {
+ "version": "9.2.4",
+ "resolved": "https://registry.npmjs.org/otpauth/-/otpauth-9.2.4.tgz",
+ "integrity": "sha512-t0Nioq2Up2ZaT5AbpXZLTjrsNtLc/g/rVSaEThmKLErAuT9mrnAKJryiPOKc3rCH+3ycWBgKpRHYn+DHqfaPiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jssha": "~3.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/hectorm/otpauth?sponsor=1"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
"engines": {
- "node": "*"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "p-limit": "^3.0.2"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
"engines": {
- "node": ">=8.0.0"
+ "node": ">=8"
}
},
- "node_modules/getopts": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
- "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
- },
- "node_modules/gifwrap": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz",
- "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==",
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "license": "MIT",
"dependencies": {
- "image-q": "^4.0.0",
- "omggif": "^1.0.10"
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/github-from-package": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
- "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": ">=6"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
+ "node_modules/parse-bmfont-ascii": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
+ "license": "MIT"
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
+ "node_modules/parse-bmfont-binary": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-bmfont-xml": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
+ "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "xml-parse-from-string": "^1.0.0",
+ "xml2js": "^0.5.0"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
+ "node_modules/parse-bmfont-xml/node_modules/xml2js": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=4.0.0"
}
},
- "node_modules/global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "node_modules/parse-domain": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-8.3.0.tgz",
+ "integrity": "sha512-oOjqUI93wiFHJlywlOKU9FEw60Q0LMy8S1s/AhnVhCB9LZkwIsCIZfqujeJ16u7rRzLdTEY2OpxlGRhLdnNNYA==",
+ "license": "MIT",
"dependencies": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
+ "is-ip": "^5.0.1"
+ },
+ "bin": {
+ "parse-domain-update": "bin/update.js"
}
},
- "node_modules/global/node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "engines": {
- "node": ">= 0.6.0"
+ "node_modules/parse5": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
+ "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 0.8"
}
},
- "node_modules/globby": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
- "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- },
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/globby/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
+ "node_modules/path-expression-matcher": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
+ "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=14.0.0"
}
},
- "node_modules/gopd": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
- },
- "node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
- "dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
- },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
"engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
+ "node": ">=8"
}
},
- "node_modules/has-flag": {
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==",
+ "license": "MIT"
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz",
+ "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==",
+ "license": "MIT"
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0"
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "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==",
- "engines": {
- "node": ">= 0.4"
+ "node_modules/pino": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz",
+ "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==",
+ "license": "MIT",
+ "dependencies": {
+ "@pinojs/redact": "^0.4.0",
+ "atomic-sleep": "^1.0.0",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^3.0.0",
+ "pino-std-serializers": "^7.0.0",
+ "process-warning": "^5.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.2.0",
+ "safe-stable-stringify": "^2.3.1",
+ "sonic-boom": "^4.0.1",
+ "thread-stream": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "pino": "bin.js"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/pino-abstract-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz",
+ "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==",
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "split2": "^4.0.0"
}
},
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+ "node_modules/pino-std-serializers": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz",
+ "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==",
+ "license": "MIT"
},
- "node_modules/hasha": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
- "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
- "dev": true,
+ "node_modules/pixelmatch": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz",
+ "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==",
+ "license": "ISC",
"dependencies": {
- "is-stream": "^2.0.0",
- "type-fest": "^0.8.0"
+ "pngjs": "^6.0.0"
},
+ "bin": {
+ "pixelmatch": "bin/pixelmatch"
+ }
+ },
+ "node_modules/pixelmatch/node_modules/pngjs": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz",
+ "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=12.13.0"
}
},
- "node_modules/hasown": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
- "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "find-up": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/helmet": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz",
- "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
"engines": {
- "node": ">=16.0.0"
+ "node": ">=8"
}
},
- "node_modules/html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "whatwg-encoding": "^2.0.0"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=8"
}
},
- "node_modules/html-entities": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
- "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/mdevils"
- },
- {
- "type": "patreon",
- "url": "https://patreon.com/mdevils"
- }
- ]
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">=8"
}
},
- "node_modules/http-server": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
- "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
+ "node_modules/playwright": {
+ "version": "1.59.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz",
+ "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "basic-auth": "^2.0.1",
- "chalk": "^4.1.2",
- "corser": "^2.0.1",
- "he": "^1.2.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy": "^1.18.1",
- "mime": "^1.6.0",
- "minimist": "^1.2.6",
- "opener": "^1.5.1",
- "portfinder": "^1.0.28",
- "secure-compare": "3.0.1",
- "union": "~0.5.0",
- "url-join": "^4.0.1"
+ "playwright-core": "1.59.1"
},
"bin": {
- "http-server": "bin/http-server"
+ "playwright": "cli.js"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
+ "node_modules/playwright-core": {
+ "version": "1.59.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz",
+ "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
},
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
- "node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/https-proxy-agent/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "node_modules/pngjs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
+ "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.19.0"
+ }
},
- "node_modules/humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+ "node_modules/portfinder": {
+ "version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz",
+ "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "^2.0.0"
+ "async": "^3.2.6",
+ "debug": "^4.3.6"
+ },
+ "engines": {
+ "node": ">= 10.12"
}
},
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz",
+ "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^10 || ^12 || >=14"
}
},
- "node_modules/ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
- },
- "node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
- "dev": true,
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "license": "MIT",
"engines": {
- "node": ">= 4"
+ "node": ">=4"
}
},
- "node_modules/ignore-by-default": {
+ "node_modules/postgres-bytea": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true
- },
- "node_modules/image-q": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz",
- "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==",
- "dependencies": {
- "@types/node": "16.9.1"
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz",
+ "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/image-q/node_modules/@types/node": {
- "version": "16.9.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz",
- "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/import-in-the-middle": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz",
- "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==",
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "license": "MIT",
"dependencies": {
- "acorn": "^8.8.2",
- "acorn-import-assertions": "^1.9.0",
- "cjs-module-lexer": "^1.2.2",
- "module-details-from-path": "^1.0.3"
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
+ "license": "MIT",
"dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
},
"bin": {
- "import-local-fixture": "fixtures/cli.js"
+ "prebuild-install": "bin.js"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=10"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "license": "MIT",
"engines": {
- "node": ">=0.8.19"
+ "node": ">= 0.8.0"
}
},
- "node_modules/indent-string": {
+ "node_modules/pretty-error": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "license": "MIT",
"dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- },
- "node_modules/interpret": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
- "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
- "dev": true,
- "engines": {
- "node": ">=10.13.0"
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
}
},
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">= 0.10"
+ "node": ">= 0.6.0"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "node_modules/process-on-spawn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz",
+ "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "fromentries": "^1.2.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ "node_modules/process-warning": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz",
+ "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">=0.4.0"
}
},
- "node_modules/is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "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,
+ "node_modules/prompt-sync": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
+ "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==",
+ "license": "MIT",
"dependencies": {
- "builtin-modules": "^3.3.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "strip-ansi": "^5.0.0"
}
},
- "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==",
+ "node_modules/prompt-sync/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6"
}
},
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "node_modules/prompt-sync/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "ansi-regex": "^4.1.0"
},
- "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",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6"
}
},
- "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==",
- "engines": {
- "node": ">=8"
+ "node_modules/proto3-json-serializer": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.9.tgz",
+ "integrity": "sha512-A60IisqvnuI45qNRygJjrnNjX2TMdQGMY+57tR3nul3ZgO2zXkR9OGR8AXxJhkqx84g0FTnrfi3D5fWMSdANdQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "protobufjs": "^6.11.2"
}
},
- "node_modules/is-function": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
- "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ "node_modules/proto3-json-serializer/node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0",
+ "optional": true
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "node_modules/proto3-json-serializer/node_modules/protobufjs": {
+ "version": "6.11.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
+ "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
"dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": ">=13.7.0",
+ "long": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
+ "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "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==",
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
"dependencies": {
- "is-extglob": "^2.1.1"
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.10"
}
},
- "node_modules/is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
- "dev": true
- },
- "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==",
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
"engines": {
- "node": ">=0.12.0"
+ "node": ">= 0.10"
}
},
- "node_modules/is-plain-obj": {
+ "node_modules/proxy-from-env": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
+ "node_modules/proxyquire": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz",
+ "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==",
+ "license": "MIT",
"dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
+ "fill-keys": "^1.0.2",
+ "module-not-found-error": "^1.0.1",
+ "resolve": "^1.11.1"
}
},
- "node_modules/is-reference": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
- "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+ "license": "MIT",
"dependencies": {
- "@types/estree": "*"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
- "node_modules/is-stream": {
+ "node_modules/pumpify": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
+ "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "duplexify": "^4.1.1",
+ "inherits": "^2.0.3",
+ "pump": "^3.0.0"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/qs": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true,
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/isbot": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz",
- "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==",
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">= 6"
}
},
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "node_modules/readdirp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
+ "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
},
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "dev": true,
+ "node_modules/readdirp/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/isomorphic-fetch": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
- "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
- "dependencies": {
- "node-fetch": "^2.6.1",
- "whatwg-fetch": "^3.4.1"
+ "node_modules/readline-sync": {
+ "version": "1.4.10",
+ "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
+ "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
- "dev": true,
+ "node_modules/real-require": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
+ "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 12.13.0"
}
},
- "node_modules/istanbul-lib-hook": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
- "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
- "dev": true,
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "license": "MIT",
"dependencies": {
- "append-transform": "^2.0.0"
+ "resolve": "^1.20.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 10.13.0"
}
},
- "node_modules/istanbul-lib-instrument": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
- "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
- "dev": true,
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "license": "MIT",
"dependencies": {
- "@babel/core": "^7.7.5",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.0.0",
- "semver": "^6.3.0"
+ "minimatch": "^3.0.5"
},
"engines": {
- "node": ">=8"
+ "node": ">=6.0.0"
}
},
- "node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
+ "node_modules/recursive-readdir/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
},
- "node_modules/istanbul-lib-processinfo": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
- "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
- "dev": true,
+ "node_modules/recursive-readdir/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "license": "MIT",
"dependencies": {
- "archy": "^1.0.0",
- "cross-spawn": "^7.0.3",
- "istanbul-lib-coverage": "^3.2.0",
- "p-map": "^3.0.0",
- "rimraf": "^3.0.0",
- "uuid": "^8.3.2"
- },
- "engines": {
- "node": ">=8"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/istanbul-lib-processinfo/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
+ "node_modules/recursive-readdir/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
- "dev": true,
+ "node_modules/redis-errors": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
+ "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/redis-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
+ "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
+ "license": "MIT",
"dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
+ "redis-errors": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/istanbul-lib-report/node_modules/make-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
- "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
- "dev": true,
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
"dependencies": {
- "semver": "^7.5.3"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
- "dev": true,
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/istanbul-lib-source-maps/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
"dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">= 0.10"
}
},
- "node_modules/istanbul-lib-source-maps/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "node_modules/relative-time-format": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.12.tgz",
+ "integrity": "sha512-qaZBjmRIuXLfuLnzgqpFdBPa5W0euSX1tMnoMUHGPphLwJmrt8xbNiOIHrlvYOD6oNJ0M5owPCZyPibI8de5pQ==",
+ "license": "MIT"
},
- "node_modules/istanbul-reports": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
- "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
+ "es6-error": "^4.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/replicate": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/replicate/-/replicate-1.4.0.tgz",
+ "integrity": "sha512-1ufKejfUVz/azy+5TnzQP7U1+MHVWZ6psnQ06az8byUUnRhT+DZ/MvewzB1NQYBVMgNKR7xPDtTwlcP5nv/5+w==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 10.13.0"
+ "git": ">=2.11.0",
+ "node": ">=18.0.0",
+ "npm": ">=7.19.0",
+ "yarn": ">=1.7.0"
+ },
+ "optionalDependencies": {
+ "readable-stream": ">=4.0.0"
}
},
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
+ "node_modules/replicate/node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/jimp": {
- "version": "0.22.12",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.22.12.tgz",
- "integrity": "sha512-R5jZaYDnfkxKJy1dwLpj/7cvyjxiclxU3F4TrI/J4j2rS0niq6YDUMoPn5hs8GDpO+OZGo7Ky057CRtWesyhfg==",
- "dependencies": {
- "@jimp/custom": "^0.22.12",
- "@jimp/plugins": "^0.22.12",
- "@jimp/types": "^0.22.12",
- "regenerator-runtime": "^0.13.3"
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/jmespath": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
- "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==",
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/joi": {
- "version": "17.12.2",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz",
- "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==",
+ "node_modules/require-in-the-middle": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz",
+ "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==",
+ "license": "MIT",
"dependencies": {
- "@hapi/hoek": "^9.3.0",
- "@hapi/topo": "^5.1.0",
- "@sideway/address": "^4.1.5",
- "@sideway/formula": "^3.0.1",
- "@sideway/pinpoint": "^2.0.0"
+ "debug": "^4.3.5",
+ "module-details-from-path": "^1.0.3",
+ "resolve": "^1.22.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
}
},
- "node_modules/jpeg-js": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
- "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="
- },
- "node_modules/js-sha256": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
- "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "license": "ISC"
},
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "license": "MIT",
"dependencies": {
- "argparse": "^2.0.1"
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
- "js-yaml": "bin/js-yaml.js"
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
"dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/json-bigint": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
- "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
- "dependencies": {
- "bignumber.js": "^9.0.0"
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-query": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/json-query/-/json-query-2.2.2.tgz",
- "integrity": "sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==",
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=4"
}
},
- "node_modules/json-schema-traverse": {
- "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
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "bin": {
- "json5": "lib/cli.js"
+ "node_modules/response-time": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.4.tgz",
+ "integrity": "sha512-fiyq1RvW5/Br6iAtT8jN1XrNY8WPu2+yEypLbaijWry8WDZmn12azG9p/+c+qpEebURLlQmqCB8BNSu7ji+xQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "on-headers": "~1.1.0"
},
"engines": {
- "node": ">=6"
+ "node": ">= 0.8.0"
}
},
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "node_modules/ret": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz",
+ "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/jsonwebtoken": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/retry-request": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz",
+ "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^7.5.4"
+ "debug": "^4.1.1",
+ "extend": "^3.0.2"
},
"engines": {
- "node": ">=12",
- "npm": ">=6"
+ "node": ">=8.10.0"
}
},
- "node_modules/jsonwebtoken/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/just-extend": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
- "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw=="
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
},
- "node_modules/jwa": {
+ "node_modules/rfdc": {
"version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
- "dependencies": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "license": "MIT"
},
- "node_modules/jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
"dependencies": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "node_modules/rolldown": {
+ "version": "1.0.0-rc.15",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz",
+ "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/knex": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz",
- "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==",
+ "license": "MIT",
"dependencies": {
- "colorette": "2.0.19",
- "commander": "^10.0.0",
- "debug": "4.3.4",
- "escalade": "^3.1.1",
- "esm": "^3.2.25",
- "get-package-type": "^0.1.0",
- "getopts": "2.3.0",
- "interpret": "^2.2.0",
- "lodash": "^4.17.21",
- "pg-connection-string": "2.6.2",
- "rechoir": "^0.8.0",
- "resolve-from": "^5.0.0",
- "tarn": "^3.0.2",
- "tildify": "2.0.0"
+ "@oxc-project/types": "=0.124.0",
+ "@rolldown/pluginutils": "1.0.0-rc.15"
},
"bin": {
- "knex": "bin/cli.js"
+ "rolldown": "bin/cli.mjs"
},
"engines": {
- "node": ">=16"
+ "node": "^20.19.0 || >=22.12.0"
},
- "peerDependenciesMeta": {
- "better-sqlite3": {
- "optional": true
- },
- "mysql": {
- "optional": true
- },
- "mysql2": {
- "optional": true
- },
- "pg": {
- "optional": true
- },
- "pg-native": {
- "optional": true
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-rc.15",
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.15",
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.15",
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.15",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15"
+ }
+ },
+ "node_modules/rrweb-cssom": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+ "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+ "license": "MIT"
+ },
+ "node_modules/run-applescript": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
},
- "sqlite3": {
- "optional": true
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
},
- "tedious": {
- "optional": true
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
}
},
- "node_modules/knex/node_modules/colorette": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
- "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
},
- "node_modules/knex/node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
"engines": {
- "node": ">=14"
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/knex/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
},
"engines": {
- "node": ">=6.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/knex/node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
"engines": {
- "node": ">= 0.10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/knex/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/kuler": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
- "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+ "node_modules/safe-regex2": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.0.tgz",
+ "integrity": "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "ret": "~0.5.0"
+ },
+ "bin": {
+ "safe-regex2": "bin/safe-regex2.js"
+ }
},
- "node_modules/leven": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
- "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
}
},
- "node_modules/load-bmfont": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
- "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
- "dependencies": {
- "buffer-equal": "0.0.1",
- "mime": "^1.3.4",
- "parse-bmfont-ascii": "^1.0.3",
- "parse-bmfont-binary": "^1.0.5",
- "parse-bmfont-xml": "^1.1.4",
- "phin": "^2.9.1",
- "xhr": "^2.0.1",
- "xtend": "^4.0.0"
- }
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
},
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "dev": true,
+ "node_modules/sax": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=6.11.5"
+ "node": ">=11.0.0"
}
},
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "license": "ISC",
"dependencies": {
- "p-locate": "^4.1.0"
+ "xmlchars": "^2.2.0"
},
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
- },
- "node_modules/lodash.flattendeep": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
- "dev": true
- },
- "node_modules/lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
- },
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
- },
- "node_modules/lodash.isfunction": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
- "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ "engines": {
+ "node": ">=v12.22.7"
+ }
},
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 10.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "node_modules/logform": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz",
- "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==",
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@colors/colors": "1.6.0",
- "@types/triple-beam": "^1.3.2",
- "fecha": "^4.2.0",
- "ms": "^2.1.1",
- "safe-stable-stringify": "^2.3.1",
- "triple-beam": "^1.3.0"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "engines": {
- "node": ">= 12.0.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/logform/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/long": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
- "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
- },
- "node_modules/lorem-ipsum": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/lorem-ipsum/-/lorem-ipsum-2.0.8.tgz",
- "integrity": "sha512-5RIwHuCb979RASgCJH0VKERn9cQo/+NcAi2BMe9ddj+gp7hujl6BI+qdOG4nVsLDpwWEJwTVYXNKP6BGgbcoGA==",
+ "node_modules/schema-utils/node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "commander": "^9.3.0"
+ "ajv": "^8.0.0"
},
- "bin": {
- "lorem-ipsum": "dist/bin/lorem-ipsum.bin.js"
+ "peerDependencies": {
+ "ajv": "^8.0.0"
},
- "engines": {
- "node": ">= 8.x",
- "npm": ">= 5.x"
- }
- },
- "node_modules/lorem-ipsum/node_modules/commander": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
- "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
- "engines": {
- "node": "^12.20.0 || >=14"
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
}
},
- "node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "node_modules/schema-utils/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "get-func-name": "^2.0.1"
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
}
},
- "node_modules/magic-string": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
- "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "node_modules/schema-utils/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.13"
+ "license": "MIT"
+ },
+ "node_modules/secure-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
+ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/secure-json-parse": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz",
+ "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/seedrandom": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=12"
+ "node": ">=10"
}
},
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
"dependencies": {
- "semver": "^6.0.0"
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
+ "node": ">= 0.8.0"
}
},
- "node_modules/md5": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
- "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
"dependencies": {
- "charenc": "0.0.2",
- "crypt": "0.0.2",
- "is-buffer": "~1.1.6"
+ "ms": "2.0.0"
}
},
- "node_modules/mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
},
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=4"
}
},
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "node_modules/merge-stream": {
+ "node_modules/set-blocking": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC"
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
"engines": {
- "node": ">= 8"
+ "node": ">= 0.4"
}
},
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
}
},
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": ">=8.6"
+ "node": ">= 0.4"
}
},
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.2"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/sharp-bmp": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/sharp-bmp/-/sharp-bmp-0.1.5.tgz",
+ "integrity": "sha512-IpWAy+AeTlWNHiBU8HH4atcKbztgKOXTuT4W8aFaeASPCeJwCVpoUymWMfEmwfvWSCOV1s7VmGTlKhcPLkt+Lw==",
+ "license": "MIT",
+ "dependencies": {
+ "bmp-js": "*",
+ "sharp": "*"
+ }
+ },
+ "node_modules/sharp-ico": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz",
+ "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-ico": "*",
+ "ico-endec": "*",
+ "sharp": "*"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "shebang-regex": "^3.0.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=8"
}
},
- "node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
- "dependencies": {
- "dom-walk": "^0.1.0"
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/shescape": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/shescape/-/shescape-2.1.11.tgz",
+ "integrity": "sha512-kR+oVEEgfo2TzK6FZAXtZMZ4aaVFuy5WeToxgjh95KPqUOLoFb1M+PYOWrDV7QqfHgdwnBpPBeBbf07sDgyAtA==",
+ "license": "MPL-2.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@ericcornelissen/lregexp": "^1.0.7",
+ "which": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
},
"engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.18.0 || ^16.13.0 || ^18 || ^19 || ^20 || ^22 || ^24 || ^25"
}
},
- "node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "node_modules/shescape/node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=8"
+ "node": ">=20"
}
},
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "node_modules/shescape/node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "license": "ISC",
"dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
+ "isexe": "^4.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
},
"engines": {
- "node": ">= 8"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/shimmer": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
+ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
"dependencies": {
- "minimist": "^1.2.6"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
},
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
- },
- "node_modules/mocha": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz",
- "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==",
- "dev": true,
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
"dependencies": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.4",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "8.1.0",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "5.0.1",
- "ms": "2.1.3",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "workerpool": "6.2.1",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
},
"engines": {
- "node": ">= 14.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha/node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"funding": [
{
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
}
},
- "node_modules/mocha/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "node_modules/simple-git": {
+ "version": "3.35.2",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.35.2.tgz",
+ "integrity": "sha512-ZMjl06lzTm1EScxEGuM6+mEX+NQd14h/B3x0vWU+YOXAMF8sicyi1K4cjTfj5is+35ChJEHDl1EjypzYFWH2FA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "@simple-git/args-pathspec": "^1.0.2",
+ "@simple-git/argv-parser": "^1.0.3",
+ "debug": "^4.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
}
},
- "node_modules/mocha/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/simple-git/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -8265,3626 +21480,4346 @@
}
}
},
- "node_modules/mocha/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/mocha/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "semver": "^7.5.3"
},
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mocha/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/simple-wcswidth": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz",
+ "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==",
+ "license": "MIT"
+ },
+ "node_modules/simple-xml-to-json": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/simple-xml-to-json/-/simple-xml-to-json-1.2.7.tgz",
+ "integrity": "sha512-mz9VXphOxQWX3eQ/uXCtm6upltoN0DLx8Zb5T4TFC4FHB7S9FDPGre8CfLWqPWQQH/GrQYd2AXhhVM5LDpYx6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.12.2"
+ }
+ },
+ "node_modules/sinon": {
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz",
+ "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==",
+ "deprecated": "16.1.1",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
+ "@sinonjs/commons": "^3.0.0",
+ "@sinonjs/fake-timers": "^10.3.0",
+ "@sinonjs/samsam": "^8.0.0",
+ "diff": "^5.1.0",
+ "nise": "^5.1.4",
+ "supports-color": "^7.2.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
}
},
- "node_modules/mocha/node_modules/minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "node_modules/sinon/node_modules/diff": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz",
+ "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=10"
+ "node": ">=0.3.1"
}
},
- "node_modules/mocha/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/mocha/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/sirv": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
+ "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/mocha/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
+ }
+ },
+ "node_modules/socket.io": {
+ "version": "4.8.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz",
+ "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.4.1",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
}
},
- "node_modules/mocha/node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz",
+ "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "randombytes": "^2.1.0"
+ "debug": "~4.4.1",
+ "ws": "~8.18.3"
}
},
- "node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
+ "node_modules/socket.io-adapter/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">=10"
+ "node": ">=6.0"
},
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/mocha/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
+ "node_modules/socket.io-adapter/node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=10.0.0"
},
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/mocha/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
+ "node_modules/socket.io-client": {
+ "version": "4.8.3",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz",
+ "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==",
+ "license": "MIT",
"dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1",
+ "engine.io-client": "~6.6.1",
+ "socket.io-parser": "~4.2.4"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/module-details-from-path": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
- "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="
- },
- "node_modules/moment": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
- "engines": {
- "node": "*"
+ "node": ">=10.0.0"
}
},
- "node_modules/morgan": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
- "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+ "node_modules/socket.io-client/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "basic-auth": "~2.0.1",
- "debug": "2.6.9",
- "depd": "~2.0.0",
- "on-finished": "~2.3.0",
- "on-headers": "~1.0.2"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/morgan/node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "node_modules/socket.io-parser": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz",
+ "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==",
+ "license": "MIT",
"dependencies": {
- "ee-first": "1.1.1"
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.4.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=10.0.0"
}
},
- "node_modules/mri": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
- "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
+ "node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/multer": {
- "version": "1.4.5-lts.1",
- "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
- "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+ "node_modules/socket.io/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "append-field": "^1.0.0",
- "busboy": "^1.0.0",
- "concat-stream": "^1.5.2",
- "mkdirp": "^0.5.4",
- "object-assign": "^4.1.1",
- "type-is": "^1.6.4",
- "xtend": "^4.0.0"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/multi-progress": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz",
- "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==",
- "peerDependencies": {
- "progress": "^2.0.0"
+ "node_modules/sonic-boom": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz",
+ "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
}
},
- "node_modules/murmurhash": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/murmurhash/-/murmurhash-2.0.1.tgz",
- "integrity": "sha512-5vQEh3y+DG/lMPM0mCGPDnyV8chYg/g7rl6v3Gd8WMF9S429ox3Xk8qrk174kWhG767KQMqqxLD1WnGd77hiew=="
- },
- "node_modules/nan": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz",
- "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==",
- "optional": true
- },
- "node_modules/napi-build-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
- "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 0.6"
+ "node": ">=0.10.0"
}
},
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- },
- "node_modules/nise": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz",
- "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==",
- "dependencies": {
- "@sinonjs/commons": "^3.0.0",
- "@sinonjs/fake-timers": "^11.2.2",
- "@sinonjs/text-encoding": "^0.7.2",
- "just-extend": "^6.2.0",
- "path-to-regexp": "^6.2.1"
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/nise/node_modules/@sinonjs/fake-timers": {
- "version": "11.2.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
- "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "node_modules/nise/node_modules/path-to-regexp": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
- "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="
+ "node_modules/spawn-command": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
+ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
+ "dev": true
},
- "node_modules/node-abi": {
- "version": "3.56.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz",
- "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==",
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "semver": "^7.3.5"
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/node-addon-api": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
- "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
- },
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
"engines": {
- "node": ">=10.5.0"
+ "node": ">= 10.x"
}
},
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ssh2": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz",
+ "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==",
+ "hasInstallScript": true,
"dependencies": {
- "whatwg-url": "^5.0.0"
+ "asn1": "^0.2.6",
+ "bcrypt-pbkdf": "^1.0.2"
},
"engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "node": ">=10.16.0"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
+ "optionalDependencies": {
+ "cpu-features": "~0.0.10",
+ "nan": "^2.23.0"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/standard-as-callback": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
+ "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==",
+ "license": "MIT"
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/node-preload": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
- "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "node_modules/std-env": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz",
+ "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "license": "MIT",
"dependencies": {
- "process-on-spawn": "^1.0.0"
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
- "node_modules/node-pty": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz",
- "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==",
- "hasInstallScript": true,
+ "node_modules/stream-events": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
+ "license": "MIT",
"optional": true,
"dependencies": {
- "nan": "^2.17.0"
+ "stubs": "^3.0.0"
}
},
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true
+ "node_modules/stream-shift": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+ "license": "MIT",
+ "optional": true
},
- "node_modules/nodemailer": {
- "version": "6.9.13",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz",
- "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==",
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=10.0.0"
}
},
- "node_modules/nodemon": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz",
- "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==",
- "dev": true,
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
"dependencies": {
- "chokidar": "^3.5.2",
- "debug": "^4",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.1.2",
- "pstree.remy": "^1.1.8",
- "semver": "^7.5.3",
- "simple-update-notifier": "^2.0.0",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.5"
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/string-length": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz",
+ "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==",
+ "license": "MIT",
+ "dependencies": {
+ "strip-ansi": "^7.1.0"
},
- "bin": {
- "nodemon": "bin/nodemon.js"
+ "engines": {
+ "node": ">=16"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-length/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/nodemon"
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/nodemon/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
+ "node_modules/string-length/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ansi-regex": "^6.2.2"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=12"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/nodemon/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
+ "node_modules/string-template": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz",
+ "integrity": "sha512-SLqR3GBUXuoPP5MmYtD7ompvXiG87QjT6lzOszyXjTM86Uu7At7vNnt2xgyTLq5o9T4IxTYFyGxcULqpsmsfdg==",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/nodemon/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/nodemon/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
- "dev": true,
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "license": "MIT",
"dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/npmlog": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
- "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
"dependencies": {
- "are-we-there-yet": "^2.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^3.0.0",
- "set-blocking": "^2.0.0"
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
- "dependencies": {
- "boolbase": "^1.0.0"
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/nyc": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
- "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
- "dev": true,
+ "node_modules/strnum": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz",
+ "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/strtok3": {
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
+ "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
+ "license": "MIT",
"dependencies": {
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "caching-transform": "^4.0.0",
- "convert-source-map": "^1.7.0",
- "decamelize": "^1.2.0",
- "find-cache-dir": "^3.2.0",
- "find-up": "^4.1.0",
- "foreground-child": "^2.0.0",
- "get-package-type": "^0.1.0",
- "glob": "^7.1.6",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-hook": "^3.0.0",
- "istanbul-lib-instrument": "^4.0.0",
- "istanbul-lib-processinfo": "^2.0.2",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.2",
- "make-dir": "^3.0.0",
- "node-preload": "^0.2.1",
- "p-map": "^3.0.0",
- "process-on-spawn": "^1.0.0",
- "resolve-from": "^5.0.0",
- "rimraf": "^3.0.0",
- "signal-exit": "^3.0.2",
- "spawn-wrap": "^2.0.0",
- "test-exclude": "^6.0.0",
- "yargs": "^15.0.2"
- },
- "bin": {
- "nyc": "bin/nyc.js"
+ "@tokenizer/token": "^0.3.0"
},
"engines": {
- "node": ">=8.9"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/nyc/node_modules/cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
+ "node_modules/stubs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
+ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==",
+ "license": "MIT",
+ "optional": true
},
- "node_modules/nyc/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
+ "node_modules/super-regex": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz",
+ "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==",
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "clone-regexp": "^3.0.0",
+ "function-timeout": "^0.1.0",
+ "time-span": "^5.1.0"
},
"engines": {
- "node": "*"
+ "node": ">=14.16"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/nyc/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/nyc/node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "node_modules/nyc/node_modules/yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "dev": true,
+ "node_modules/svg-captcha": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/svg-captcha/-/svg-captcha-1.4.0.tgz",
+ "integrity": "sha512-/fkkhavXPE57zRRCjNqAP3txRCSncpMx3NnNZL7iEoyAtYwUjPhJxW6FQTQPG5UPEmCrbFoXS10C3YdJlW7PDg==",
+ "license": "MIT",
"dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
+ "opentype.js": "^0.7.3"
},
"engines": {
- "node": ">=8"
+ "node": ">=4.x"
}
},
- "node_modules/nyc/node_modules/yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
+ "node_modules/svgo": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz",
+ "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==",
+ "license": "MIT",
"dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0",
+ "sax": "^1.5.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
},
"engines": {
- "node": ">=6"
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
}
},
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 10"
}
},
- "node_modules/object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
"engines": {
- "node": ">= 6"
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
}
},
- "node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/omggif": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
- "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
+ "node_modules/svgo/node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
},
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "ee-first": "1.1.1"
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
},
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/svgo/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 0.8"
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "node_modules/svgo/node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz",
+ "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
"dependencies": {
- "wrappy": "1"
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/one-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
- "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "node_modules/tar-fs": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
+ "license": "MIT",
"dependencies": {
- "fn.name": "1.x.x"
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
}
},
- "node_modules/openai": {
- "version": "4.30.0",
- "resolved": "https://registry.npmjs.org/openai/-/openai-4.30.0.tgz",
- "integrity": "sha512-jOaT4u7DpWzvuOuSxw5skuBbSuagw91Vd4IU/zP9qdgu6C19AAq4wzx+24e59wdEmsAG58enOUNf6t5V2WwN9g==",
+ "node_modules/tar-fs/node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "^18.11.18",
- "@types/node-fetch": "^2.6.4",
- "abort-controller": "^3.0.0",
- "agentkeepalive": "^4.2.1",
- "digest-fetch": "^1.3.0",
- "form-data-encoder": "1.7.2",
- "formdata-node": "^4.3.2",
- "node-fetch": "^2.6.7",
- "web-streams-polyfill": "^3.2.1"
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
},
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
"bin": {
- "openai": "bin/cli"
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tarn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
+ "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "node_modules/openai/node_modules/@types/node": {
- "version": "18.19.26",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz",
- "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==",
+ "node_modules/teeny-request": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.2.0.tgz",
+ "integrity": "sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "undici-types": "~5.26.4"
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.6.1",
+ "stream-events": "^1.0.5",
+ "uuid": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/teeny-request/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
},
- "node_modules/opener": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
- "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "node_modules/terser": {
+ "version": "5.46.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz",
+ "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==",
"dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
"bin": {
- "opener": "bin/opener-bin.js"
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz",
+ "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-try": "^2.0.0"
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "terser": "^5.31.1"
},
"engines": {
- "node": ">=6"
+ "node": ">= 10.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
}
},
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "p-limit": "^2.2.0"
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/p-map": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
- "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "node_modules/test-exclude/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=6"
+ "node": "*"
}
},
- "node_modules/package-hash": {
+ "node_modules/text-decoding": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz",
+ "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==",
+ "license": "MIT"
+ },
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "license": "MIT"
+ },
+ "node_modules/thread-stream": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
- "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz",
+ "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==",
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.1.15",
- "hasha": "^5.0.0",
- "lodash.flattendeep": "^4.4.0",
- "release-zalgo": "^1.0.0"
+ "real-require": "^0.2.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=20"
}
},
- "node_modules/pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- },
- "node_modules/parse-bmfont-ascii": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
- "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="
- },
- "node_modules/parse-bmfont-binary": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
- "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="
+ "node_modules/tiktoken": {
+ "version": "1.0.22",
+ "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz",
+ "integrity": "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==",
+ "license": "MIT"
},
- "node_modules/parse-bmfont-xml": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
- "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
- "dependencies": {
- "xml-parse-from-string": "^1.0.0",
- "xml2js": "^0.5.0"
+ "node_modules/tildify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
+ "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/parse-bmfont-xml/node_modules/xml2js": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
- "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+ "node_modules/time-span": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz",
+ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==",
+ "license": "MIT",
"dependencies": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
+ "convert-hrtime": "^5.0.0"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/parse-headers": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
- "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "license": "MIT"
},
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/path-browserify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
- "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+ "license": "MIT"
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "node_modules/tinyexec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "node_modules/tinyglobby": {
+ "version": "0.2.16",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "node_modules/tinyrainbow": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ "node_modules/tldts": {
+ "version": "7.0.28",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz",
+ "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^7.0.28"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
},
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "node_modules/tldts-core": {
+ "version": "7.0.28",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz",
+ "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tmp": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=14.14"
}
},
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "node_modules/to-data-view": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz",
+ "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==",
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
"engines": {
- "node": "*"
+ "node": ">=8.0"
}
},
- "node_modules/peek-readable": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
- "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==",
+ "node_modules/toad-cache": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz",
+ "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==",
+ "license": "MIT",
"engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "node": ">=12"
}
},
- "node_modules/pg-connection-string": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
- "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
+ "node_modules/together-ai": {
+ "version": "0.33.0",
+ "resolved": "https://registry.npmjs.org/together-ai/-/together-ai-0.33.0.tgz",
+ "integrity": "sha512-2JdxYwbw+Xw2bW2PHBGqbMTtYsQHoWO9UXvdwIfQkde/swoKp2x/hpxEjtTERzrMP4O5SdDPGxsjfcPXewDJ9A==",
+ "license": "Apache-2.0",
+ "bin": {
+ "together-ai": "bin/cli"
+ }
},
- "node_modules/pg-int8": {
+ "node_modules/toidentifier": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
"engines": {
- "node": ">=4.0.0"
+ "node": ">=0.6"
}
},
- "node_modules/pg-protocol": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
- "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
+ "node_modules/token-count-accuracy": {
+ "resolved": "tools/token-count-accuracy",
+ "link": true
},
- "node_modules/pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "node_modules/token-types": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
+ "license": "MIT",
"dependencies": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
+ "@borewit/text-codec": "^0.2.1",
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/phin": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
- "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "engines": {
- "node": ">=8.6"
+ "node": ">=14.16"
},
"funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/pixelmatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
- "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
- "dependencies": {
- "pngjs": "^3.0.0"
- },
- "bin": {
- "pixelmatch": "bin/pixelmatch"
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/pixelmatch/node_modules/pngjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
- "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
- "engines": {
- "node": ">=4.0.0"
+ "node_modules/touch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
}
},
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "node_modules/tough-cookie": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz",
+ "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "find-up": "^4.0.0"
+ "tldts": "^7.0.5"
},
"engines": {
- "node": ">=8"
+ "node": ">=16"
}
},
- "node_modules/pngjs": {
+ "node_modules/tr46": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz",
- "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==",
- "engines": {
- "node": ">=12.13.0"
- }
- },
- "node_modules/portfinder": {
- "version": "1.0.32",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
- "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz",
+ "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "async": "^2.6.4",
- "debug": "^3.2.7",
- "mkdirp": "^0.5.6"
+ "punycode": "^2.3.1"
},
"engines": {
- "node": ">= 0.12.0"
+ "node": ">=20"
}
},
- "node_modules/portfinder/node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "node_modules/tr46/node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
- "dependencies": {
- "lodash": "^4.17.14"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/portfinder/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true,
- "dependencies": {
- "ms": "^2.1.1"
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
}
},
- "node_modules/portfinder/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">= 14.0.0"
}
},
- "node_modules/postgres-array": {
+ "node_modules/ts-algebra": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
- "engines": {
- "node": ">=4"
- }
+ "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz",
+ "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==",
+ "license": "MIT"
},
- "node_modules/postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
- "node_modules/postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
- "engines": {
- "node": ">=0.10.0"
- }
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
- "node_modules/postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "license": "Apache-2.0",
"dependencies": {
- "xtend": "^4.0.0"
+ "safe-buffer": "^5.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "*"
}
},
- "node_modules/prebuild-install": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
- "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==",
+ "node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+ "license": "Unlicense"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "license": "MIT",
"dependencies": {
- "detect-libc": "^2.0.0",
- "expand-template": "^2.0.3",
- "github-from-package": "0.0.0",
- "minimist": "^1.2.3",
- "mkdirp-classic": "^0.5.3",
- "napi-build-utils": "^1.0.1",
- "node-abi": "^3.3.0",
- "pump": "^3.0.0",
- "rc": "^1.2.7",
- "simple-get": "^4.0.0",
- "tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0"
- },
- "bin": {
- "prebuild-install": "bin.js"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8.0"
}
},
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/process-on-spawn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
- "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
- "dev": true,
- "dependencies": {
- "fromentries": "^1.2.0"
- },
+ "node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "peer": true,
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=8"
}
},
- "node_modules/prompt-sync": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz",
- "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==",
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
"dependencies": {
- "strip-ansi": "^5.0.0"
- }
- },
- "node_modules/prompt-sync/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 0.6"
}
},
- "node_modules/prompt-sync/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
+ "node_modules/type-is/node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.6"
}
},
- "node_modules/protobufjs": {
- "version": "7.2.6",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
- "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
- "hasInstallScript": true,
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
"dependencies": {
- "@protobufjs/aspromise": "^1.1.2",
- "@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
- "@protobufjs/eventemitter": "^1.1.0",
- "@protobufjs/fetch": "^1.1.0",
- "@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
- "@protobufjs/path": "^1.1.2",
- "@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
- "@types/node": ">=13.7.0",
- "long": "^5.0.0"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
"dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
- "node": ">= 0.10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
"dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/puter": {
- "resolved": "packages/puter-js",
- "link": true
- },
- "node_modules/puter-js-common": {
- "resolved": "packages/puter-js-common",
- "link": true
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "license": "MIT",
"dependencies": {
- "side-channel": "^1.0.4"
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
- "node": ">=0.6"
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
- "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "license": "MIT"
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
"engines": {
- "node": ">=0.4.x"
+ "node": ">=14.17"
}
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
+ "node_modules/ua-parser-js": {
+ "version": "1.0.41",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz",
+ "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==",
"funding": [
{
- "type": "github",
- "url": "https://github.com/sponsors/feross"
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
},
{
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
},
{
- "type": "consulting",
- "url": "https://feross.org/support"
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
}
- ]
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/randomstring": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.3.0.tgz",
- "integrity": "sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==",
- "dependencies": {
- "randombytes": "2.0.3"
- },
+ ],
+ "license": "MIT",
"bin": {
- "randomstring": "bin/randomstring"
+ "ua-parser-js": "script/cli.js"
},
"engines": {
"node": "*"
}
},
- "node_modules/randomstring/node_modules/randombytes": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
- "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg=="
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
+ "node": ">=0.8.0"
}
},
- "node_modules/rc/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/readable-web-to-node-stream": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
- "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
"dependencies": {
- "readable-stream": "^3.6.0"
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/readable-web-to-node-stream/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "node_modules/undici": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz",
+ "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==",
"dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8.10.0"
+ "node": ">=20.18.1"
}
},
- "node_modules/rechoir": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
- "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
+ },
+ "node_modules/union": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
+ "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
+ "dev": true,
"dependencies": {
- "resolve": "^1.20.0"
+ "qs": "^6.4.0"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 0.8.0"
}
},
- "node_modules/recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "minimatch": "^3.0.5"
+ "crypto-random-string": "^2.0.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=8"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- },
- "node_modules/release-zalgo": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
- "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
- "dev": true,
- "dependencies": {
- "es6-error": "^4.0.1"
- },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 10.0.0"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.8"
}
},
- "node_modules/require-in-the-middle": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz",
- "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "module-details-from-path": "^1.0.3",
- "resolve": "^1.22.1"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
- "engines": {
- "node": ">=8.6.0"
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
}
},
- "node_modules/require-in-the-middle/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "punycode": "^2.1.0"
}
},
- "node_modules/require-in-the-middle/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "node_modules/uri-js/node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
+ "node_modules/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true
+ "node_modules/useapi": {
+ "resolved": "src/useapi",
+ "link": true
},
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "node_modules/utif2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz",
+ "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==",
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "pako": "^1.0.11"
}
},
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
"dev": true,
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4.0"
}
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "engines": {
- "node": ">=8"
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
},
- "node_modules/response-time": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz",
- "integrity": "sha512-MUIDaDQf+CVqflfTdQ5yam+aYCkXj1PY8fjlPDQ6ppxJlmgZb864pHtA750mayywNg8tx4rS7qH9JXd/OF+3gw==",
- "dependencies": {
- "depd": "~1.1.0",
- "on-headers": "~1.0.1"
+ "node_modules/valibot": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.3.1.tgz",
+ "integrity": "sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "typescript": ">=5"
},
- "engines": {
- "node": ">= 0.8.0"
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/response-time/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "node_modules/validator": {
+ "version": "13.15.35",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz",
+ "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.10"
}
},
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
"engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
+ "node": ">= 0.8"
}
},
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "node_modules/vite": {
+ "version": "8.0.8",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz",
+ "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "glob": "^7.1.3"
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.8",
+ "rolldown": "1.0.0-rc.15",
+ "tinyglobby": "^0.2.15"
},
"bin": {
- "rimraf": "bin.js"
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
}
},
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/vite-plugin-static-copy": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.4.0.tgz",
+ "integrity": "sha512-ekryzCw0ouAOE8tw4RvVL/dfqguXzumsV3FBKoKso4MQ1MUUrUXtl5RI4KpJQUNGqFEsg9kxl4EvDl02YtA9VQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "chokidar": "^3.6.0",
+ "p-map": "^7.0.4",
+ "picocolors": "^1.1.1",
+ "tinyglobby": "^0.2.15"
},
"engines": {
- "node": "*"
+ "node": "^18.0.0 || >=20.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "type": "github",
+ "url": "https://github.com/sponsors/sapphi-red"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/rollup": {
- "version": "3.29.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
- "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "node_modules/vite-plugin-static-copy/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
- "bin": {
- "rollup": "dist/bin/rollup"
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
},
"engines": {
- "node": ">=14.18.0",
- "npm": ">=8.0.0"
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
- "node_modules/rollup-plugin-copy": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz",
- "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==",
+ "node_modules/vite-plugin-static-copy/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/vite-plugin-static-copy/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "@types/fs-extra": "^8.0.1",
- "colorette": "^1.1.0",
- "fs-extra": "^8.1.0",
- "globby": "10.0.1",
- "is-plain-object": "^3.0.0"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">=8.3"
+ "node": ">= 6"
}
},
- "node_modules/rollup-plugin-copy/node_modules/colorette": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
- "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "dev": true
- },
- "node_modules/rollup-plugin-copy/node_modules/is-plain-object": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz",
- "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==",
+ "node_modules/vite-plugin-static-copy/node_modules/p-map": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
+ "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "node_modules/vite-plugin-static-copy/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "node_modules/vite-plugin-static-copy/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.1.0"
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safe-stable-stringify": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
- "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+ "node_modules/vite/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=10"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/sax": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
- "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="
- },
- "node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "node_modules/vitest": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.4.tgz",
+ "integrity": "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "@vitest/expect": "4.1.4",
+ "@vitest/mocker": "4.1.4",
+ "@vitest/pretty-format": "4.1.4",
+ "@vitest/runner": "4.1.4",
+ "@vitest/snapshot": "4.1.4",
+ "@vitest/spy": "4.1.4",
+ "@vitest/utils": "4.1.4",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.4",
+ "@vitest/browser-preview": "4.1.4",
+ "@vitest/browser-webdriverio": "4.1.4",
+ "@vitest/coverage-istanbul": "4.1.4",
+ "@vitest/coverage-v8": "4.1.4",
+ "@vitest/ui": "4.1.4",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
}
},
- "node_modules/secure-compare": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
- "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==",
- "dev": true
- },
- "node_modules/seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
- },
- "node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "node_modules/w3c-xmlserializer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
+ "xml-name-validator": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/watchpack": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
+ "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=10.13.0"
}
},
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 8"
}
},
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "node_modules/webidl-conversions": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz",
+ "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==",
"dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20"
}
},
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "node_modules/webpack": {
+ "version": "5.106.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.0.tgz",
+ "integrity": "sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.16.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.28.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.20.0",
+ "es-module-lexer": "^2.0.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.3.1",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.3",
+ "tapable": "^2.3.0",
+ "terser-webpack-plugin": "^5.3.17",
+ "watchpack": "^2.5.1",
+ "webpack-sources": "^3.3.4"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
}
},
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
- },
- "node_modules/set-function-length": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
- "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "node_modules/webpack-cli": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "define-data-property": "^1.1.2",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^2.1.1",
+ "@webpack-cli/info": "^2.0.2",
+ "@webpack-cli/serve": "^2.0.5",
+ "colorette": "^2.0.14",
+ "commander": "^10.0.1",
+ "cross-spawn": "^7.0.3",
+ "envinfo": "^7.7.3",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^3.1.1",
+ "rechoir": "^0.8.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
}
},
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
},
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "node_modules/webpack-cli/node_modules/interpret": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
"dev": true,
- "dependencies": {
- "kind-of": "^6.0.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10.13.0"
}
},
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "shebang-regex": "^3.0.0"
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10.0.0"
}
},
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "node_modules/webpack-sources": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz",
+ "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10.13.0"
}
},
- "node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "node_modules/webpack/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,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/shimmer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
- "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
- },
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8.0.0"
}
},
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
- },
- "node_modules/simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/simple-get": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
- "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "decompress-response": "^6.0.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
}
},
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
"dependencies": {
- "is-arrayish": "^0.3.1"
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "node_modules/simple-update-notifier": {
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "semver": "^7.5.3"
+ "iconv-lite": "0.6.3"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
- "node_modules/sinon": {
- "version": "15.2.0",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz",
- "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==",
- "deprecated": "16.1.1",
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0",
- "@sinonjs/fake-timers": "^10.3.0",
- "@sinonjs/samsam": "^8.0.0",
- "diff": "^5.1.0",
- "nise": "^5.1.4",
- "supports-color": "^7.2.0"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
- }
- },
- "node_modules/sinon/node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "dev": true,
"engines": {
- "node": ">=0.3.1"
+ "node": ">=0.10.0"
}
},
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "node_modules/whatwg-mimetype": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz",
+ "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=20"
}
},
- "node_modules/socket.io": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
- "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==",
+ "node_modules/whatwg-url": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz",
+ "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "accepts": "~1.3.4",
- "base64id": "~2.0.0",
- "cors": "~2.8.5",
- "debug": "~4.3.2",
- "engine.io": "~6.5.2",
- "socket.io-adapter": "~2.5.2",
- "socket.io-parser": "~4.2.4"
+ "@exodus/bytes": "^1.11.0",
+ "tr46": "^6.0.0",
+ "webidl-conversions": "^8.0.1"
},
"engines": {
- "node": ">=10.2.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
- "node_modules/socket.io-adapter": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz",
- "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==",
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
"dependencies": {
- "debug": "~4.3.4",
- "ws": "~8.11.0"
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/socket.io-adapter/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
},
"engines": {
- "node": ">=6.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/socket.io-adapter/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/socket.io-parser": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
- "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.1"
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/socket.io-parser/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
},
"engines": {
- "node": ">=6.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/socket.io-parser/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "license": "ISC"
},
- "node_modules/socket.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "node_modules/which-typed-array": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">=6.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/socket.io/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
+ "node_modules/wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "license": "ISC",
"dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
+ "string-width": "^1.0.2 || 2"
}
},
- "node_modules/spawn-command": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
- "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
- "dev": true
+ "node_modules/wide-align/node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/spawn-wrap": {
+ "node_modules/wide-align/node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
- "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^2.0.0",
- "is-windows": "^1.0.2",
- "make-dir": "^3.0.0",
- "rimraf": "^3.0.0",
- "signal-exit": "^3.0.2",
- "which": "^2.0.1"
- },
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "node_modules/ssh2": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz",
- "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==",
- "hasInstallScript": true,
+ "node_modules/wide-align/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "license": "MIT",
"dependencies": {
- "asn1": "^0.2.6",
- "bcrypt-pbkdf": "^1.0.2"
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
},
"engines": {
- "node": ">=10.16.0"
- },
- "optionalDependencies": {
- "cpu-features": "~0.0.9",
- "nan": "^2.18.0"
+ "node": ">=4"
}
},
- "node_modules/stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "node_modules/wide-align/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
"engines": {
- "node": "*"
+ "node": ">=4"
}
},
- "node_modules/statuses": {
+ "node_modules/wildcard": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/win-guid": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/win-guid/-/win-guid-0.2.1.tgz",
+ "integrity": "sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A==",
+ "license": "MIT"
+ },
+ "node_modules/winston": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz",
+ "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@colors/colors": "^1.6.0",
+ "@dabh/diagnostics": "^2.0.8",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.7.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.9.0"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "node_modules/winston-daily-rotate-file": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz",
+ "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==",
+ "license": "MIT",
+ "dependencies": {
+ "file-stream-rotator": "^0.6.1",
+ "object-hash": "^2.0.1",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "peerDependencies": {
+ "winston": "^3"
+ }
+ },
+ "node_modules/winston-daily-rotate-file/node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">= 6"
}
},
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/winston-transport": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/string-hash": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
- "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "license": "MIT"
},
- "node_modules/string-length": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz",
- "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==",
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
"dependencies": {
- "strip-ansi": "^7.1.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=16"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/string-length/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=10.0.0"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/string-length/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/wsl-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
+ "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "is-wsl": "^3.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
+ "node_modules/xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "license": "MIT",
+ "optional": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/xml-name-validator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/xml-parse-from-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
+ "license": "MIT"
+ },
+ "node_modules/xml2js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+ "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=4.0.0"
}
},
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true,
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4.0"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "license": "MIT"
+ },
+ "node_modules/xmlhttprequest-ssl": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.4.0"
}
},
- "node_modules/strtok3": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
- "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "peek-readable": "^5.0.0"
- },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
"engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "node": ">=0.4"
}
},
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">= 14.6"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/eemeli"
}
},
- "node_modules/svgo": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz",
- "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==",
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
"dependencies": {
- "@trysound/sax": "0.2.0",
- "commander": "^7.2.0",
- "css-select": "^5.1.0",
- "css-tree": "^2.3.1",
- "css-what": "^6.1.0",
- "csso": "^5.0.5",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
"engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/svgo"
+ "node": ">=12"
}
},
- "node_modules/svgo/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "node_modules/yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+ "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+ "license": "MIT",
+ "dependencies": {
+ "flat": "^4.1.0",
+ "lodash": "^4.17.15",
+ "yargs": "^13.3.0"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=6"
}
},
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true,
+ "node_modules/yargs-unparser/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
- "node_modules/tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "node_modules/yargs-unparser/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
"dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
+ "color-convert": "^1.9.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/tar-fs": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
- "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "node_modules/yargs-unparser/node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "license": "ISC",
"dependencies": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.1.4"
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
}
},
- "node_modules/tar-fs/node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ "node_modules/yargs-unparser/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/yargs-unparser/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "license": "MIT"
},
- "node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "node_modules/yargs-unparser/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
"dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
+ "locate-path": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
- "node_modules/tar-stream/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "node_modules/yargs-unparser/node_modules/flat": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
+ "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "is-buffer": "~2.0.3"
},
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/tar/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
+ "flat": "cli.js"
}
},
- "node_modules/tarn": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
- "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
+ "node_modules/yargs-unparser/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "license": "MIT",
"engines": {
- "node": ">=8.0.0"
+ "node": ">=4"
}
},
- "node_modules/terser": {
- "version": "5.28.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz",
- "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==",
- "dev": true,
+ "node_modules/yargs-unparser/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
- "dev": true,
+ "node_modules/yargs-unparser/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.20",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">=6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "dev": true,
+ "node_modules/yargs-unparser/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
"dependencies": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
+ "p-limit": "^2.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/test-exclude/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
+ "node_modules/yargs-unparser/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=4"
}
},
- "node_modules/text-hex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
- "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
- },
- "node_modules/tiktoken": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.13.tgz",
- "integrity": "sha512-JaL9ZnvTbGFMDIBeGdVkLt4qWTeCPw+n7Ock+wceAGRenuHA6nOOvMJFliNDyXsjg2osGKJWsXtO2xc74VxyDw=="
- },
- "node_modules/tildify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
- "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+ "node_modules/yargs-unparser/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/timm": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
- "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="
- },
- "node_modules/tinycolor2": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
- "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true,
+ "node_modules/yargs-unparser/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=6"
}
},
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "node_modules/yargs-unparser/node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "license": "MIT",
"dependencies": {
- "is-number": "^7.0.0"
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
},
"engines": {
- "node": ">=8.0"
+ "node": ">=6"
}
},
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "node_modules/yargs-unparser/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "license": "ISC"
+ },
+ "node_modules/yargs-unparser/node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
"engines": {
- "node": ">=0.6"
+ "node": ">=12"
}
},
- "node_modules/token-types": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz",
- "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
- },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
"engines": {
- "node": ">=14.16"
+ "node": ">=10"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/token-types/node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
},
- "node_modules/touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
+ "node_modules/zod-to-json-schema": {
+ "version": "3.25.2",
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+ "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+ "license": "ISC",
+ "peerDependencies": {
+ "zod": "^3.25.28 || ^4"
+ }
+ },
+ "src/backend": {
+ "name": "@heyputer/backend",
+ "version": "2.5.1",
+ "license": "AGPL-3.0-only",
"dependencies": {
- "nopt": "~1.0.10"
+ "@aws-sdk/client-cloudwatch": "^3.940.0",
+ "@aws-sdk/client-polly": "^3.622.0",
+ "@aws-sdk/client-textract": "^3.621.0",
+ "@google/generative-ai": "^0.21.0",
+ "@heyputer/kv.js": "^0.1.9",
+ "@heyputer/multest": "^0.0.2",
+ "@heyputer/putility": "^1.0.0",
+ "@mistralai/mistralai": "^1.3.4",
+ "@opentelemetry/api": "^1.4.1",
+ "@opentelemetry/auto-instrumentations-node": "^0.43.0",
+ "@opentelemetry/exporter-metrics-otlp-grpc": "^0.40.0",
+ "@opentelemetry/exporter-trace-otlp-grpc": "^0.40.0",
+ "@opentelemetry/sdk-metrics": "^1.14.0",
+ "@opentelemetry/sdk-node": "^0.49.1",
+ "@pagerduty/pdjs": "^2.2.4",
+ "@smithy/node-http-handler": "^2.2.2",
+ "@socket.io/redis-streams-adapter": "^0.3.1",
+ "args": "^5.0.3",
+ "axios": "^1.8.2",
+ "bcrypt": "^5.1.0",
+ "better-sqlite3": "^12.6.0",
+ "busboy": "^1.6.0",
+ "chai-as-promised": "^7.1.1",
+ "clean-css": "^5.3.2",
+ "composite-error": "^1.0.2",
+ "compression": "^1.7.4",
+ "convertapi": "^1.15.0",
+ "cookie-parser": "^1.4.6",
+ "dedent": "^1.5.3",
+ "dns2": "^2.1.0",
+ "express": "^4.18.2",
+ "file-type": "^21.3.3",
+ "firebase-admin": "^10.3.0",
+ "form-data": "^4.0.0",
+ "groq-sdk": "^0.5.0",
+ "handlebars": "^4.7.8",
+ "helmet": "^7.0.0",
+ "hi-base32": "^0.5.1",
+ "html-entities": "^2.3.3",
+ "ioredis": "^5.9.2",
+ "ioredis-mock": "^8.13.1",
+ "is-glob": "^4.0.3",
+ "isbot": "^3.7.1",
+ "jimp": "^1.6.0",
+ "js-sha256": "^0.9.0",
+ "json5": "^2.2.3",
+ "jsonwebtoken": "^9.0.0",
+ "knex": "^3.1.0",
+ "lorem-ipsum": "^2.0.8",
+ "lru-cache": "^11.0.2",
+ "micromatch": "^4.0.5",
+ "mime-types": "^2.1.35",
+ "moment": "^2.29.4",
+ "morgan": "^1.10.0",
+ "multer": "^2.0.2",
+ "multi-progress": "^4.0.0",
+ "murmurhash": "^2.0.1",
+ "music-metadata": "^11.12.3",
+ "nodemailer": "^7.0.7",
+ "on-finished": "^2.4.1",
+ "openai": "^6.7.0",
+ "otpauth": "9.2.4",
+ "prompt-sync": "^4.2.0",
+ "proxyquire": "^2.1.3",
+ "recursive-readdir": "^2.2.3",
+ "replicate": "^1.4.0",
+ "response-time": "^2.3.2",
+ "seedrandom": "^3.0.5",
+ "sharp": "^0.34.3",
+ "sharp-bmp": "^0.1.5",
+ "sharp-ico": "^0.1.5",
+ "shescape": "^2.1.10",
+ "socket.io": "^4.6.2",
+ "socket.io-client": "^4.6.2",
+ "ssh2": "^1.13.0",
+ "string-hash": "^1.1.3",
+ "string-length": "^6.0.0",
+ "svg-captcha": "^1.4.0",
+ "svgo": "^3.3.3",
+ "tiktoken": "^1.0.16",
+ "together-ai": "^0.33.0",
+ "tweetnacl": "^1.0.3",
+ "ua-parser-js": "^1.0.38",
+ "uglify-js": "^3.17.4",
+ "uuid": "^9.0.0",
+ "validator": "^13.9.0",
+ "winston": "^3.9.0",
+ "winston-daily-rotate-file": "^4.7.1",
+ "yargs": "^17.7.2"
},
- "bin": {
- "nodetouch": "bin/nodetouch.js"
+ "devDependencies": {
+ "@types/node": "^24.0.0",
+ "chai": "^4.3.7",
+ "jsdom": "29.0.0",
+ "mocha": "^7.2.0",
+ "nodemon": "^3.1.0",
+ "nyc": "^15.1.0",
+ "sinon": "^15.2.0",
+ "typescript": "^5.9.3",
+ "vitest": "^4.0.14"
}
},
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "node_modules/tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true,
- "bin": {
- "tree-kill": "cli.js"
+ "src/backend/node_modules/@heyputer/kv.js": {
+ "version": "0.1.92",
+ "resolved": "https://registry.npmjs.org/@heyputer/kv.js/-/kv.js-0.1.92.tgz",
+ "integrity": "sha512-D+trimrG/V6mU5zeQrKyH476WotvvRn0McttxiFxEzWLiMqR6aBmQ5apeKrZAheglHmwf0D3FO5ykmU2lCuLvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^9.0.0"
}
},
- "node_modules/triple-beam": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
- "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "src/backend/node_modules/@opentelemetry/api": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz",
+ "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==",
+ "license": "Apache-2.0",
+ "peer": true,
"engines": {
- "node": ">= 14.0.0"
+ "node": ">=8.0.0"
}
},
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "src/backend/node_modules/@opentelemetry/context-async-hooks": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz",
+ "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ }
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "src/backend/node_modules/@opentelemetry/core": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz",
+ "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==",
+ "license": "Apache-2.0",
"dependencies": {
- "safe-buffer": "^5.0.1"
+ "@opentelemetry/semantic-conventions": "1.22.0"
},
"engines": {
- "node": "*"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "src/backend/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
+ "src/backend/node_modules/@opentelemetry/otlp-grpc-exporter-base": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz",
+ "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-exporter-base": "0.49.1",
+ "protobufjs": "^7.2.3"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "src/backend/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz",
+ "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
}
},
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
+ "src/backend/node_modules/@opentelemetry/propagator-b3": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz",
+ "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==",
+ "license": "Apache-2.0",
"dependencies": {
- "is-typedarray": "^1.0.0"
+ "@opentelemetry/core": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/typescript": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
- "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "src/backend/node_modules/@opentelemetry/propagator-jaeger": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz",
+ "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0"
},
"engines": {
- "node": ">=14.17"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
- "bin": {
- "uglifyjs": "bin/uglifyjs"
+ "src/backend/node_modules/@opentelemetry/resources": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz",
+ "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
},
"engines": {
- "node": ">=0.8.0"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ "src/backend/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz",
+ "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.9.0",
+ "@opentelemetry/api-logs": ">=0.39.1"
+ }
},
- "node_modules/union": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
- "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
- "dev": true,
+ "src/backend/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz",
+ "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==",
+ "license": "Apache-2.0",
"dependencies": {
- "qs": "^6.4.0"
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "lodash.merge": "^4.6.2"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
}
},
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
+ "src/backend/node_modules/@opentelemetry/sdk-node": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz",
+ "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.49.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1",
+ "@opentelemetry/exporter-trace-otlp-http": "0.49.1",
+ "@opentelemetry/exporter-trace-otlp-proto": "0.49.1",
+ "@opentelemetry/exporter-zipkin": "1.22.0",
+ "@opentelemetry/instrumentation": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-logs": "0.49.1",
+ "@opentelemetry/sdk-metrics": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0",
+ "@opentelemetry/sdk-trace-node": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
+ },
"engines": {
- "node": ">= 4.0.0"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
}
},
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "src/backend/node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
+ "version": "0.49.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz",
+ "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.49.1",
+ "@opentelemetry/otlp-transformer": "0.49.1",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "src/backend/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz",
+ "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==",
+ "license": "Apache-2.0",
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/resources": "1.22.0",
+ "@opentelemetry/semantic-conventions": "1.22.0"
},
- "bin": {
- "update-browserslist-db": "cli.js"
+ "engines": {
+ "node": ">=14"
},
"peerDependencies": {
- "browserslist": ">= 4.21.0"
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
+ "src/backend/node_modules/@opentelemetry/sdk-trace-node": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz",
+ "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "punycode": "^2.1.0"
+ "@opentelemetry/context-async-hooks": "1.22.0",
+ "@opentelemetry/core": "1.22.0",
+ "@opentelemetry/propagator-b3": "1.22.0",
+ "@opentelemetry/propagator-jaeger": "1.22.0",
+ "@opentelemetry/sdk-trace-base": "1.22.0",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
}
},
- "node_modules/url": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
- "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==",
- "dependencies": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
+ "src/backend/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz",
+ "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
}
},
- "node_modules/url-join": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
- "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
- "dev": true
- },
- "node_modules/url/node_modules/punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
+ "src/backend/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
},
- "node_modules/utif2": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz",
- "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==",
+ "src/backend/node_modules/brace-expansion": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
+ "license": "MIT",
"dependencies": {
- "pako": "^1.0.11"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "src/backend/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
"dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ "src/docs": {
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@fontsource/inter": "^5.2.8",
+ "esbuild": "0.25.11",
+ "fs-extra": "^11.2.0",
+ "highlight.js": "^11.11.1",
+ "html-entities": "^2.3.3",
+ "jquery": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "jsdom": "^26.1.0",
+ "marked": "^11.1.1"
+ },
+ "devDependencies": {
+ "@types/highlight.js": "^9.12.4",
+ "@types/jquery": "^3.5.33",
+ "concurrently": "^8.2.2",
+ "http-server": "^14.1.1",
+ "nodemon": "^3.1.4"
+ },
+ "optionalDependencies": {
+ "@esbuild/linux-x64": "0.25.11"
+ }
},
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "src/docs/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz",
+ "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
"engines": {
- "node": ">= 0.4.0"
+ "node": ">=18"
}
},
- "node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
+ "src/docs/node_modules/@esbuild/android-arm": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz",
+ "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==",
+ "cpu": [
+ "arm"
],
- "bin": {
- "uuid": "dist/bin/uuid"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/validator": {
- "version": "13.11.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
- "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
+ "src/docs/node_modules/@esbuild/android-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz",
+ "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">= 0.10"
+ "node": ">=18"
}
},
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "src/docs/node_modules/@esbuild/android-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz",
+ "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">= 0.8"
+ "node": ">=18"
}
},
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dev": true,
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
+ "src/docs/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz",
+ "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
}
},
- "node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dependencies": {
- "defaults": "^1.0.3"
+ "src/docs/node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz",
+ "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/web-streams-polyfill": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
- "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "src/docs/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz",
+ "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">= 8"
+ "node": ">=18"
}
},
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ "src/docs/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz",
+ "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
},
- "node_modules/webpack": {
- "version": "5.90.3",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz",
- "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==",
- "dev": true,
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.5",
- "@webassemblyjs/ast": "^1.11.5",
- "@webassemblyjs/wasm-edit": "^1.11.5",
- "@webassemblyjs/wasm-parser": "^1.11.5",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.9.0",
- "browserslist": "^4.21.10",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.15.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.10",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
+ "src/docs/node_modules/@esbuild/linux-arm": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz",
+ "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/webpack-cli": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
- "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
- "dev": true,
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^2.1.1",
- "@webpack-cli/info": "^2.0.2",
- "@webpack-cli/serve": "^2.0.5",
- "colorette": "^2.0.14",
- "commander": "^10.0.1",
- "cross-spawn": "^7.0.3",
- "envinfo": "^7.7.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^3.1.1",
- "rechoir": "^0.8.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
+ "src/docs/node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz",
+ "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "5.x.x"
- },
- "peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "dev": true,
+ "src/docs/node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz",
+ "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14"
+ "node": ">=18"
}
},
- "node_modules/webpack-merge": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
- "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
- "dev": true,
- "dependencies": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.0"
- },
+ "src/docs/node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz",
+ "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true,
+ "src/docs/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz",
+ "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
}
},
- "node_modules/whatwg-encoding": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
- "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
- "dev": true,
- "dependencies": {
- "iconv-lite": "0.6.3"
- },
+ "src/docs/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz",
+ "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/whatwg-encoding/node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
+ "src/docs/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz",
+ "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
}
},
- "node_modules/whatwg-fetch": {
- "version": "3.6.20",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
- "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
+ "src/docs/node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz",
+ "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
+ "src/docs/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz",
+ "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">= 8"
+ "node": ">=18"
}
},
- "node_modules/which-module": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "dev": true
- },
- "node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.2"
- },
+ "src/docs/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz",
+ "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=18"
}
},
- "node_modules/wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "dependencies": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
+ "src/docs/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz",
+ "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/wildcard": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
- "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
- "dev": true
- },
- "node_modules/winston": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz",
- "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==",
- "dependencies": {
- "@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
- "async": "^3.2.3",
- "is-stream": "^2.0.0",
- "logform": "^2.4.0",
- "one-time": "^1.0.0",
- "readable-stream": "^3.4.0",
- "safe-stable-stringify": "^2.3.1",
- "stack-trace": "0.0.x",
- "triple-beam": "^1.3.0",
- "winston-transport": "^4.7.0"
- },
+ "src/docs/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz",
+ "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">= 12.0.0"
+ "node": ">=18"
}
},
- "node_modules/winston-daily-rotate-file": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz",
- "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==",
- "dependencies": {
- "file-stream-rotator": "^0.6.1",
- "object-hash": "^2.0.1",
- "triple-beam": "^1.3.0",
- "winston-transport": "^4.4.0"
- },
+ "src/docs/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz",
+ "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
"engines": {
- "node": ">=8"
- },
- "peerDependencies": {
- "winston": "^3"
+ "node": ">=18"
}
},
- "node_modules/winston-transport": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz",
- "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==",
- "dependencies": {
- "logform": "^2.3.2",
- "readable-stream": "^3.6.0",
- "triple-beam": "^1.3.0"
- },
+ "src/docs/node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz",
+ "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
"engines": {
- "node": ">= 12.0.0"
+ "node": ">=18"
}
},
- "node_modules/winston-transport/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
+ "src/docs/node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz",
+ "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
- "node_modules/winston/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
+ "src/docs/node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz",
+ "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
- },
- "node_modules/workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
- "dev": true
+ "src/docs/node_modules/@esbuild/win32-x64": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz",
+ "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "src/docs/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
},
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
+ "src/docs/node_modules/data-urls": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+ "license": "MIT",
"dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/ws": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
- "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
- "engines": {
- "node": ">=10.0.0"
+ "src/docs/node_modules/esbuild": {
+ "version": "0.25.11",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz",
+ "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
},
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "engines": {
+ "node": ">=18"
},
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xhr": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
- "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.11",
+ "@esbuild/android-arm": "0.25.11",
+ "@esbuild/android-arm64": "0.25.11",
+ "@esbuild/android-x64": "0.25.11",
+ "@esbuild/darwin-arm64": "0.25.11",
+ "@esbuild/darwin-x64": "0.25.11",
+ "@esbuild/freebsd-arm64": "0.25.11",
+ "@esbuild/freebsd-x64": "0.25.11",
+ "@esbuild/linux-arm": "0.25.11",
+ "@esbuild/linux-arm64": "0.25.11",
+ "@esbuild/linux-ia32": "0.25.11",
+ "@esbuild/linux-loong64": "0.25.11",
+ "@esbuild/linux-mips64el": "0.25.11",
+ "@esbuild/linux-ppc64": "0.25.11",
+ "@esbuild/linux-riscv64": "0.25.11",
+ "@esbuild/linux-s390x": "0.25.11",
+ "@esbuild/linux-x64": "0.25.11",
+ "@esbuild/netbsd-arm64": "0.25.11",
+ "@esbuild/netbsd-x64": "0.25.11",
+ "@esbuild/openbsd-arm64": "0.25.11",
+ "@esbuild/openbsd-x64": "0.25.11",
+ "@esbuild/openharmony-arm64": "0.25.11",
+ "@esbuild/sunos-x64": "0.25.11",
+ "@esbuild/win32-arm64": "0.25.11",
+ "@esbuild/win32-ia32": "0.25.11",
+ "@esbuild/win32-x64": "0.25.11"
+ }
+ },
+ "src/docs/node_modules/html-encoding-sniffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+ "license": "MIT",
"dependencies": {
- "global": "~4.4.0",
- "is-function": "^1.0.1",
- "parse-headers": "^2.0.0",
- "xtend": "^4.0.0"
+ "whatwg-encoding": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/xml-parse-from-string": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
- "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
- },
- "node_modules/xml2js": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
- "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+ "src/docs/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "license": "MIT",
"dependencies": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">= 14"
}
},
- "node_modules/xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "src/docs/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
"engines": {
- "node": ">=4.0"
+ "node": ">= 14"
}
},
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "src/docs/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
"engines": {
- "node": ">=0.4"
+ "node": ">=0.10.0"
}
},
- "node_modules/xterm": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz",
- "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==",
- "deprecated": "This package is now deprecated. Move to @xterm/xterm instead."
- },
- "node_modules/xterm-addon-fit": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz",
- "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==",
- "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.",
+ "src/docs/node_modules/jsdom": {
+ "version": "26.1.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
+ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssstyle": "^4.2.1",
+ "data-urls": "^5.0.0",
+ "decimal.js": "^10.5.0",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.6",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.16",
+ "parse5": "^7.2.1",
+ "rrweb-cssom": "^0.8.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^5.1.1",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.1.1",
+ "ws": "^8.18.0",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
"peerDependencies": {
- "xterm": "^5.0.0"
+ "canvas": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
}
},
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "engines": {
- "node": ">=10"
+ "src/docs/node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "src/docs/node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "src/docs/node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "license": "MIT",
"dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
+ "tldts-core": "^6.1.86"
},
- "engines": {
- "node": ">=12"
+ "bin": {
+ "tldts": "bin/cli.js"
}
},
- "node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true,
+ "src/docs/node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "license": "MIT"
+ },
+ "src/docs/node_modules/tough-cookie": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^6.1.32"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=16"
}
},
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
+ "src/docs/node_modules/tr46": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+ "license": "MIT",
"dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
+ "punycode": "^2.3.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/yargs-unparser/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
+ "src/docs/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=12"
}
},
- "node_modules/yargs-unparser/node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "src/docs/node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/yargs/node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "src/docs/node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "src/docs/node_modules/whatwg-url": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.1.0",
+ "webidl-conversions": "^7.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=18"
}
},
- "packages/backend": {
- "name": "@heyputer/backend",
- "version": "2.1.0",
+ "src/gui": {
+ "name": "@heyputer/gui",
+ "version": "2.4.0",
"license": "AGPL-3.0-only",
"workspaces": [
- "packages/*"
+ "src/*"
],
"dependencies": {
- "@heyputer/kv.js": "^0.1.3",
- "@heyputer/multest": "^0.0.2",
- "@opentelemetry/api": "^1.4.1",
- "@opentelemetry/auto-instrumentations-node": "^0.43.0",
- "@opentelemetry/exporter-trace-otlp-grpc": "^0.40.0",
- "@opentelemetry/sdk-metrics": "^1.14.0",
- "@opentelemetry/sdk-node": "^0.49.1",
- "@pagerduty/pdjs": "^2.2.4",
- "@smithy/node-http-handler": "^2.2.2",
- "args": "^5.0.3",
- "aws-sdk": "^2.1383.0",
- "axios": "^1.4.0",
- "bcrypt": "^5.1.0",
- "better-sqlite3": "^9.4.3",
- "busboy": "^1.6.0",
- "chai-as-promised": "^7.1.1",
+ "file-type": "21.3.3",
+ "json-colorizer": "^3.0.1",
+ "mocha": "7.2.0",
+ "music-metadata": "11.12.3",
+ "string-template": "^1.0.0",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.1.1",
+ "chai": "^4.3.7",
+ "chalk": "^4.1.0",
"clean-css": "^5.3.2",
- "composite-error": "^1.0.2",
- "compression": "^1.7.4",
- "cookie-parser": "^1.4.6",
+ "dotenv": "^16.4.5",
+ "eslint": "^9.1.1",
"express": "^4.18.2",
- "file-type": "^18.5.0",
- "form-data": "^4.0.0",
- "handlebars": "^4.7.8",
- "helmet": "^7.0.0",
+ "globals": "^15.0.0",
"html-entities": "^2.3.3",
- "is-glob": "^4.0.3",
- "isbot": "^3.7.1",
- "jimp": "^0.22.8",
- "js-sha256": "^0.9.0",
- "json5": "^2.2.3",
- "jsonwebtoken": "^9.0.0",
- "knex": "^3.1.0",
- "lorem-ipsum": "^2.0.8",
- "micromatch": "^4.0.5",
- "mime-types": "^2.1.35",
- "moment": "^2.29.4",
- "morgan": "^1.10.0",
- "multer": "^1.4.5-lts.1",
- "multi-progress": "^4.0.0",
- "murmurhash": "^2.0.1",
- "nodemailer": "^6.9.3",
- "on-finished": "^2.4.1",
- "openai": "^4.20.1",
- "prompt-sync": "^4.2.0",
- "recursive-readdir": "^2.2.3",
- "response-time": "^2.3.2",
- "seedrandom": "^3.0.5",
- "socket.io": "^4.6.2",
- "ssh2": "^1.13.0",
- "string-hash": "^1.1.3",
- "string-length": "^6.0.0",
- "svgo": "^3.0.2",
- "tiktoken": "^1.0.11",
+ "jsdom": "^29.0.0",
+ "nodemon": "^3.1.0",
+ "sinon": "^15.0.1",
"uglify-js": "^3.17.4",
- "uuid": "^9.0.0",
- "validator": "^13.9.0",
- "winston": "^3.9.0",
- "winston-daily-rotate-file": "^4.7.1"
+ "webpack": "^5.88.2",
+ "webpack-cli": "^5.1.1"
+ }
+ },
+ "src/puter-js": {
+ "name": "@heyputer/puter.js",
+ "version": "2.2.14",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@heyputer/kv.js": "^0.2.1",
+ "open": "^10.2.0"
},
"devDependencies": {
- "@types/node": "^20.5.3",
- "chai": "^4.3.7",
- "mocha": "^10.2.0",
- "nodemon": "^3.1.0",
- "nyc": "^15.1.0",
- "sinon": "^15.2.0",
- "typescript": "^5.1.6"
+ "concurrently": "^8.2.2",
+ "http-server": "^14.1.1",
+ "webpack-cli": "^5.1.4"
}
},
- "packages/phoenix": {
- "name": "dev-ansi-terminal",
- "version": "0.0.0",
+ "src/puter-wisp": {
+ "name": "@heyputer/puter-wisp",
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only"
+ },
+ "src/putility": {
+ "name": "@heyputer/putility",
+ "version": "1.1.1",
+ "license": "MIT"
+ },
+ "src/useapi": {
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only"
+ },
+ "tools/comment-parser": {
+ "version": "1.0.0",
"license": "AGPL-3.0-only",
- "workspaces": [
- "packages/pty",
- "packages/strataparse",
- "packages/contextlink"
- ],
- "dependencies": {
- "@pkgjs/parseargs": "^0.11.0",
- "capture-console": "^1.0.2",
- "chronokinesis": "^6.0.0",
- "cli-columns": "^4.0.0",
- "columnify": "^1.6.0",
- "fs-mode-to-string": "^0.0.2",
- "json-query": "^2.2.2",
- "path-browserify": "^1.0.1",
- "sinon": "^17.0.1",
- "xterm": "^5.1.0",
- "xterm-addon-fit": "^0.7.0"
- },
"devDependencies": {
- "@rollup/plugin-commonjs": "^24.1.0",
- "@rollup/plugin-node-resolve": "^15.0.2",
- "@rollup/plugin-replace": "^5.0.2",
- "mocha": "^10.2.0",
- "rollup": "^3.21.4",
- "rollup-plugin-copy": "^3.4.0"
- },
- "optionalDependencies": {
- "node-pty": "^1.0.0"
+ "chai": "^5.1.1"
+ }
+ },
+ "tools/comment-parser/node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
}
},
- "packages/phoenix/node_modules/@sinonjs/fake-timers": {
- "version": "11.2.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
- "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
+ "tools/comment-parser/node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "packages/phoenix/node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "tools/comment-parser/node_modules/check-error": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
+ "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.3.1"
+ "node": ">= 16"
}
},
- "packages/phoenix/node_modules/sinon": {
- "version": "17.0.1",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz",
- "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==",
- "dependencies": {
- "@sinonjs/commons": "^3.0.0",
- "@sinonjs/fake-timers": "^11.2.2",
- "@sinonjs/samsam": "^8.0.0",
- "diff": "^5.1.0",
- "nise": "^5.1.5",
- "supports-color": "^7.2.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
+ "tools/comment-parser/node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "packages/puter-js": {
- "name": "puter",
- "version": "1.0.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "concurrently": "^8.2.2",
- "webpack-cli": "^5.1.4"
+ "tools/comment-parser/node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "tools/comment-parser/node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
}
},
- "packages/puter-js-common": {
+ "tools/file-walker": {
"version": "1.0.0",
- "license": "UNLICENSED"
+ "license": "AGPL-3.0-only"
},
- "packages/terminal": {
- "name": "@putersh/terminal-emulator",
+ "tools/genwiki": {
"version": "0.0.0",
+ "license": "AGPL-3.0-only"
+ },
+ "tools/keygen": {
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only"
+ },
+ "tools/license-headers": {
+ "version": "1.0.0",
"license": "AGPL-3.0-only",
"dependencies": {
- "xterm": "^5.3.0",
- "xterm-addon-fit": "^0.7.0"
- },
- "devDependencies": {
- "@rollup/plugin-commonjs": "^24.1.0",
- "@rollup/plugin-node-resolve": "^15.0.2",
- "@rollup/plugin-replace": "^5.0.2",
- "http-server": "^14.1.1",
- "mocha": "^10.2.0",
- "rollup": "^3.21.4",
- "rollup-plugin-copy": "^3.4.0"
+ "console-table-printer": "^2.12.1",
+ "dedent": "^1.5.3",
+ "diff-match-patch": "^1.0.5",
+ "enquirer": "^2.4.1",
+ "js-levenshtein": "^1.1.6",
+ "yaml": "^2.4.5"
+ }
+ },
+ "tools/migrations-test": {
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "commander": "^12.1.0"
+ }
+ },
+ "tools/migrations-test/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "tools/module-docgen": {
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@babel/parser": "^7.26.2",
+ "@babel/traverse": "^7.25.9",
+ "dedent": "^1.5.3",
+ "doctrine": "^3.0.0"
}
+ },
+ "tools/token-count-accuracy": {
+ "version": "1.0.0",
+ "license": "AGPL-3.0-only"
}
}
}
diff --git a/package.json b/package.json
index 0e8d2d1340..4b5bd85012 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "puter.com",
- "version": "2.1.1",
+ "version": "2.5.1",
"author": "Puter Technologies Inc.",
"license": "AGPL-3.0-only",
"description": "Desktop environment in the browser!",
@@ -11,26 +11,55 @@
"lib": "lib"
},
"devDependencies": {
+ "@eslint/js": "^9.35.0",
+ "@playwright/test": "^1.56.1",
+ "@stylistic/eslint-plugin": "^5.3.1",
+ "@types/express": "^4.17.21",
+ "@types/mime-types": "^3.0.1",
+ "@types/uuid": "^10.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.46.1",
+ "@typescript-eslint/parser": "^8.46.1",
+ "@vitest/coverage-v8": "^4.0.14",
+ "@vitest/ui": "^4.0.14",
"chalk": "^4.1.0",
"clean-css": "^5.3.2",
"dotenv": "^16.4.5",
- "express": "^4.18.2",
+ "eslint": "^9.35.0",
+ "eslint-rule-composer": "^0.3.0",
+ "globals": "^15.15.0",
"html-entities": "^2.3.3",
+ "html-webpack-plugin": "^5.6.0",
+ "husky": "^9.1.7",
+ "license-check-and-add": "^4.0.5",
+ "mocha": "^7.2.0",
"nodemon": "^3.1.0",
+ "simple-git": "^3.32.3",
+ "typescript": "^5.4.5",
"uglify-js": "^3.17.4",
+ "vite-plugin-static-copy": "^3.3.0",
+ "vitest": "^4.0.14",
"webpack": "^5.88.2",
- "webpack-cli": "^5.1.1"
+ "webpack-cli": "^5.1.1",
+ "yaml": "^2.8.1"
},
"scripts": {
- "test": "mocha ./packages/phoenix/test ./packages/phoenix/packages/contextlink/test",
+ "test": "npx vitest run --config=src/backend/vitest.config.ts && node src/backend/tools/test.mjs",
+ "test:puterjs-api": "vitest run tests/puterJsApiTests",
+ "test:backend": "npm run build:ts; vitest run --config=src/backend/vitest.config.ts",
+ "test:backend-coverage": "npm run build:ts; vitest run --config=src/backend/vitest.config.ts",
"start=gui": "nodemon --exec \"node dev-server.js\" ",
- "start": "node run-selfhosted.js",
- "build": "node ./build.js",
+ "start": "node ./tools/run-selfhosted.js",
+ "prestart": "npm run build:ts",
+ "dev": "npm run build:ts && node ./tools/run-selfhosted.js",
+ "build": "npx eslint --quiet -c eslint/mandatory.eslint.config.js src/backend/src extensions && npm run build:ts && cd src/gui && node ./build.js",
"check-translations": "node tools/check-translations.js",
- "postinstall": "cd packages/phoenix && cd packages/contextlink && npm install && cd - && cd packages/strataparse && npm install && cd - && cd packages/pty && npm install"
+ "prepare": "husky",
+ "build:ts": "tsc -p tsconfig.build.json"
},
"workspaces": [
- "packages/*"
+ "src/*",
+ "tools/*",
+ "experiments/js-parse-and-output"
],
"nodemonConfig": {
"ext": "js, json, mjs, jsx, svg, css",
@@ -40,6 +69,41 @@
]
},
"dependencies": {
+ "@ai-sdk/openai": "^3.0.25",
+ "@anthropic-ai/sdk": "^0.68.0",
+ "@aws-sdk/client-dynamodb": "^3.490.0",
+ "@aws-sdk/client-s3": "^3.1020.0",
+ "@aws-sdk/client-secrets-manager": "^3.879.0",
+ "@aws-sdk/client-sns": "^3.907.0",
+ "@aws-sdk/credential-providers": "^3.1021.0",
+ "@aws-sdk/lib-dynamodb": "^3.490.0",
+ "@google/genai": "^1.19.0",
+ "@heyputer/putility": "^1.0.2",
+ "@paralleldrive/cuid2": "^2.2.2",
+ "@stylistic/eslint-plugin-js": "^4.4.1",
+ "ai": "^6.0.73",
+ "dedent": "^1.5.3",
+ "dynalite": "^4.0.0",
+ "express": "^4.18.2",
+ "express-xml-bodyparser": "^0.4.1",
+ "fauxqs": "^2.5.0",
+ "file-type": "21.3.3",
+ "javascript-time-ago": "^2.5.11",
+ "json-colorizer": "^3.0.1",
+ "music-metadata": "11.12.3",
+ "open": "^10.1.0",
+ "parse-domain": "^8.2.2",
+ "string-template": "^1.0.0",
"uuid": "^9.0.1"
+ },
+ "optionalDependencies": {
+ "@emnapi/core": "^1.9.2",
+ "@emnapi/runtime": "^1.9.2",
+ "sharp": "^0.34.4",
+ "sharp-bmp": "^0.1.5",
+ "sharp-ico": "^0.1.5"
+ },
+ "engines": {
+ "node": ">=24.0.0"
}
}
diff --git a/packages/backend/.gitignore b/packages/backend/.gitignore
deleted file mode 100644
index 0bd7d2ef36..0000000000
--- a/packages/backend/.gitignore
+++ /dev/null
@@ -1,151 +0,0 @@
-# MAC OS hidden directory settings file
-.DS_Store
-
-# Created by https://www.toptal.com/developers/gitignore/api/node
-# Edit at https://www.toptal.com/developers/gitignore?templates=node
-
-### Node ###
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-lerna-debug.log*
-.pnpm-debug.log*
-
-# Diagnostic reports (https://nodejs.org/api/report.html)
-report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-*.lcov
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules/
-jspm_packages/
-
-# Snowpack dependency directory (https://snowpack.dev/)
-web_modules/
-
-# TypeScript cache
-*.tsbuildinfo
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
-.env
-.env.test
-.env.production
-
-# parcel-bundler cache (https://parceljs.org/)
-.cache
-.parcel-cache
-
-# Next.js build output
-.next
-out
-
-# Nuxt.js build / generate output
-.nuxt
-dist
-
-# Gatsby files
-.cache/
-# Comment in the public line in if your project uses Gatsby and not Next.js
-# https://nextjs.org/blog/next-9-1#public-directory-support
-# public
-
-# vuepress build output
-.vuepress/dist
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
-# Stores VSCode versions used for testing VSCode extensions
-.vscode-test
-
-# yarn v2
-.yarn/cache
-.yarn/unplugged
-.yarn/build-state.yml
-.yarn/install-state.gz
-.pnp.*
-
-# End of https://www.toptal.com/developers/gitignore/api/node
-public/.DS_Store
-*.zip
-*.pem
-public/.DS_Store
-public/.DS_Store
-public/.DS_Store
-./build
-build
-
-# config file
-volatile/
-ssl
-ssl/
-keys
-*.code-workspace
-
-# credentials
-creds*
-
-# thumbnai-service
-thumbnail-service
-
-# init sql generated from ./run.sh
-init.sql
diff --git a/packages/backend/README.md b/packages/backend/README.md
deleted file mode 100644
index cf5a14ba74..0000000000
--- a/packages/backend/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Puter Backend
-
-- [Documentation for Contributors](./doc/contributors/index.md)
diff --git a/packages/backend/doc/contributors/index.md b/packages/backend/doc/contributors/index.md
deleted file mode 100644
index 32890ebf42..0000000000
--- a/packages/backend/doc/contributors/index.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Contributing to Puter's Backend
-
-## Initial Reading
-
-- [puter-js-common's README.md](../../packages/puter-js-common/README.md)
- - Whenever you see `AdvancedBase`, that's from here
- - Many things in backend extend this. Anything that doesn't only doesn't
- because it was written before `AdvancedBase` existed.
- - Allows adding "traits" to classes
- - Have you ever wanted to wrap every method of a class with
- common behavior? This can do that!
-
-## Where to Start
-
-- [Kernel](../../src/Kernel.js), despite its intimidating name, is a
- relatively simple (< 200 LOC) class which loads the modules
- (modules register services), and then starts all the services.
-- [RuntimeEnvironment](../../src/boot/RuntimeEnvironment.js)
- sets the configuration and runtime directories. It's invoked by Kernel.
-- The default setup for running a self-hosted Puter loads these modules:
- - [CoreModule](../../src/CoreModule.js)
- - [DatabaseModule](../../src/DatabaseModule.js)
- - [LocalDiskStorageModule](../../src/LocalDiskStorageModule.js)
-- HTTP endpoints are registered with
- [WebServerService](../../src/services/WebServerService.js)
- by these services:
- - [ServeGUIService](../../src/services/ServeGUIService.js)
- - [PuterAPIService](../../src/services/PuterAPIService.js)
- - [FilesystemAPIService](../../src/services/FilesystemAPIService.js)
-
-## Development Philosophies
-
-### The copy-paste rule
-
-If you're copying and pasting code, you need to ask this question:
-- am I copying as a reference (i.e. how this function is used),
-- or am I copying an implementation of actual behavior?
-
-If your answer is the first, you should find more than one piece of
-code that's doing the same thing you want to do and see if any of them
-are doing it differently. One of the ways of doing this thing is going
-to be more recent and/or (yes, potentially "or") more correct.
-More correct approaches are ones which reduce
-[coupling](https://en.wikipedia.org/wiki/Coupling_(computer_programming)),
-move from legacy implementations to more recent ones, and are actually
-more convenient for you to use. Whenever ever any of these three things
-are in contention it's very important to communicate this to the
-appropriate maintainers and contributors.
-
-If your answer is the second, you should find a way to
-[DRY that code](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself).
-
-### Architecture Mistakes? You will make them and it will suck.
-
-In my experience, the harder I think about the correct way to implement
-something, the bigger a mistake I'm going to make; ***unless*** a big part
-of the reason I'm thinking so hard is because I want to find a solution
-that reduces complexity and has the right maintanence trade-off.
-There's no easy solution for this so just keep it in mind; there are some
-things we might write 2 times, 3 times, even more times over before we
-really get it right and *that's okay*; sometimes part of doing useful work is
-doing the useless work that reveals what the useful work is.
\ No newline at end of file
diff --git a/packages/backend/exports.js b/packages/backend/exports.js
deleted file mode 100644
index fec5b824a9..0000000000
--- a/packages/backend/exports.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const CoreModule = require("./src/CoreModule.js");
-const { Kernel } = require("./src/Kernel.js");
-const DatabaseModule = require("./src/DatabaseModule.js");
-const LocalDiskStorageModule = require("./src/LocalDiskStorageModule.js");
-const SelfhostedModule = require("./src/SelfhostedModule.js");
-const PuterDriversModule = require("./src/PuterDriversModule.js");
-const { testlaunch } = require("./src/index.js");
-const BaseService = require("./src/services/BaseService.js");
-const { Context } = require("./src/util/context.js");
-
-
-module.exports = {
- helloworld: () => {
- console.log('Hello, World!');
- process.exit(0);
- },
- testlaunch,
-
- // Kernel API
- BaseService,
- Context,
-
- Kernel,
-
- // Pre-built modules
- CoreModule,
- DatabaseModule,
- PuterDriversModule,
- LocalDiskStorageModule,
- SelfhostedModule,
-};
diff --git a/packages/backend/package.json b/packages/backend/package.json
deleted file mode 100644
index a1ebc65791..0000000000
--- a/packages/backend/package.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "name": "@heyputer/backend",
- "version": "2.1.0",
- "description": "Backend/Kernel for Puter",
- "main": "exports.js",
- "scripts": {
- "test": "npx mocha"
- },
- "workspaces": [
- "packages/*"
- ],
- "dependencies": {
- "@heyputer/kv.js": "^0.1.3",
- "@heyputer/multest": "^0.0.2",
- "@opentelemetry/api": "^1.4.1",
- "@opentelemetry/auto-instrumentations-node": "^0.43.0",
- "@opentelemetry/exporter-trace-otlp-grpc": "^0.40.0",
- "@opentelemetry/sdk-metrics": "^1.14.0",
- "@opentelemetry/sdk-node": "^0.49.1",
- "@pagerduty/pdjs": "^2.2.4",
- "@smithy/node-http-handler": "^2.2.2",
- "args": "^5.0.3",
- "aws-sdk": "^2.1383.0",
- "axios": "^1.4.0",
- "bcrypt": "^5.1.0",
- "better-sqlite3": "^9.4.3",
- "busboy": "^1.6.0",
- "chai-as-promised": "^7.1.1",
- "clean-css": "^5.3.2",
- "composite-error": "^1.0.2",
- "compression": "^1.7.4",
- "cookie-parser": "^1.4.6",
- "express": "^4.18.2",
- "file-type": "^18.5.0",
- "form-data": "^4.0.0",
- "handlebars": "^4.7.8",
- "helmet": "^7.0.0",
- "html-entities": "^2.3.3",
- "is-glob": "^4.0.3",
- "isbot": "^3.7.1",
- "jimp": "^0.22.8",
- "js-sha256": "^0.9.0",
- "json5": "^2.2.3",
- "jsonwebtoken": "^9.0.0",
- "knex": "^3.1.0",
- "lorem-ipsum": "^2.0.8",
- "micromatch": "^4.0.5",
- "mime-types": "^2.1.35",
- "moment": "^2.29.4",
- "morgan": "^1.10.0",
- "multer": "^1.4.5-lts.1",
- "multi-progress": "^4.0.0",
- "murmurhash": "^2.0.1",
- "nodemailer": "^6.9.3",
- "on-finished": "^2.4.1",
- "openai": "^4.20.1",
- "prompt-sync": "^4.2.0",
- "recursive-readdir": "^2.2.3",
- "response-time": "^2.3.2",
- "seedrandom": "^3.0.5",
- "socket.io": "^4.6.2",
- "ssh2": "^1.13.0",
- "string-hash": "^1.1.3",
- "string-length": "^6.0.0",
- "svgo": "^3.0.2",
- "tiktoken": "^1.0.11",
- "uglify-js": "^3.17.4",
- "uuid": "^9.0.0",
- "validator": "^13.9.0",
- "winston": "^3.9.0",
- "winston-daily-rotate-file": "^4.7.1"
- },
- "devDependencies": {
- "@types/node": "^20.5.3",
- "chai": "^4.3.7",
- "mocha": "^10.2.0",
- "nodemon": "^3.1.0",
- "nyc": "^15.1.0",
- "sinon": "^15.2.0",
- "typescript": "^5.1.6"
- },
- "author": "Puter Technologies Inc.",
- "license": "AGPL-3.0-only"
-}
diff --git a/packages/backend/packages/puter-js-common/README.md b/packages/backend/packages/puter-js-common/README.md
deleted file mode 100644
index be19cc07bc..0000000000
--- a/packages/backend/packages/puter-js-common/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Puter - Common Javascript Module
-
-This is a small module for javascript which you might call a
-"langauge tool"; it adds some behavior to make javascript classes
-more flexible, with an aim to avoid any significant complexity.
-
-Each class in this module is best described as an _idea_:
-
-### BasicBase
-
-**BasicBase** is the idea that there should be a common way to
-see the inheretence chain of the current instance, and obtain
-merged objects and arrays from static members of these classes.
-
-### TraitBase
-
-**TraitBase** is the idea that there should be a common way to
-"install" behavior into objects of a particular class, as
-dictated by the class definition. A trait might install a common
-set of methods ("mixins"), decorate all or a specified set of
-methods in the class (performance monitors, sanitization, etc),
-or anything else.
-
-### AdvancedBase
-
-**AdvancedBase** is the idea that, in a node.js environment,
-you always want the ability to add traits to a class and there
-are some default traits you want in all classes, which are:
-
-- `PropertiesTrait` - add lazy factories for instance members
- instead of always populating them in the constructor.
-- `NodeModuleDITrait` - require node modules in a way that
- allows unit tests to inject mocks easily.
diff --git a/packages/backend/packages/puter-js-common/index.js b/packages/backend/packages/puter-js-common/index.js
deleted file mode 100644
index b4e7b616b4..0000000000
--- a/packages/backend/packages/puter-js-common/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require('./src/AdvancedBase');
-
-module.exports = {
- AdvancedBase,
-};
diff --git a/packages/backend/packages/puter-js-common/package.json b/packages/backend/packages/puter-js-common/package.json
deleted file mode 100644
index efb1b90f59..0000000000
--- a/packages/backend/packages/puter-js-common/package.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "name": "puter-js-common",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "Puter Technologies Inc.",
- "license": "UNLICENSED"
-}
diff --git a/packages/backend/packages/puter-js-common/src/AdvancedBase.js b/packages/backend/packages/puter-js-common/src/AdvancedBase.js
deleted file mode 100644
index 069e474aff..0000000000
--- a/packages/backend/packages/puter-js-common/src/AdvancedBase.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-// This doesn't go in ./bases because it logically depends on
-// both ./bases and ./traits, and ./traits depends on ./bases.
-
-const { TraitBase } = require("./bases/TraitBase");
-
-class AdvancedBase extends TraitBase {
- static TRAITS = [
- require('./traits/NodeModuleDITrait'),
- require('./traits/PropertiesTrait'),
- ]
-}
-
-module.exports = {
- AdvancedBase,
-};
diff --git a/packages/backend/packages/puter-js-common/src/bases/BasicBase.js b/packages/backend/packages/puter-js-common/src/bases/BasicBase.js
deleted file mode 100644
index 78d121f980..0000000000
--- a/packages/backend/packages/puter-js-common/src/bases/BasicBase.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-class BasicBase {
- _get_inheritance_chain () {
- const chain = [];
- let cls = this.constructor;
- while ( cls && cls !== BasicBase ) {
- chain.push(cls);
- cls = cls.__proto__;
- }
- return chain.reverse();
- }
-
- _get_merged_static_array (key) {
- const chain = this._get_inheritance_chain();
- const values = [];
- for ( const cls of chain ) {
- if ( cls[key] ) {
- values.push(...cls[key]);
- }
- }
- return values;
- }
-
- _get_merged_static_object (key) {
- const chain = this._get_inheritance_chain();
- const values = {};
- for ( const cls of chain ) {
- if ( cls[key] ) {
- Object.assign(values, cls[key]);
- }
- }
- return values;
- }
-}
-
-module.exports = {
- BasicBase,
-};
\ No newline at end of file
diff --git a/packages/backend/packages/puter-js-common/src/bases/TraitBase.js b/packages/backend/packages/puter-js-common/src/bases/TraitBase.js
deleted file mode 100644
index 62d3cc1e9f..0000000000
--- a/packages/backend/packages/puter-js-common/src/bases/TraitBase.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { BasicBase } = require("./BasicBase");
-
-class TraitBase extends BasicBase {
- constructor (parameters, ...a) {
- super(parameters, ...a);
- for ( const trait of this.traits ) {
- trait.install_in_instance(
- this,
- {
- parameters: parameters || {},
- }
- )
- }
- }
-
- get traits () {
- return this._get_merged_static_array('TRAITS');
- }
-}
-
-module.exports = {
- TraitBase,
-};
diff --git a/packages/backend/packages/puter-js-common/src/traits/NodeModuleDITrait.js b/packages/backend/packages/puter-js-common/src/traits/NodeModuleDITrait.js
deleted file mode 100644
index d7952704c0..0000000000
--- a/packages/backend/packages/puter-js-common/src/traits/NodeModuleDITrait.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-/**
- * This trait allows dependency injection of node modules.
- * This is incredibly useful for passing mock implementations
- * of modules for unit testing.
- *
- * @example
- * class MyClass extends AdvancedBase {
- * static MODULES = {
- * axios,
- * };
- * }
- *
- * const my_class = new MyClass({
- * modules: {
- * axios: MY_AXIOS_MOCK,
- * }
- * });
- */
-module.exports = {
- install_in_instance: (instance, { parameters }) => {
- const modules = instance._get_merged_static_object('MODULES');
-
- if ( parameters.modules ) {
- for ( const k in parameters.modules ) {
- modules[k] = parameters.modules[k];
- }
- }
-
- instance.modules = modules;
-
- // This "require" function can shadow the real one so
- // that editor tools are aware of the modules that
- // are being used.
- instance.require = (name) => {
- if ( modules[name] ) {
- return modules[name];
- }
- return require(name);
- }
- },
-};
diff --git a/packages/backend/packages/puter-js-common/src/traits/PropertiesTrait.js b/packages/backend/packages/puter-js-common/src/traits/PropertiesTrait.js
deleted file mode 100644
index 9e2c4b72ba..0000000000
--- a/packages/backend/packages/puter-js-common/src/traits/PropertiesTrait.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-module.exports = {
- install_in_instance: (instance) => {
- const properties = instance._get_merged_static_object('PROPERTIES');
-
- for ( const k in properties ) {
- if ( typeof properties[k] === 'function' ) {
- instance[k] = properties[k]();
- continue;
- }
-
- if ( typeof properties[k] === 'object' ) {
- // This will be supported in the future.
- throw new Error(`Property ${k} in ${instance.constructor.name} ` +
- `is not a supported property specification.`);
- }
-
- instance[k] = properties[k];
- }
- }
-}
diff --git a/packages/backend/packages/puter-js-common/test/test.js b/packages/backend/packages/puter-js-common/test/test.js
deleted file mode 100644
index 34a36f4d7e..0000000000
--- a/packages/backend/packages/puter-js-common/test/test.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { expect } = require('chai');
-const { BasicBase } = require('../src/bases/BasicBase');
-const { AdvancedBase } = require('../src/AdvancedBase');
-
-class ClassA extends BasicBase {
- static STATIC_OBJ = {
- a: 1,
- b: 2,
- };
- static STATIC_ARR = ['a', 'b'];
-}
-
-class ClassB extends ClassA {
- static STATIC_OBJ = {
- c: 3,
- d: 4,
- };
- static STATIC_ARR = ['c', 'd'];
-}
-
-describe('testing', () => {
- it('does a thing', () => {
- const b = new ClassB();
-
- console.log(b._get_inheritance_chain());
- console.log([ClassA, ClassB]);
- expect(b._get_inheritance_chain()).deep.equal([ClassA, ClassB]);
- expect(b._get_merged_static_array('STATIC_ARR'))
- .deep.equal(['a', 'b', 'c', 'd']);
- expect(b._get_merged_static_object('STATIC_OBJ'))
- .deep.equal({ a: 1, b: 2, c: 3, d: 4 });
- });
-});
-
-class ClassWithModule extends AdvancedBase {
- static MODULES = {
- axios: 'axios',
- };
-}
-
-describe('AdvancedBase', () => {
- it('passes DI modules to instance', () => {
- const c1 = new ClassWithModule();
- expect(c1.modules.axios).to.equal('axios');
-
- const c2 = new ClassWithModule({
- modules: {
- axios: 'my-axios',
- },
- });
- expect(c2.modules.axios).to.equal('my-axios');
- });
-});
-
diff --git a/packages/backend/src/CoreModule.js b/packages/backend/src/CoreModule.js
deleted file mode 100644
index a151452cc1..0000000000
--- a/packages/backend/src/CoreModule.js
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-const { Context } = require('./util/context');
-
-
-class CoreModule extends AdvancedBase {
- async install (context) {
- const services = context.get('services');
- const app = context.get('app');
- await install({ services, app });
- }
-
- // Some services were created before the BaseService
- // class existed. They don't listen to the init event
- // and the order in which they're instantiated matters.
- // They all need to be installed after the init event
- // is dispatched, so they get a separate install method.
- async install_legacy (context) {
- const services = context.get('services');
- await install_legacy({ services });
- }
-}
-
-module.exports = CoreModule;
-
-const install = async ({ services, app }) => {
- const config = require('./config');
-
- // /!\ IMPORTANT /!\
- // For new services, put the import immediate above the
- // call to services.registerService. We'll clean this up
- // in a future PR.
-
- const { LogService } = require('./services/runtime-analysis/LogService');
- const { PagerService } = require('./services/runtime-analysis/PagerService');
- const { AlarmService } = require('./services/runtime-analysis/AlarmService');
- const { ErrorService } = require('./services/runtime-analysis/ErrorService');
- const { CommandService } = require('./services/CommandService');
- const { ExpectationService } = require('./services/runtime-analysis/ExpectationService');
- const { HTTPThumbnailService } = require('./services/thumbnails/HTTPThumbnailService');
- const { PureJSThumbnailService } = require('./services/thumbnails/PureJSThumbnailService');
- const { NAPIThumbnailService } = require('./services/thumbnails/NAPIThumbnailService');
- const { DevConsoleService } = require('./services/DevConsoleService');
- const { RateLimitService } = require('./services/sla/RateLimitService');
- const { MonthlyUsageService } = require('./services/sla/MonthlyUsageService');
- const { AuthService } = require('./services/auth/AuthService');
- const { SLAService } = require('./services/sla/SLAService');
- const { PermissionService } = require('./services/auth/PermissionService');
- const { ACLService } = require('./services/auth/ACLService');
- const { CoercionService } = require('./services/drivers/CoercionService');
- const { PuterSiteService } = require('./services/PuterSiteService');
- const { ContextInitService } = require('./services/ContextInitService');
- const { IdentificationService } = require('./services/abuse-prevention/IdentificationService');
- const { AuthAuditService } = require('./services/abuse-prevention/AuthAuditService');
- const { RegistryService } = require('./services/RegistryService');
- const { RegistrantService } = require('./services/RegistrantService');
- const { SystemValidationService } = require('./services/SystemValidationService');
- const { EntityStoreService } = require('./services/EntityStoreService');
- const SQLES = require('./om/entitystorage/SQLES');
- const ValidationES = require('./om/entitystorage/ValidationES');
- const { SetOwnerES } = require('./om/entitystorage/SetOwnerES');
- const AppES = require('./om/entitystorage/AppES');
- const WriteByOwnerOnlyES = require('./om/entitystorage/WriteByOwnerOnlyES');
- const SubdomainES = require('./om/entitystorage/SubdomainES');
- const { MaxLimitES } = require('./om/entitystorage/MaxLimitES');
- const { AppLimitedES } = require('./om/entitystorage/AppLimitedES');
- const { ESBuilder } = require('./om/entitystorage/ESBuilder');
- const { Eq, Or } = require('./om/query/query');
- const { TrackSpendingService } = require('./services/TrackSpendingService');
- const { ServerHealthService } = require('./services/runtime-analysis/ServerHealthService');
- const { MakeProdDebuggingLessAwfulService } = require('./services/MakeProdDebuggingLessAwfulService');
- const { ConfigurableCountingService } = require('./services/ConfigurableCountingService');
- const { FSLockService } = require('./services/fs/FSLockService');
- const { StrategizedService } = require('./services/StrategizedService');
- const WebServerService = require('./services/WebServerService');
- const FilesystemAPIService = require('./services/FilesystemAPIService');
- const ServeGUIService = require('./services/ServeGUIService');
- const PuterAPIService = require('./services/PuterAPIService');
- const { RefreshAssociationsService } = require("./services/RefreshAssociationsService");
- // Service names beginning with '__' aren't called by other services;
- // these provide data/functionality to other services or produce
- // side-effects from the events of other services.
-
- // === Services which extend BaseService ===
- services.registerService('system-validation', SystemValidationService);
- services.registerService('server-health', ServerHealthService);
- services.registerService('log-service', LogService);
- services.registerService('commands', CommandService);
- services.registerService('web-server', WebServerService, { app });
- services.registerService('__api-filesystem', FilesystemAPIService);
- services.registerService('__api', PuterAPIService);
- services.registerService('__gui', ServeGUIService);
- services.registerService('expectations', ExpectationService);
- services.registerService('pager', PagerService);
- services.registerService('alarm', AlarmService);
- services.registerService('error-service', ErrorService);
- services.registerService('registry', RegistryService);
- services.registerService('__registrant', RegistrantService);
- services.registerService('fslock', FSLockService);
- services.registerService('es:app', EntityStoreService, {
- entity: 'app',
- upstream: ESBuilder.create([
- SQLES, { table: 'app', debug: true, },
- AppES,
- AppLimitedES, {
- // When apps query es:apps, they're allowed to see apps which
- // are approved for listing and they're allowed to see their
- // own entry.
- exception: async () => {
- const actor = Context.get('actor');
- return new Or({
- children: [
- new Eq({
- key: 'approved_for_listing',
- value: 1,
- }),
- new Eq({
- key: 'uid',
- value: actor.type.app.uid,
- }),
- ]
- });
- },
- },
- WriteByOwnerOnlyES,
- ValidationES,
- SetOwnerES,
- MaxLimitES, { max: 50 },
- ]),
- });
- services.registerService('es:subdomain', EntityStoreService, {
- entity: 'subdomain',
- upstream: ESBuilder.create([
- SQLES, { table: 'subdomains', debug: true, },
- SubdomainES,
- AppLimitedES,
- WriteByOwnerOnlyES,
- ValidationES,
- SetOwnerES,
- MaxLimitES, { max: 50 },
- ]),
- });
- services.registerService('rate-limit', RateLimitService);
- services.registerService('monthly-usage', MonthlyUsageService);
- services.registerService('auth', AuthService);
- services.registerService('permission', PermissionService);
- services.registerService('sla', SLAService);
- services.registerService('acl', ACLService);
- services.registerService('coercion', CoercionService);
- services.registerService('puter-site', PuterSiteService);
- services.registerService('context-init', ContextInitService);
- services.registerService('identification', IdentificationService);
- services.registerService('auth-audit', AuthAuditService);
- services.registerService('spending', TrackSpendingService);
- services.registerService('counting', ConfigurableCountingService);
- services.registerService('thumbnails', StrategizedService, {
- strategy_key: 'engine',
- strategies: {
- napi: [NAPIThumbnailService],
- purejs: [PureJSThumbnailService],
- http: [HTTPThumbnailService],
- }
- });
- services.registerService('__refresh-assocs', RefreshAssociationsService);
- services.registerService('__prod-debugging', MakeProdDebuggingLessAwfulService);
- if ( config.env == 'dev' ) {
- services.registerService('dev-console', DevConsoleService);
- }
-
- const { EventService } = require('./services/EventService');
- services.registerService('event', EventService);
-
- const { PuterVersionService } = require('./services/PuterVersionService');
- services.registerService('puter-version', PuterVersionService);
-
- const { SessionService } = require('./services/SessionService');
- services.registerService('session', SessionService);
-}
-
-const install_legacy = async ({ services }) => {
- const { ProcessEventService } = require('./services/runtime-analysis/ProcessEventService');
- const { ParameterService } = require('./services/ParameterService');
- const { InformationService } = require('./services/information/InformationService');
- const { FilesystemService } = require('./filesystem/FilesystemService');
- const PerformanceMonitor = require('./monitor/PerformanceMonitor');
- const { OperationTraceService } = require('./services/OperationTraceService');
- const { WSPushService } = require('./services/WSPushService');
- const { ReferralCodeService } = require('./services/ReferralCodeService');
- const { Emailservice } = require('./services/EmailService');
- const { ClientOperationService } = require('./services/ClientOperationService');
- const { EngPortalService } = require('./services/EngPortalService');
- const { AppInformationService } = require('./services/AppInformationService');
- const { FileCacheService } = require('./services/file-cache/FileCacheService');
-
- // === Services which do not yet extend BaseService ===
- services.registerService('process-event', ProcessEventService);
- services.registerService('params', ParameterService);
- services.registerService('information', InformationService)
- services.registerService('filesystem', FilesystemService);
- services.registerService('operationTrace', OperationTraceService);
- services.registerService('__event-push-ws', WSPushService);
- services.registerService('referral-code', ReferralCodeService);
- services.registerService('email', Emailservice);
- services.registerService('file-cache', FileCacheService);
- services.registerService('client-operation', ClientOperationService);
- services.registerService('app-information', AppInformationService);
- services.registerService('engineering-portal', EngPortalService);
- // TODO: add to here: ResourceService and DatabaseFSEntryService
-
- // This singleton was made before services existed,
- // so we have to pass that to it manually
- PerformanceMonitor.provideServices(services);
-
-};
diff --git a/packages/backend/src/DatabaseModule.js b/packages/backend/src/DatabaseModule.js
deleted file mode 100644
index 7b31c6b327..0000000000
--- a/packages/backend/src/DatabaseModule.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-
-class DatabaseModule extends AdvancedBase {
- async install (context) {
- const services = context.get('services');
-
- const { StrategizedService } = require('./services/StrategizedService');
- const { SqliteDatabaseAccessService } = require('./services/database/SqliteDatabaseAccessService');
- services.registerService('database', StrategizedService, {
- strategy_key: 'engine',
- strategies: {
- sqlite: [SqliteDatabaseAccessService],
- }
- })
- }
-}
-
-module.exports = DatabaseModule;
diff --git a/packages/backend/src/Kernel.js b/packages/backend/src/Kernel.js
deleted file mode 100644
index e1fac6f3fa..0000000000
--- a/packages/backend/src/Kernel.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-const { Context } = require('./util/context');
-
-class Kernel extends AdvancedBase {
- constructor () {
- super();
-
- this.modules = [];
- }
-
- add_module (module) {
- this.modules.push(module);
- }
-
- _runtime_init () {
- const kvjs = require('@heyputer/kv.js');
- const kv = new kvjs();
- global.kv = kv;
- global.cl = console.log;
-
- const { RuntimeEnvironment } = require('./boot/RuntimeEnvironment');
- const { BootLogger } = require('./boot/BootLogger');
-
- // Temporary logger for boot process;
- // LoggerService will be initialized in app.js
- const bootLogger = new BootLogger();
-
- // Determine config and runtime locations
- const runtimeEnv = new RuntimeEnvironment({
- logger: bootLogger,
- });
- runtimeEnv.init();
-
- // polyfills
- require('./polyfill/to-string-higher-radix');
- }
-
- boot () {
- this._runtime_init();
-
- // const express = require('express')
- // const app = express();
- const config = require('./config');
-
- globalThis.xtra_log = () => {};
- if ( config.env === 'dev' ) {
- globalThis.xtra_log = (...args) => {
- // append to file in temp
- const fs = require('fs');
- const path = require('path');
- const log_path = path.join('/tmp/xtra_log.txt');
- fs.appendFileSync(log_path, args.join(' ') + '\n');
- }
- }
-
- const { consoleLogManager } = require('./util/consolelog');
- consoleLogManager.initialize_proxy_methods();
-
- // TODO: temporary dependency inversion; requires moving:
- // - rm, so we can move mv
- // - mv, so we can move mkdir
- // - generate_default_fsentries, so we can move mkdir
- // - mkdir, which needs an fs provider
-
- // === START: Initialize Service Registry ===
- const { Container } = require('./services/Container');
-
- const services = new Container();
- this.services = services;
- // app.set('services', services);
-
- const root_context = Context.create({
- services,
- config,
- }, 'app');
- globalThis.root_context = root_context;
-
- root_context.arun(async () => {
- await this._install_modules();
- await this._boot_services();
- });
-
-
- // Error.stackTraceLimit = Infinity;
- Error.stackTraceLimit = 200;
- }
-
- async _install_modules () {
- const { services } = this;
-
- for ( const module of this.modules ) {
- await module.install(Context.get());
- }
-
- try {
- await services.init();
- } catch (e) {
- // First we'll try to mark the system as invalid via
- // SystemValidationService. This might fail because this service
- // may not be initialized yet.
-
- const svc_systemValidation = (() => {
- try {
- return services.get('system-validation');
- } catch (e) {
- return null;
- }
- })();
-
- if ( ! svc_systemValidation ) {
- // If we can't mark the system as invalid, we'll just have to
- // throw the error and let the server crash.
- throw e;
- }
-
- await svc_systemValidation.mark_invalid(
- 'failed to initialize services',
- e,
- );
- }
-
- for ( const module of this.modules ) {
- await module.install_legacy?.(Context.get());
- }
-
- services.ready.resolve();
- // provide services to helpers
-
- const { tmp_provide_services } = require('./helpers');
- tmp_provide_services(services);
- }
-
- async _boot_services () {
- const { services } = this;
-
- await services.ready;
- {
- const app = services.get('web-server').app;
- app.use(async (req, res, next) => {
- req.services = services;
- next();
- });
- await services.emit('boot.services-initialized');
- await services.emit('install.middlewares.context-aware', { app });
- await services.emit('install.routes', { app });
- await services.emit('install.routes-gui', { app });
- }
-
- // === END: Initialize Service Registry ===
-
- // self check
- (async () => {
- await services.ready;
- globalThis.services = services;
- const log = services.get('log-service').create('init');
- log.info('services ready');
-
- log.system('server ready', {
- deployment_type: globalThis.deployment_type,
- });
- })();
-
-
- await services.emit('start.webserver');
- await services.emit('ready.webserver');
- }
-}
-
-module.exports = { Kernel };
diff --git a/packages/backend/src/LocalDiskStorageModule.js b/packages/backend/src/LocalDiskStorageModule.js
deleted file mode 100644
index 26935e4c6b..0000000000
--- a/packages/backend/src/LocalDiskStorageModule.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-
-class LocalDiskStorageModule extends AdvancedBase {
- async install (context) {
- const services = context.get('services');
- const LocalDiskStorageService = require("./services/LocalDiskStorageService");
- services.registerService('local-disk-storage', LocalDiskStorageService);
-
- const HostDiskUsageService = require('./services/HostDiskUsageService');
- services.registerService('host-disk-usage', HostDiskUsageService);
- }
-}
-
-module.exports = LocalDiskStorageModule;
diff --git a/packages/backend/src/PuterDriversModule.js b/packages/backend/src/PuterDriversModule.js
deleted file mode 100644
index 5fddeb7193..0000000000
--- a/packages/backend/src/PuterDriversModule.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-
-class PuterDriversModule extends AdvancedBase {
- async install () {}
- async install_legacy (context) {
- const services = context.get('services');
-
- const { DriverService } = require("./services/drivers/DriverService");
- services.registerService('driver', DriverService);
- }
-}
-
-module.exports = PuterDriversModule;
diff --git a/packages/backend/src/SelfhostedModule.js b/packages/backend/src/SelfhostedModule.js
deleted file mode 100644
index 563f029ab6..0000000000
--- a/packages/backend/src/SelfhostedModule.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const { AdvancedBase } = require("puter-js-common");
-const config = require("./config");
-
-class SelfhostedModule extends AdvancedBase {
- async install (context) {
- const services = context.get('services');
-
- const DefaultUserService = require('./services/DefaultUserService');
- services.registerService('__default-user', DefaultUserService);
-
- const ComplainAboutVersionsService = require('./services/ComplainAboutVersionsService');
- services.registerService('complain-about-versions', ComplainAboutVersionsService);
-
- const DevWatcherService = require('./services/DevWatcherService');
- const path_ = require('path');
- services.registerService('__dev-watcher', DevWatcherService, {
- root: path_.resolve(__dirname, '../../../'),
- commands: [
- {
- name: 'puter.js:webpack-watch',
- directory: 'packages/puter-js',
- command: 'npm',
- args: ['run', 'start-webpack'],
- },
- {
- name: 'terminal:rollup-watch',
- directory: 'packages/terminal',
- command: 'npx',
- args: ['rollup', '-c', 'rollup.config.js', '--watch'],
- env: {
- PUTER_JS_URL: ({ global_config: config }) => config.origin + '/sdk/puter.dev.js',
- }
- },
- {
- name: 'phoenix:rollup-watch',
- directory: 'packages/phoenix',
- command: 'npx',
- args: ['rollup', '-c', 'rollup.config.js', '--watch'],
- env: {
- PUTER_JS_URL: ({ global_config: config }) => config.origin + '/sdk/puter.dev.js',
- }
- },
- ],
- });
-
- const ServeStaticFilesService = require("./services/ServceStaticFilesService");
- services.registerService('__serve-puterjs', ServeStaticFilesService, {
- directories: [
- {
- prefix: '/sdk',
- path: path_.resolve(__dirname, '../../../packages/puter-js/dist'),
- },
- {
- prefix: '/builtin/terminal',
- path: path_.resolve(__dirname, '../../../packages/terminal/dist'),
- },
- {
- prefix: '/builtin/phoenix',
- path: path_.resolve(__dirname, '../../../packages/phoenix/dist'),
- },
- ],
- });
- }
-}
-
-module.exports = SelfhostedModule;
diff --git a/packages/backend/src/ThirdPartyDriversModule.js b/packages/backend/src/ThirdPartyDriversModule.js
deleted file mode 100644
index 3f60419dbc..0000000000
--- a/packages/backend/src/ThirdPartyDriversModule.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-
-class ThirdPartyDriversModule extends AdvancedBase {
- // constructor () {
-}
diff --git a/packages/backend/src/api/APIError.js b/packages/backend/src/api/APIError.js
deleted file mode 100644
index 9209223648..0000000000
--- a/packages/backend/src/api/APIError.js
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { quot } = require("../util/strutil");
-
-/**
- * APIError represents an error that can be sent to the client.
- * @class APIError
- * @property {number} status the HTTP status code
- * @property {string} message the error message
- * @property {object} source the source of the error
- */
-module.exports = class APIError {
- static codes = {
- 'item_with_same_name_exists': {
- status: 409,
- message: ({ entry_name }) => entry_name
- ? `An item with name ${quot(entry_name)} already exists.`
- : 'An item with the same name already exists.'
- ,
- },
- 'cannot_move_item_into_itself': {
- status: 422,
- message: 'Cannot move an item into itself.',
- },
- 'cannot_copy_item_into_itself': {
- status: 422,
- message: 'Cannot copy an item into itself.',
- },
- 'cannot_move_to_root': {
- status: 422,
- message: 'Cannot move an item to the root directory.',
- },
- 'cannot_copy_to_root': {
- status: 422,
- message: 'Cannot copy an item to the root directory.',
- },
- 'cannot_write_to_root': {
- status: 422,
- message: 'Cannot write an item to the root directory.',
- },
- 'cannot_overwrite_a_directory': {
- status: 422,
- message: 'Cannot overwrite a directory.',
- },
- 'cannot_read_a_directory': {
- status: 422,
- message: 'Cannot read a directory.',
- },
- 'source_and_dest_are_the_same': {
- status: 422,
- message: 'Source and destination are the same.',
- },
- 'dest_is_not_a_directory': {
- status: 422,
- message: 'Destination must be a directory.',
- },
- 'dest_does_not_exist': {
- status: 422,
- message: 'Destination was not found.',
- },
- 'source_does_not_exist': {
- status: 404,
- message: 'Source was not found.',
- },
- 'subject_does_not_exist': {
- status: 404,
- message: 'File or directory not found.',
- },
- 'shortcut_target_not_found': {
- status: 404,
- message: 'Shortcut target not found.',
- },
- 'shortcut_target_is_a_directory': {
- status: 422,
- message: 'Shortcut target is a directory; expected a file.',
- },
- 'shortcut_target_is_a_file': {
- status: 422,
- message: 'Shortcut target is a file; expected a directory.',
- },
- 'forbidden': {
- status: 403,
- message: 'Permission denied.',
- },
- 'immutable': {
- status: 403,
- message: 'File is immutable.',
- },
- 'field_empty': {
- status: 400,
- message: ({ key }) => `Field ${quot(key)} is required.`,
- },
- 'field_missing': {
- status: 400,
- message: ({ key }) => `Field ${quot(key)} is required.`,
- },
- 'xor_field_missing': {
- status: 400,
- message: ({ names }) => {
- let s = 'One of these mutually-exclusive fields is required: ';
- s += names.map(quot).join(', ');
- return s;
- }
- },
- 'field_only_valid_with_other_field': {
- status: 400,
- message: ({ key, other_key }) => `Field ${quot(key)} is only valid when field ${quot(other_key)} is specified.`,
- },
- 'invalid_id': {
- status: 400,
- message: ({ id }) => {
- return `Invalid id`;
- }
- },
- 'invalid_operation': {
- status: 400,
- message: ({ operation }) => `Invalid operation: ${quot(operation)}.`,
- },
- 'field_invalid': {
- status: 400,
- message: ({ key, expected, got }) => {
- return `Field ${quot(key)} is invalid.` +
- (expected ? ` Expected ${expected}.` : '') +
- (got ? ` Got ${got}.` : '')
- }
- },
- 'field_immutable': {
- status: 400,
- message: ({ key }) => `Field ${quot(key)} is immutable.`,
- },
- 'field_too_long': {
- status: 400,
- message: ({ key, max_length }) => `Field ${quot(key)} is too long. Max length is ${max_length}.`,
- },
- 'field_too_short': {
- status: 400,
- message: ({ key, min_length }) => `Field ${quot(key)} is too short. Min length is ${min_length}.`,
- },
- 'already_in_use': {
- status: 409,
- message: ({ what, value }) => `The ${what} ${quot(value)} is already in use.`,
- },
- 'invalid_file_name': {
- status: 400,
- message: ({ name, reason }) => `Invalid file name: ${quot(name)}${reason ? `; ${reason}` : '.'}`,
- },
- 'storage_limit_reached': {
- status: 400,
- message: 'Storage capacity limit reached.',
- },
- 'internal_error': {
- status: 500,
- message: 'An internal error occurred.',
- },
- 'response_timeout': {
- status: 504,
- message: 'Response timed out.',
- },
- 'file_too_large': {
- status: 413,
- message: ({ max_size }) => `File too large. Max size is ${max_size} bytes.`,
- },
- 'thumbnail_too_large': {
- status: 413,
- message: ({ max_size }) => `Thumbnail too large. Max size is ${max_size} bytes.`,
- },
- 'upload_failed': {
- status: 500,
- message: 'Upload failed.',
- },
- 'missing_expected_metadata': {
- status: 400,
- message: ({ keys }) => `These fields must come first: ${(keys ?? []).map(quot).join(', ')}.`,
- },
- 'overwrite_and_dedupe_exclusive': {
- status: 400,
- message: 'Cannot specify both overwrite and dedupe_name.',
- },
- 'not_empty': {
- status: 422,
- message: 'Directory is not empty.',
- },
-
- // Write
- 'offset_without_existing_file': {
- status: 404,
- message: 'An offset was specified, but the file doesn\'t exist.',
- },
- 'offset_requires_overwrite': {
- status: 400,
- message: 'An offset was specified, but overwrite conditions were not met.',
- },
- 'offset_requires_stream': {
- status: 400,
- message: 'The offset option for write is not available for this upload.'
- },
-
- // Batch
- 'batch_too_many_files': {
- status: 400,
- message: 'Received an extra file with no corresponding operation.',
- },
- 'batch_missing_file': {
- status: 400,
- message: 'Missing fileinfo entry or BLOB for operation.',
- },
-
- // Open
- 'no_suitable_app': {
- status: 422,
- message: ({ entry_name }) => `No suitable app found for ${quot(entry_name)}.`,
- },
- 'app_does_not_exist': {
- status: 422,
- message: ({ identifier }) => `App ${quot(identifier)} does not exist.`,
- },
-
- // Apps
- 'app_name_already_in_use': {
- status: 409,
- message: ({ name }) => `App name ${quot(name)} is already in use.`,
- },
-
- // Subdomains
- 'subdomain_limit_reached': {
- status: 400,
- message: ({ limit }) => `You have exceeded the number of subdomains under your current plan (${limit}).`,
- },
- 'subdomain_reserved': {
- status: 400,
- message: ({ subdomain }) => `Subdomain ${quot(subdomain)} is not available.`,
- },
-
- // Users
- 'email_already_in_use': {
- status: 409,
- message: ({ email }) => `Email ${quot(email)} is already in use.`,
- },
- 'username_already_in_use': {
- status: 409,
-
- message: ({ username }) => `Username ${quot(username)} is already in use.`,
- },
- 'too_many_username_changes': {
- status: 429,
- message: 'Too many username changes this month.',
- },
- 'token_invalid': {
- status: 400,
- message: () => 'Invalid token.',
- },
-
- // drivers
- 'interface_not_found': {
- status: 404,
- message: ({ interface_name }) => `Interface not found: ${quot(interface_name)}`,
- },
- 'no_implementation_available': {
- status: 502,
- message: ({ interface_name }) => `No implementation available for interface ${quot(interface_name)}`,
- },
- 'method_not_found': {
- status: 404,
- message: ({ interface_name, method_name }) => `Method not found: ${quot(method_name)} on interface ${quot(interface_name)}`,
- },
- 'missing_required_argument': {
- status: 400,
- message: ({ interface_name, method_name, arg_name }) =>
- `Missing required argument ${quot(arg_name)} for method ${quot(method_name)} on interface ${quot(interface_name)}`,
- },
- 'argument_consolidation_failed': {
- status: 400,
- message: ({ interface_name, method_name, arg_name, message }) =>
- `Failed to parse or process argument ${quot(arg_name)} for method ${quot(method_name)} on interface ${quot(interface_name)}: ${message}`,
- },
-
- // SLA
- 'rate_limit_exceeded': {
- status: 429,
- message: ({ method_name, rate_limit }) =>
- `Rate limit exceeded for method ${quot(method_name)}: ${rate_limit.max} requests per ${rate_limit.period}ms.`,
- },
- 'monthly_limit_exceeded': {
- status: 429,
- message: ({ method_key, limit }) =>
- `Monthly limit exceeded for method ${quot(method_key)}: ${limit} requests per month.`,
- },
- 'server_rate_exceeded': {
- status: 503,
- message: 'System-wide rate limit exceeded. Please try again later.',
- },
-
- // auth
- 'token_missing': {
- status: 401,
- message: 'Missing authentication token.',
- },
- 'token_auth_failed': {
- status: 401,
- message: 'Authentication failed.',
- },
- 'token_unsupported': {
- status: 401,
- message: 'This authentication token is not supported here.',
- },
- 'account_suspended': {
- status: 403,
- message: 'Account suspended.',
- },
- 'permission_denied': {
- status: 403,
- message: 'Permission denied.',
- },
- 'access_token_empty_permissions': {
- status: 403,
- message: 'Attempted to create an access token with no permissions.',
- },
-
- // Object Mapping
- 'field_not_allowed_for_create': {
- status: 400,
- message: ({ key }) => `Field ${quot(key)} is not allowed for create.`,
- },
- 'field_required_for_update': {
- status: 400,
- message: ({ key }) => `Field ${quot(key)} is required for update.`,
- },
- 'entity_not_found': {
- status: 422,
- message: ({ identifier }) => `Entity not found: ${quot(identifier)}`,
- },
-
- // Chat
- // TODO: specifying these errors here might be a violation
- // of separation of concerns. Services could register their
- // own errors with an error registry.
- 'max_tokens_exceeded': {
- status: 400,
- message: ({ input_tokens, max_tokens }) =>
- `Input exceeds maximum token count. ` +
- `Input has ${input_tokens} tokens, ` +
- `but the maximum is ${max_tokens}.`,
- },
- };
-
- /**
- * create() is a factory method for creating APIError instances.
- * It accepts either a string or an Error object as the second
- * argument. If a string is passed, it is used as the error message.
- * If an Error object is passed, its message property is used as the
- * error message. The Error object itself is stored in the source
- * property. If no second argument is passed, the source property
- * is set to null. The first argument is used as the status code.
- *
- * @static
- * @param {number} status
- * @param {string|Error} message_or_source one of the following:
- * - a string to use as the error message
- * - an Error object to use as the source of the error
- * - an object with a message property to use as the error message
- * @returns
- */
- static create (status, source, fields = {}) {
- // Just the error code
- if ( typeof status === 'string' ) {
- const code = this.codes[status];
- if ( ! code ) {
- return new APIError(500, 'Missing error message.', null, {
- code: status
- });
- }
- return new APIError(code.status, status, source, fields);
- }
-
- // High-level errors like this: APIError.create(400, '...')
- if ( typeof source === 'string' ) {
- return new APIError(status, source, null, fields);
- }
-
- // Errors from source like this: throw new Error('...')
- if (
- typeof source === 'object' &&
- source instanceof Error
- ) {
- return new APIError(status, source?.message, source, fields);
- }
-
- // Errors from sources like this: throw { message: '...', ... }
- if (
- typeof source === 'object' &&
- source.constructor.name === 'Object' &&
- source.hasOwnProperty('message')
- ) {
- const allfields = { ...source, ...fields };
- return new APIError(status, source.message, source, allfields);
- }
-
- console.error('Invalid APIError source:', source);
- return new APIError(500, 'Internal Server Error', null, {});
- }
- static adapt (err) {
- if ( err instanceof APIError ) return err;
-
- return APIError.create(`internal_error`);
- }
- constructor (status, message, source, fields = {}) {
- this.codes = this.constructor.codes;
- this.status = status;
- this._message = message;
- this.source = source ?? new Error('error for trace');
- this.fields = fields;
-
- if ( this.codes.hasOwnProperty(message) ) {
- this.fields.code = message;
- this._message = this.codes[message].message;
- }
- }
- write (res) {
- const message = typeof this.message === 'function'
- ? this.message(this.fields)
- : this.message;
- return res.status(this.status).send({
- message,
- ...this.fields,
- });
- }
- serialize () {
- console.log('MESSAGE FROM ERROR: ' + `|${this.message}|`);
- return {
- ...this.fields,
- $: 'heyputer:api/APIError',
- message: this.message,
- status: this.status,
- };
- }
-
- get message () {
- const message = typeof this._message === 'function'
- ? this._message(this.fields)
- : this._message;
- return message;
- }
-
- toString () {
- return `APIError(${this.status}, ${this.message})`;
- }
-}
diff --git a/packages/backend/src/api/api_error_handler.js b/packages/backend/src/api/api_error_handler.js
deleted file mode 100644
index 56cc79a62f..0000000000
--- a/packages/backend/src/api/api_error_handler.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("./APIError");
-
-/**
- * api_error_handler() is an express error handler for API errors.
- * It adheres to the express error handler signature and should be
- * used as the last middleware in an express app.
- *
- * Since Express 5 is not yet released, this function is used by
- * eggspress() to handle errors instead of as a middleware.
- *
- * @todo remove this function and use express error handling
- * when Express 5 is released
- *
- * @param {*} err
- * @param {*} req
- * @param {*} res
- * @param {*} next
- * @returns
- */
-module.exports = function (err, req, res, next) {
- if (res.headersSent) {
- console.error('error after headers were sent:', err);
- return next(err)
- }
-
- // API errors might have a response to help the
- // developer resolve the issue.
- if ( err instanceof APIError ) {
- return err.write(res);
- }
-
- if (
- typeof err === 'object' &&
- ! (err instanceof Error) &&
- err.hasOwnProperty('message')
- ) {
- const apiError = APIError.create(400, err);
- return apiError.write(res);
- }
-
- console.error('internal server error:', err);
-
- const services = globalThis.services;
- if ( services && services.has('alarm') ) {
- const alarm = services.get('alarm');
- alarm.create('api_error_handler', err.message, {
- error: err,
- url: req.url,
- method: req.method,
- body: req.body,
- headers: req.headers,
- });
- }
-
- req.__error_handled = true;
-
- // Other errors should provide as little information
- // to the client as possible for security reasons.
- return res.send(500, 'Internal Server Error');
-};
diff --git a/packages/backend/src/api/eggspress.js b/packages/backend/src/api/eggspress.js
deleted file mode 100644
index fca0bbf98c..0000000000
--- a/packages/backend/src/api/eggspress.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const express = require('express');
-const multer = require('multer');
-const multest = require('@heyputer/multest');
-const api_error_handler = require('../api/api_error_handler.js');
-
-const fsBeforeMW = require('../middleware/fs');
-const APIError = require('./APIError.js');
-const { Context } = require('../util/context.js');
-
-/**
- * eggspress() is a factory function for creating express routers.
- *
- * @param {*} route the route to the router
- * @param {*} settings the settings for the router. The following
- * properties are supported:
- * - auth: whether or not to use the auth middleware
- * - fs: whether or not to use the fs middleware
- * - json: whether or not to use the json middleware
- * - customArgs: custom arguments to pass to the router
- * - allowedMethods: the allowed HTTP methods
- * @param {*} handler the handler for the router
- * @returns {express.Router} the router
- */
-module.exports = function eggspress (route, settings, handler) {
- const router = express.Router();
- const mw = [];
- const afterMW = [];
-
- // These flags enable specific middleware.
- if ( settings.abuse ) mw.push(require('../middleware/abuse')(settings.abuse));
- if ( settings.auth ) mw.push(require('../middleware/auth'));
- if ( settings.auth2 ) mw.push(require('../middleware/auth2'));
- if ( settings.fs ) {
- mw.push(fsBeforeMW);
- }
- if ( settings.verified ) mw.push(require('../middleware/verified'));
- if ( settings.json ) mw.push(express.json());
-
- // The `files` setting is an array of strings. Each string is the name
- // of a multipart field that contains files. `multer` is used to parse
- // the multipart request and store the files in `req.files`.
- if ( settings.files ) {
- for ( const key of settings.files ) {
- mw.push(multer().array(key));
- }
- }
-
- if ( settings.multest ) {
- mw.push(multest());
- }
-
- // The `multipart_jsons` setting is an array of strings. Each string
- // is the name of a multipart field that contains JSON. This middleware
- // parses the JSON in each field and stores the result in `req.body`.
- if ( settings.multipart_jsons ) {
- for ( const key of settings.multipart_jsons ) {
- mw.push((req, res, next) => {
- try {
- if ( ! Array.isArray(req.body[key]) ) {
- req.body[key] = [JSON.parse(req.body[key])];
- } else {
- req.body[key] = req.body[key].map(JSON.parse);
- }
- } catch (e) {
- return res.status(400).send({
- error: {
- message: `Invalid JSON in multipart field ${key}`
- }
- });
- }
- next();
- });
- }
- }
-
- // The `alias` setting is an object. Each key is the name of a
- // parameter. Each value is the name of a parameter that should
- // be aliased to the key.
- if ( settings.alias ) {
- for ( const alias in settings.alias ) {
- const target = settings.alias[alias];
- mw.push((req, res, next) => {
- const values = req.method === 'GET' ? req.query : req.body;
- if ( values[alias] ) {
- values[target] = values[alias];
- }
- next();
- });
- }
- }
-
- // The `parameters` setting is an object. Each key is the name of a
- // parameter. Each value is a `Param` object. The `Param` object
- // specifies how to validate the parameter.
- if ( settings.parameters ) {
- for ( const key in settings.parameters ) {
- const param = settings.parameters[key];
- mw.push(async (req, res, next) => {
- if ( ! req.values ) req.values = {};
-
- const values = req.method === 'GET' ? req.query : req.body;
- const getParam = (key) => values[key];
- try {
- const result = await param.consolidate({ req, getParam });
- req.values[key] = result;
- } catch (e) {
- api_error_handler(e, req, res, next);
- return;
- }
- next();
- });
- }
- }
-
- // what if I wanted to pass arguments to, for example, `json`?
- if ( settings.customArgs ) mw.push(settings.customArgs);
-
- if ( settings.alarm_timeout ) {
- mw.push((req, res, next) => {
- setTimeout(() => {
- if ( ! res.headersSent ) {
- const log = req.services.get('log-service').create('eggspress:timeout');
- const errors = req.services.get('error-service').create(log);
- let id = Array.isArray(route) ? route[0] : route;
- id = id.replace(/\//g, '_');
- errors.report(id, {
- source: new Error('Response timed out.'),
- message: 'Response timed out.',
- trace: true,
- alarm: true,
- });
- }
- }, settings.alarm_timeout);
- next();
- });
- }
-
- if ( settings.response_timeout ) {
- mw.push((req, res, next) => {
- setTimeout(() => {
- if ( ! res.headersSent ) {
- api_error_handler(APIError.create('response_timeout'), req, res, next);
- }
- }, settings.response_timeout);
- next();
- });
- }
-
- if ( settings.mw ) mw.push(...settings.mw);
-
- const errorHandledHandler = async function (req, res, next) {
- if ( settings.subdomain ) {
- if ( require('../helpers').subdomain(req) !== settings.subdomain ) {
- return next();
- }
- }
- try {
- const expected_ctx = res.locals.ctx;
- const received_ctx = Context.get(undefined, { allow_fallback: true });
-
- if ( expected_ctx != received_ctx ) {
- await expected_ctx.arun(async () => {
- await handler(req, res, next);
- });
- } else await handler(req, res, next);
- } catch (e) {
- api_error_handler(e, req, res, next);
- }
- };
-
- if ( settings.allowedMethods.includes('GET') ) {
- router.get(route, ...mw, errorHandledHandler, ...afterMW);
- }
-
- if ( settings.allowedMethods.includes('POST') ) {
- router.post(route, ...mw, errorHandledHandler, ...afterMW);
- }
-
- return router;
-}
\ No newline at end of file
diff --git a/packages/backend/src/api/filesystem/FSNodeParam.js b/packages/backend/src/api/filesystem/FSNodeParam.js
deleted file mode 100644
index 5097c8a6f7..0000000000
--- a/packages/backend/src/api/filesystem/FSNodeParam.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { is_valid_path } = require("../../filesystem/validation");
-const { is_valid_uuid4 } = require("../../helpers");
-const { Context } = require("../../util/context");
-const APIError = require("../APIError");
-const _path = require('path');
-
-module.exports = class FSNodeParam {
- constructor (srckey, options) {
- this.srckey = srckey;
- this.options = options ?? {};
- this.optional = this.options.optional ?? false;
- }
-
- async consolidate ({ req, getParam }) {
- const log = globalThis.services.get('log-service').create('fsnode-param');
- const fs = req.fs ?? Context.get('services').get('filesystem');
-
- let uidOrPath = getParam(this.srckey);
- if ( uidOrPath === undefined ) {
- if ( this.optional ) return undefined;
- throw APIError.create('field_missing', null, {
- key: this.srckey,
- });
- }
-
- if ( uidOrPath.length === 0 ) {
- if ( this.optional ) return undefined;
- APIError.create('field_empty', null, {
- key: this.srckey,
- });
- }
-
- if ( ! ['/','.','~'].includes(uidOrPath[0]) ) {
- if ( is_valid_uuid4(uidOrPath) ) {
- return await fs.node({ uid: uidOrPath });
- }
-
- log.debug('tried uuid', { uidOrPath })
- throw APIError.create('field_invalid', null, {
- key: this.srckey,
- expected: 'unix-style path or uuid4',
- });
- }
-
- if ( uidOrPath.startsWith('~') && req.user ) {
- const homedir = `/${req.user.username}`;
- uidOrPath = homedir + uidOrPath.slice(1);
- }
-
- if ( ! is_valid_path(uidOrPath) ) {
- log.debug('tried path', { uidOrPath })
- throw APIError.create('field_invalid', null, {
- key: this.srckey,
- expected: 'unix-style path or uuid4',
- });
- }
-
- return await fs.node({ path: _path.resolve('/', uidOrPath) });
- }
-}
\ No newline at end of file
diff --git a/packages/backend/src/app.js b/packages/backend/src/app.js
deleted file mode 100644
index 9f4b8afe92..0000000000
--- a/packages/backend/src/app.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-"use strict"
diff --git a/packages/backend/src/boot/BootLogger.js b/packages/backend/src/boot/BootLogger.js
deleted file mode 100644
index a5ce5a7eaa..0000000000
--- a/packages/backend/src/boot/BootLogger.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-class BootLogger {
- constructor () {
- console.log(
- `\x1B[36;1mBoot logger started :)\x1B[0m`,
- );
- }
- info (...args) {
- console.log(
- '\x1B[36;1m[BOOT/INFO]\x1B[0m',
- ...args,
- );
- }
- error (...args) {
- console.log(
- '\x1B[31;1m[BOOT/ERROR]\x1B[0m',
- ...args,
- );
- }
-}
-
-module.exports = {
- BootLogger,
-};
diff --git a/packages/backend/src/boot/RuntimeEnvironment.js b/packages/backend/src/boot/RuntimeEnvironment.js
deleted file mode 100644
index 9686946460..0000000000
--- a/packages/backend/src/boot/RuntimeEnvironment.js
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-const { quot } = require("../util/strutil");
-const { TechnicalError } = require("../errors/TechnicalError");
-const { print_error_help } = require("../errors/error_help_details");
-const default_config = require("./default_config");
-const config = require("../config");
-const { ConfigLoader } = require("../config/ConfigLoader");
-
-// highlights a string
-const hl = s => `\x1b[33;1m${s}\x1b[0m`;
-
-// Save the original working directory
-const original_cwd = process.cwd();
-
-// === [ Puter Runtime Environment ] ===
-// This file contains the RuntimeEnvironment class which is
-// responsible for locating the configuration and runtime
-// directories for the Puter Kernel.
-
-// Depending on which path we're checking for configuration
-// or runtime from config_paths, there will be different
-// requirements. These are all possible requirements.
-//
-// Each check may result in the following:
-// - false: this is not the desired path; skip it
-// - true: this is the desired path, and it's valid
-// - throw: this is the desired path, but it's invalid
-const path_checks = ({ logger }) => ({ fs, path_ }) => ({
- require_if_not_undefined: ({ path }) => {
- if ( path == undefined ) return false;
-
- const exists = fs.existsSync(path);
- if ( !exists ) {
- throw new Error(`Path does not exist: ${path}`);
- }
-
- return true;
- },
- skip_if_not_exists: ({ path }) => {
- const exists = fs.existsSync(path);
- return exists;
- },
- skip_if_not_in_repo: ({ path }) => {
- const exists = fs.existsSync(path_.join(path, '../../.is_puter_repository'));
- return exists;
- },
- require_read_permission: ({ path }) => {
- try {
- fs.readdirSync(path);
- } catch (e) {
- throw new Error(`Cannot readdir on path: ${path}`);
- }
- return true;
- },
- require_write_permission: ({ path }) => {
- try {
- fs.writeFileSync(path_.join(path, '.tmp_test_write_permission'), 'test');
- fs.unlinkSync(path_.join(path, '.tmp_test_write_permission'));
- } catch (e) {
- throw new Error(`Cannot write to path: ${path}`);
- }
- return true;
- },
- contains_config_file: ({ path }) => {
- const valid_config_names = [
- 'config.json',
- 'config.json5',
- ];
- for ( const name of valid_config_names ) {
- const exists = fs.existsSync(path_.join(path, name));
- if ( exists ) {
- return true;
- }
- }
- throw new Error(`No valid config file found in path: ${path}`);
- },
- env_not_set: name => () => {
- if ( process.env[name] ) return false;
- return true;
- }
-});
-
-// Configuration paths in order of precedence.
-// We will load configuration from the first path that's suitable.
-const config_paths = ({ path_checks }) => ({ path_ }) => [
- {
- label: '$CONFIG_PATH',
- get path () { return process.env.CONFIG_PATH },
- checks: [
- path_checks.require_if_not_undefined,
- ],
- },
- {
- path: '/etc/puter',
- checks: [ path_checks.skip_if_not_exists ],
- },
- {
- get path () {
- return path_.join(original_cwd, 'volatile/config');
- },
- checks: [ path_checks.skip_if_not_in_repo ],
- },
- {
- get path () {
- return path_.join(original_cwd, 'config');
- },
- checks: [ path_checks.skip_if_not_exists ],
- },
-];
-
-const valid_config_names = [
- 'config.json',
- 'config.json5',
-];
-
-// Suitable working directories in order of precedence.
-// We will `process.chdir` to the first path that's suitable.
-const runtime_paths = ({ path_checks }) => ({ path_ }) => [
- {
- label: '$RUNTIME_PATH',
- get path () { return process.env.RUNTIME_PATH },
- checks: [
- path_checks.require_if_not_undefined,
- ],
- },
- {
- path: '/var/puter',
- checks: [
- path_checks.skip_if_not_exists,
- path_checks.env_not_set('NO_VAR_RUNTIME'),
- ],
- },
- {
- get path () {
- return path_.join(original_cwd, 'volatile/runtime');
- },
- checks: [ path_checks.skip_if_not_in_repo ],
- },
- {
- get path () {
- return path_.join(original_cwd, 'runtime');
- },
- checks: [ path_checks.skip_if_not_exists ],
- },
-];
-
-class RuntimeEnvironment extends AdvancedBase {
- static MODULES = {
- fs: require('node:fs'),
- path_: require('node:path'),
- crypto: require('node:crypto'),
- }
-
- constructor ({ logger }) {
- super();
- this.logger = logger;
- this.path_checks = path_checks(this)(this.modules);
- this.config_paths = config_paths(this)(this.modules);
- this.runtime_paths = runtime_paths(this)(this.modules);
- }
-
- init () {
- try {
- this.init_();
- } catch (e) {
- this.logger.error(e);
- print_error_help(e);
- process.exit(1);
- }
- }
-
- init_ () {
- const config_path_entry = this.get_first_suitable_path_(
- { pathFor: 'configuration' },
- this.config_paths,
- [
- this.path_checks.require_read_permission,
- // this.path_checks.contains_config_file,
- ]
- );
-
- const pwd_path_entry = this.get_first_suitable_path_(
- { pathFor: 'working directory' },
- this.runtime_paths,
- [ this.path_checks.require_write_permission ]
- );
-
- process.chdir(pwd_path_entry.path);
-
- // Check for a valid config file in the config path
- let using_config;
- for ( const name of valid_config_names ) {
- const exists = this.modules.fs.existsSync(
- this.modules.path_.join(config_path_entry.path, name)
- );
- if ( exists ) {
- using_config = name;
- break;
- }
- }
-
- const { fs, path_, crypto } = this.modules;
- let config_values = {};
- if ( !using_config ) {
- const generated_config = {
- ...default_config,
- };
- generated_config.cookie_name = crypto.randomUUID();
- generated_config.jwt_secret = crypto.randomUUID();
- generated_config.url_signature_secret = crypto.randomUUID();
- generated_config[""] = null; // for trailing comma
- fs.writeFileSync(
- path_.join(config_path_entry.path, 'config.json'),
- JSON.stringify(generated_config, null, 4) + '\n',
- );
- using_config = 'config.json';
- }
-
- let config_to_load = 'config.json';
- if ( process.env.PUTER_CONFIG_PROFILE ) {
- this.logger.info(
- hl('PROFILE') + ' ' +
- quot(process.env.PUTER_CONFIG_PROFILE) + ' ' +
- `because $PUTER_CONFIG_PROFILE is set`
- );
- config_to_load = `${process.env.PUTER_CONFIG_PROFILE}.json`
- const exists = fs.existsSync(
- path_.join(config_path_entry.path, config_to_load)
- );
- if ( ! exists ) {
- fs.writeFileSync(
- path_.join(config_path_entry.path, config_to_load),
- JSON.stringify({
- config_name: process.env.PUTER_CONFIG_PROFILE,
- $imports: ['config.json'],
- }, null, 4) + '\n',
- );
- }
- }
-
- const loader = new ConfigLoader(this.logger, config_path_entry.path, config);
- loader.enable(config_to_load);
-
- if ( ! config.config_name ) {
- throw new Error('config_name is required');
- }
- this.logger.info(hl(`config name`) + ` ${quot(config.config_name)}`);
- // console.log(config.services);
- // console.log(Object.keys(config.services));
- // console.log({ ...config.services });
- }
-
- get_first_suitable_path_ (meta, paths, last_checks) {
- iter_paths:
- for ( const entry of paths ) {
- const checks = [...(entry.checks ?? []), ...last_checks];
- this.logger.info(
- `Checking path ${quot(entry.label ?? entry.path)} for ${meta.pathFor}...`
- );
- for ( const check of checks ) {
- this.logger.info(
- `-> doing ${quot(check.name)} on path ${quot(entry.path)}...`
- );
- const result = check(entry);
- if ( result === false ) {
- this.logger.info(
- `-> ${quot(check.name)} doesn't like this path`
- );
- continue iter_paths;
- }
- }
-
- this.logger.info(
- `${hl('USING')} ${quot(entry.path)} for ${meta.pathFor}.`
- )
-
- return entry;
- }
-
- throw new TechnicalError(`No suitable path found for ${meta.pathFor}.`);
- }
-}
-
-module.exports = {
- RuntimeEnvironment,
-};
\ No newline at end of file
diff --git a/packages/backend/src/codex/CodeModel.js b/packages/backend/src/codex/CodeModel.js
deleted file mode 100644
index d771621ca0..0000000000
--- a/packages/backend/src/codex/CodeModel.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-class CodeModel {
- static create () {}
-}
-
-module.exports = {
- CodeModel,
-};
diff --git a/packages/backend/src/codex/Sequence.js b/packages/backend/src/codex/Sequence.js
deleted file mode 100644
index 4a8b2c51c6..0000000000
--- a/packages/backend/src/codex/Sequence.js
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-/**
- * Sequence is a callable object that executes a series of functions in order.
- * The functions are expected to be asynchronous; if they're not it might still
- * work, but it's neither tested nor supported.
- *
- * Note: arrow functions are supported, but they are not recommended;
- * using keyword functions allows each step to be named.
- *
- * Example usage:
- *
- * const seq = new Sequence([
- * async function set_foo (a) {
- * a.set('foo', 'bar')
- * },
- * async function print_foo (a) {
- * console.log(a.get('foo'));
- * },
- * async function third_step (a) {
- * // do something
- * },
- * ]);
- *
- * await seq();
- *
- * Example with controlled conditional branches:
- *
- * const seq = new Sequence([
- * async function first_step (a) {
- * // do something
- * },
- * {
- * condition: async a => a.get('foo') === 'bar',
- * fn: async function second_step (a) {
- * // do something
- * }
- * },
- * async function third_step (a) {
- * // do something
- * },
- * ]);
- *
- * If it is called with an argument, it must be an object containing values
- * which will populate the "sequence scope".
- *
- * If it is called on an instance with a member called `values`
- * (i.e. if `this.values` is defined), then these values will populate the
- * sequence scope. This is to maintain compatibility for Sequence to be used
- * as an implementation of a runnable class. (See CodeUtil.mrwrap or BaseOperation)
- *
- * The object returned by the constructor is a function, which is used to
- * make the object callable. The callable object will execute the sequence
- * when called. The return value of the sequence is the return value of the
- * last function in the sequence.
- *
- * Each function in the sequence is passed a SequenceState object
- * as its first argument. Conventionally, this argument is called `a`,
- * which is short for either "API", "access", or "the `a` variable"
- * depending on which you prefer. Sequence provides methods for accessing
- * the sequence scope.
- *
- * By accessing the sequence scope through the `a` variable, changes to the
- * sequence scope can be monitored and recorded. (TODO: implement observe methods)
- */
-class Sequence {
- /**
- * A SequenceState is created each time a Sequence is called.
- */
- static SequenceState = class SequenceState {
- constructor (sequence, thisArg) {
- if ( typeof sequence === 'function' ) {
- sequence = sequence.sequence;
- }
-
- this.sequence_ = sequence;
- this.thisArg = thisArg;
- this.steps_ = null;
- this.value_history_ = [];
- this.scope_ = {};
- this.last_return_ = undefined;
- this.i = 0;
- this.stopped_ = false;
-
- this.defer_ptr_ = undefined;
- this.defer = this.constructor.defer_0;
- }
-
- get steps () {
- return this.steps_ ?? this.sequence_.steps_;
- }
-
- async run (values) {
- // Initialize scope
- values = values || this.thisArg?.values || {};
- Object.assign(this.scope_, values); // TODO: can this be __proto__?
-
- // Run sequence
- for ( ; this.i < this.steps.length ; this.i++ ) {
- let step = this.steps[this.i];
- if ( typeof step !== 'object' ) step = {
- name: step.name,
- fn: step,
- };
-
- if ( step.condition && ! await step.condition(this) ) {
- continue;
- }
-
- const parent_scope = this.scope_;
- this.scope_ = {};
- // We could do Object.assign(this.scope_, parent_scope), but
- // setting __proto__ is faster because it leverages the optimizations
- // of the JS engine for the prototype chain.
- this.scope_.__proto__ = parent_scope;
-
- if ( this.sequence_.options_.record_history ) {
- this.value_history_.push(this.scope_);
- }
-
- if ( this.sequence_.options_.before_each ) {
- await this.sequence_.options_.before_each(this, step);
- }
-
- this.last_return_ = await step.fn(this);
- if ( this.stopped_ ) {
- break;
- }
- }
- }
-
- // Why check a condition every time code is called,
- // when we can check it once and then replace the code?
-
- // defer_0: the first time defer is called, a copy of the sequence
- // steps is made, and defer is replaced with defer_1 and called.
- static defer_0 = function (fn) {
- this.steps_ = [...this.sequence_.steps_];
- this.defer = this.constructor.defer_1;
- this.defer_ptr_ = this.steps_.length;
- this.defer(fn);
- }
- // defer_1: subsequent calls to defer are delegated to defer_2,
- // which pushes the given value to the sequence state's steps.
- static defer_1 = function (fn) {
- // Deferred functions don't affect the return value
- const real_fn = fn;
- fn = async () => {
- await real_fn(this);
- return this.last_return_;
- };
-
- // Suppose we want to defer a function called `g'`
- // given the following state of the sequence:
- // [a, b, c, d, f', e']
- // where `'` indicates a deferred step, `f'` is the item pointed
- // to by `defer_ptr_`;
- // We want to insert `g'` immediately before `f'`
-
- this.steps_.splice(this.defer_ptr_, 0, fn);
- }
-
- get (k) {
- // TODO: record read1
- return this.scope_[k];
- }
-
- set (k, v) {
- // TODO: record mutation
- this.scope_[k] = v;
- }
-
- values () {
- return new Proxy(this.scope_, {
- get: (target, property) => {
- if (property in target) {
- // TODO: record read
- return target[property];
- }
- return undefined;
- }
- });
- }
-
- iget (k) {
- if ( k === undefined ) return this.thisArg;
- return this.thisArg?.[k];
- }
-
- get log () {
- return this.iget('log');
- }
-
- stop (return_value) {
- this.stopped_ = true;
- return return_value;
- }
- }
-
- constructor(...args) {
- const sequence = this;
-
- const steps = [];
- const options = {};
-
- for ( const arg of args ) {
- if ( Array.isArray(arg) ) {
- steps.push(...arg);
- } else if ( typeof arg === 'object' ) {
- Object.assign(options, arg);
- } else if ( typeof arg === 'function' ) {
- steps.push(arg);
- } else {
- throw new TypeError(`Invalid argument to Sequence constructor: ${arg}`);
- }
- }
-
- const fn = async function () {
- const state = new Sequence.SequenceState(sequence, this);
- await state.run();
- return state.last_return_;
- }
-
- this.steps_ = steps;
- this.options_ = options || {};
-
- Object.defineProperty(fn, 'name', { value: 'Sequence' });
- Object.defineProperty(fn, 'sequence', { value: this });
-
- return fn;
- }
-}
-
-module.exports = {
- Sequence
-};
diff --git a/packages/backend/src/config.js b/packages/backend/src/config.js
deleted file mode 100644
index 55b13fadc5..0000000000
--- a/packages/backend/src/config.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-"use strict"
-const deep_proto_merge = require('./config/deep_proto_merge');
-// const reserved_words = require('./config/reserved_words');
-
-let config = {};
-
-// Static defaults
-config.servers = [];
-
-config.max_file_size = 100_000_000_000,
-config.max_thumb_size = 1_000,
-config.max_fsentry_name_length = 767,
-
-config.username_regex = /^\w{1,}$/;
-config.username_max_length = 45;
-config.subdomain_regex = /^[a-zA-Z0-9-_-]+$/;
-config.subdomain_max_length = 60;
-config.app_name_regex = /^[a-zA-Z0-9-_-]+$/;
-config.app_name_max_length = 60;
-config.app_title_max_length = 60;
-config.min_pass_length = 6;
-
-config.strict_email_verification_required = false,
-config.require_email_verification_to_publish_website = false,
-
-config.kv_max_key_size = 1024,
-config.kv_max_value_size = 400 * 1024,
-
-config.monitor = {
- metricsInterval: 60000,
- windowSize: 30,
-};
-
-config.max_subdomains_per_user = 2000;
-config.storage_capacity = 1*1024*1024*1024;
-config.static_hosting_domain = '-static.puter.local';
-
-// Storage limiting is set to false by default
-// Storage available on the mountpoint/drive puter is running is the storage available
-config.is_storage_limited = false;
-config.available_device_storage = null;
-
-config.thumb_width = 80;
-config.thumb_height = 80;
-config.app_max_icon_size = 5*1024*1024;
-
-// config.origin = config.protocol + '://' + config.domain;
-// config.api_base_url = config.protocol + '://api.' + config.domain;
-// config.social_card = `${config.origin}/assets/img/screenshot.png`;
-config.short_description = `Puter is a privacy-first personal cloud that houses all your files, apps, and games in one private and secure place, accessible from anywhere at any time.`;
-config.title = 'Puter';
-config.company = 'Puter Technologies Inc.';
-
-config.puter_hosted_data = {
- puter_versions: 'https://version.puter.site/puter_versions.json',
-};
-
-{
- const path_ = require('path');
- config.assets = {
- gui: path_.join(__dirname, '../../..'),
- };
-}
-
-// words that cannot be used by others as subdomains or app names
-// config.reserved_words = reserved_words;
-config.reserved_words = [];
-
-// set default S3 settings for this server, if any
-if (config.server_id) {
- // see if this server has a specific bucket
- for (let index = 0; index < config.servers.length; index++) {
- if (config.servers[index].id === config.server_id && config.servers[index].s3_bucket){
- config.s3_bucket = config.servers[index].s3_bucket;
- config.s3_region = config.servers[index].region;
- }
- }
-}
-
-config.contact_email = 'hey@' + config.domain;
-
-// TODO: default value will be changed to false in a future release;
-// details to follow in a future announcement.
-config.legacy_token_migrate = true;
-
-module.exports = config;
-
-// NEW_CONFIG_LOADING
-
-const computed_defaults = {
- pub_port: config => config.http_port,
- origin: config => config.protocol + '://' + config.domain +
- (config.pub_port !== 80 && config.pub_port !== 443 ? ':' + config.pub_port : ''),
- api_base_url: config => config.experimental_no_subdomain
- ? config.origin
- : config.protocol + '://api.' + config.domain +
- (config.pub_port !== 80 && config.pub_port !== 443 ? ':' + config.pub_port : ''),
- social_card: config => `${config.origin}/assets/img/screenshot.png`,
-};
-
-// We're going to export a config object that's decorated
-// with additional behavior
-let config_to_export;
-
-// We have a pointer to some config object which
-// load_config() may replace
-const config_pointer = {};
-{
- config_pointer.__proto__ = config;
- config_to_export = config_pointer;
-}
-
-
-// We have some methods that can be called on `config`
-{
- // Add configuration values with precedence over the current config
- const load_config = o => {
- let replacement_config = {
- ...o,
- };
- // replacement_config.__proto__ = config_pointer.__proto__;
- replacement_config = deep_proto_merge(replacement_config, config_pointer.__proto__, {
- preserve_flag: true,
- })
- config_pointer.__proto__ = replacement_config;
- };
-
- const config_api = { load_config };
- config_api.__proto__ = config_to_export;
- config_to_export = config_api;
-}
-
-// We have some values with computed defaults
-{
- const get_implied = (target, prop) => {
- if (prop in computed_defaults) {
- return computed_defaults[prop](target);
- }
- return undefined;
- };
- config_to_export = new Proxy(config_to_export, {
- get: (target, prop, receiver) => {
- if (prop in target) {
- return target[prop];
- } else {
- // console.log('implied', prop,
- // 'to', get_implied(config_to_export, prop));
- return get_implied(config_to_export, prop);
- }
- }
- })
-}
-
-// We'd like to store values changed at runtime separately
-// for easier runtime debugging
-{
- const config_runtime_values = {};
- config_runtime_values.__proto__ = config_to_export;
- config_to_export = config_runtime_values
-}
-
-module.exports = config_to_export;
\ No newline at end of file
diff --git a/packages/backend/src/connective/data_model.js b/packages/backend/src/connective/data_model.js
deleted file mode 100644
index eaa8e55bc2..0000000000
--- a/packages/backend/src/connective/data_model.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-{
- registries: {
- type: {
- description: 'high-level types'
- }
- }
-}
diff --git a/packages/backend/src/connective/registry.js b/packages/backend/src/connective/registry.js
deleted file mode 100644
index 1e45aa3a93..0000000000
--- a/packages/backend/src/connective/registry.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-class Registry {
- constructor() {
- this._registry = {};
- }
-
- put(name, value) {
- this._registry[name] = value;
- }
-
- get(name) {
- return this._registry[name];
- }
-}
diff --git a/packages/backend/src/errors/TechnicalError.js b/packages/backend/src/errors/TechnicalError.js
deleted file mode 100644
index ac6c43a9d6..0000000000
--- a/packages/backend/src/errors/TechnicalError.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-/**
- * @class TechnicalError
- * @extends Error
- *
- * This error type is used for errors that may be presented in a
- * technical context, such as a terminal or log file.
- *
- * @todo This could be a trait errors can have rather than a class.
- */
-class TechnicalError extends Error {
- constructor (message, ...details) {
- super(message);
-
- for ( const detail of details ) {
- detail(this);
- }
- }
-}
-
-const ERR_HINT_NOSTACK = e => {
- e.toString = () => e.message;
-}
-
-module.exports = {
- TechnicalError,
- ERR_HINT_NOSTACK,
-};
diff --git a/packages/backend/src/filesystem/FSAccessContext.js b/packages/backend/src/filesystem/FSAccessContext.js
deleted file mode 100644
index 2b6773c5b7..0000000000
--- a/packages/backend/src/filesystem/FSAccessContext.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const FSNodeContext = require("./FSNodeContext");
-
-const { NodePathSelector, NodeUIDSelector, NodeInternalIDSelector } = require("./node/selectors");
-
-/**
- * Container for access implementations.
- *
- * Access implementations may vary depending on region,
- * user privileges, and other factors.
- *
- * @class FSAccessContext
- */
-module.exports = class FSAccessContext {
- constructor () {
- this.fsEntryFetcher = null;
- }
-
- /**
- * get_entry_by_path() returns a filesystem entry using
- * the path to the entry. Use this method when you need
- * to get a filesystem entry but don't need to collect
- * any other information about the entry.
- *
- * @warning The entry returned by this method is not
- * client-safe. Use FSNodeContext to get a client-safe
- * entry by calling it's fetchEntry() method.
- *
- * @param {*} path
- * @returns
- * @deprecated use get_entry({ path }) instead
- */
- async get_entry_by_path (path) {
- return await this.get_entry({ path });
- }
-
- /**
- * get_entry() returns a filesystem entry using
- * path, uid, or id associated with a filesystem
- * node. Use this method when you need to get a
- * filesystem entry but don't need to collect any
- * other information about the entry.
- *
- * @warning The entry returned by this method is not
- * client-safe. Use FSNodeContext to get a client-safe
- * entry by calling it's fetchEntry() method.
- *
- * @param {*} param0 options for getting the entry
- * @param {*} param0.path
- * @param {*} param0.uid
- * @param {*} param0.id please use mysql_id instead
- * @param {*} param0.mysql_id
- */
- async get_entry ({ path, uid, id, mysql_id, ...options }) {
- let fsNode = await this.node({ path, uid, id, mysql_id });
- await fsNode.fetchEntry(options);
- return fsNode.entry;
- }
-
- /**
- * node() returns a filesystem node using path, uid,
- * or id associated with a filesystem node. Use this
- * method when you need to get a filesystem node and
- * need to collect information about the entry.
- *
- * @param {*} location - path, uid, or id associated with a filesystem node
- * @returns
- */
- async node (selector) {
- if ( typeof selector === 'string' ) {
- if ( selector.startsWith('/') ) {
- selector = new NodePathSelector(selector);
- } else {
- selector = new NodeUIDSelector(selector);
- }
- }
-
- // TEMP: remove when these objects aren't used anymore
- if (
- typeof selector === 'object' &&
- selector.constructor.name === 'Object'
- ) {
- if ( selector.path ) {
- selector = new NodePathSelector(selector.path);
- } else if ( selector.uid ) {
- selector = new NodeUIDSelector(selector.uid);
- } else {
- selector = new NodeInternalIDSelector(
- 'mysql', selector.mysql_id);
- }
- }
-
- let fsNode = new FSNodeContext({
- services: this.services,
- selector,
- fs: this
- });
- return fsNode;
- }
-};
diff --git a/packages/backend/src/filesystem/FSNodeContext.js b/packages/backend/src/filesystem/FSNodeContext.js
deleted file mode 100644
index c5ae737c95..0000000000
--- a/packages/backend/src/filesystem/FSNodeContext.js
+++ /dev/null
@@ -1,808 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { get_user, get_dir_size, id2path, id2uuid, is_empty, is_shared_with_anyone, suggest_app_for_fsentry, get_app } = require("../helpers");
-
-const config = require("../config");
-const _path = require('path');
-const { NodeInternalIDSelector, NodeChildSelector, NodeUIDSelector, RootNodeSelector, NodePathSelector } = require("./node/selectors");
-const { Context } = require("../util/context");
-const { MultiDetachable } = require("../util/listenerutil");
-const { NodeRawEntrySelector } = require("./node/selectors");
-const { DB_READ } = require("../services/database/consts");
-
-/**
- * Container for information collected about a node
- * on the filesystem.
- *
- * Examples of such information include:
- * - data collected by querying an fsentry
- * - the location of a file's contents
- *
- * This is an implementation of the Facade design pattern,
- * so information about a filesystem node should be collected
- * via the methods on this class and not mutated directly.
- *
- * @class FSNodeContext
- * @property {object} entry the filesystem entry
- * @property {string} path the path to the filesystem entry
- * @property {string} uid the UUID of the filesystem entry
- */
-module.exports = class FSNodeContext {
- static TYPE_FILE = { label: 'File' };
- static TYPE_DIRECTORY = { label: 'Directory' };
- static TYPE_SYMLINK = {};
- static TYPE_SHORTCUT = {};
- static TYPE_UNDETERMINED = {};
-
- static SELECTOR_PRIORITY_ORDER = [
- NodeRawEntrySelector,
- RootNodeSelector,
- NodeInternalIDSelector,
- NodeUIDSelector,
- NodeChildSelector,
- NodePathSelector,
- ];
-
- /**
- * Creates an instance of FSNodeContext.
- * @param {*} opt_identifier
- * @param {*} opt_identifier.path a path to the filesystem entry
- * @param {*} opt_identifier.uid a UUID of the filesystem entry
- * @param {*} opt_identifier.id please pass mysql_id instead
- * @param {*} opt_identifier.mysql_id a MySQL ID of the filesystem entry
- */
- constructor ({ services, selector, fs }) {
- this.log = services.get('log-service').create('fsnode-context');
- this.selector_ = null;
- this.selectors_ = [];
- this.selector = selector;
- this.entry = {};
- this.found = undefined;
- this.found_thumbnail = undefined;
-
- selector.setPropertiesKnownBySelector(this);
-
- this.services = services;
-
- this.fileContentsFetcher = null;
-
- this.fs = fs;
-
- // Decorate all fetch methods with otel span
- // TODO: language tool for traits; this is a trait
- const fetch_methods = [
- 'fetchEntry',
- 'fetchPath',
- 'fetchSubdomains',
- 'fetchOwner',
- 'fetchShares',
- 'fetchVersions',
- 'fetchSize',
- 'fetchSuggestedApps',
- 'fetchIsEmpty',
- ];
- for ( const method of fetch_methods ) {
- const original_method = this[method];
- this[method] = async (...args) => {
- const tracer = this.services.get('traceService').tracer;
- let result;
- await tracer.startActiveSpan(`fs:nodectx:fetch:${method}`, async span => {
- result = await original_method.call(this, ...args);
- span.end();
- });
- return result;
- }
- }
- }
-
- set selector (new_selector) {
- // Only add the selector if we don't already have it
- for ( const selector of this.selectors_ ) {
- if ( selector instanceof new_selector.constructor ) return;
- }
- this.selectors_.push(new_selector);
- this.selector_ = new_selector;
- }
-
- get selector () {
- return this.get_optimal_selector();
- }
-
- get_selector_of_type (cls) {
- // Reverse iterate over selectors
- for ( let i = this.selectors_.length - 1; i >= 0; i-- ) {
- const selector = this.selectors_[i];
- if ( selector instanceof cls ) {
- return selector;
- }
- }
-
- if ( cls.implyFromFetchedData ) {
- return cls.implyFromFetchedData(this);
- }
-
- return null;
- }
-
- get_optimal_selector () {
- for ( const cls of FSNodeContext.SELECTOR_PRIORITY_ORDER ) {
- const selector = this.get_selector_of_type(cls);
- if ( selector ) return selector;
- }
- this.log.warn('Failed to get optimal selector');
- return this.selector_;
- }
-
- get isRoot () {
- return this.path === '/';
- }
-
- async isUserDirectory () {
- if ( this.isRoot ) return false;
- if ( this.found === undefined ) {
- await this.fetchEntry();
- }
- if ( this.isRoot ) return false;
- if ( this.found === false ) return undefined;
- return ! this.entry.parent_uid;
- }
-
- async exists (fetch_options = {}) {
- await this.fetchEntry();
- if ( ! this.found ) {
- this.log.debug(
- 'here\'s why it doesn\'t exist: ' +
- this.selector.describe() + ' -> ' +
- this.uid + ' ' +
- JSON.stringify(this.entry, null, ' ')
- );
- }
- return this.found;
- }
-
- async fetchPath () {
- if ( this.path ) return;
-
- this.path = await this.services.get('information')
- .with('fs.fsentry')
- .obtain('fs.fsentry:path')
- .exec(this.entry);
- }
-
- /**
- * Fetches the filesystem entry associated with a
- * filesystem node identified by a path or UID.
- *
- * If a UID exists, the path is ignored.
- * If neither a UID nor a path is set, an error is thrown.
- *
- * @param {*} fsEntryFetcher fetches the filesystem entry
- * @void
- */
- async fetchEntry (fetch_entry_options = {}) {
- if (
- this.found === true &&
- ! fetch_entry_options.force &&
- (
- // thumbnail already fetched, or not asked for
- ! fetch_entry_options.thumbnail || this.entry?.thumbnail ||
- this.found_thumbnail !== undefined
- )
- ) {
- return;
- }
-
- // NOTE: commented out for now because it's too verbose
- this.log.info('fetching entry: ' + this.selector.describe(true));
- // All services at the top (DEVLOG-401)
- const {
- traceService,
- fsEntryService,
- fsEntryFetcher,
- resourceService,
- } = Context.get('services').values;
-
- // await this.fs.resourceService
- // .waitForResource(this.selector);
- if ( fetch_entry_options.tracer == null ) {
- fetch_entry_options.tracer = traceService.tracer;
- }
-
- if ( fetch_entry_options.op ) {
- fetch_entry_options.trace_options = {
- parent: fetch_entry_options.op.span,
- };
- }
-
- let entry;
-
- await new Promise (rslv => {
- const detachables = new MultiDetachable();
-
- let resolved = false;
-
- const callback = (resolver) => {
- // NOTE: commented out for now because it's too verbose
- this.log.noticeme(`resolved by ${resolver}`, {
- debug: fetch_entry_options.debug,
- });
- resolved = true;
- detachables.detach();
- rslv();
- }
-
- // either the resource is free
- {
- // no detachale because waitForResource returns a
- // Promise that will be resolved when the resource
- // is free no matter what, and then it will be
- // garbage collected.
- resourceService.waitForResource(
- this.selector
- ).then(callback.bind(null, 'resourceService'));
- }
-
- // or pending information about the resource
- // becomes available
- {
- // detachable is needed here because waitForEntry keeps
- // a map of listeners in memory, and this event may
- // never occur. If this never occurs, waitForResource
- // is guaranteed to resolve eventually, and then this
- // detachable will be detached by `callback` so the
- // listener can be garbage collected.
- const det = fsEntryService.waitForEntry(
- this, callback.bind(null, 'fsEntryService'));
- if ( det ) detachables.add(det);
- }
- });
-
- this.log.debug('got past the promise')
-
- if ( resourceService.getResourceInfo(this.uid) ) {
- entry = await fsEntryService.get(this.uid, fetch_entry_options);
- this.log.debug('got an entry from the future');
- } else {
- this.log.debug('resource is already free');
- entry = await fsEntryFetcher.find(
- this.selector, fetch_entry_options);
- }
-
- if ( ! entry ) {
- this.log.info(`entry not found: ${this.selector.describe(true)}`);
- }
-
- if ( entry === null || typeof entry !== 'object' ) {
- // TODO: this property shouldn't be set to false -
- // this is set to false to avoid regressions with
- // existing code.
- this.entry = false;
-
- this.found = false;
- return;
- }
-
- this.found = true;
-
- if ( entry.id ) {
- this.selector = new NodeInternalIDSelector('mysql', entry.id, {
- source: 'FSNodeContext optimization'
- });
- }
-
- if ( ! this.uid && entry.uuid ) {
- this.uid = entry.uuid;
- }
-
- if ( ! this.mysql_id && entry.id ) {
- this.mysql_id = entry.id;
- }
-
- if ( ! this.path && entry.path ) {
- this.path = entry.path;
- }
-
- if ( ! this.name && entry.name ) this.name = entry.name;
-
- Object.assign(this.entry, entry);
- }
-
- /**
- * Wait for an fsentry which might be enqueued for insertion
- * into the database.
- *
- * This just calls ResourceService under the hood.
- */
- async awaitStableEntry () {
- const resourceService = Context.get('services').get('resourceService');
- await resourceService.waitForResource(this.selector);
- }
-
- /**
- * Fetches the subdomains associated with a directory or file
- * and stores them on the `subdomains` property of the fsentry.
- * @param {object} user the user is needed to query subdomains
- * @param {bool} force fetch subdomains if they were already fetched
- *
- * @param fs:decouple-subdomains
- */
- async fetchSubdomains (user, force) {
- if ( ! this.entry.is_dir ) return;
-
- const db = this.services.get('database').get(DB_READ, 'filesystem');
-
- this.entry.subdomains = []
- let subdomains = await db.read(
- `SELECT * FROM subdomains WHERE root_dir_id = ? AND user_id = ?`,
- [this.entry.id, user.id]
- );
- if(subdomains.length > 0){
- subdomains.forEach((sd)=>{
- this.entry.subdomains.push({
- subdomain: sd.subdomain,
- address: config.protocol + '://' + sd.subdomain + "." + 'puter.site',
- uuid: sd.uuid,
- })
- })
- this.entry.has_website = true;
- }
- }
-
- /**
- * Fetches the owner of a directory or file and stores it on the
- * `owner` property of the fsentry.
- * @param {bool} force fetch owner if it was already fetched
- */
- async fetchOwner (force) {
- if ( this.isRoot ) return;
- const owner = await get_user({ id: this.entry.user_id });
- this.entry.owner = {
- username: owner.username,
- email: owner.email,
- };
- }
-
- /**
- * Fetches shares, AKA "permissions", for a directory or file;
- * then, stores them on the `permissions` property
- * of the fsentry.
- * @param {bool} force fetch shares if they were already fetched
- *
- * @deprecated sharing will use user-to-user permissions
- */
- async fetchShares (force) {
- // NOOP: this was for legacy sharing functionality;
- // this is being re-implemented with permissions
- return;
- }
-
- /**
- * Fetches versions associated with a filesystem entry,
- * then stores them on the `versions` property of
- * the fsentry.
- * @param {bool} force fetch versions if they were already fetched
- *
- * @todo fs:decouple-versions
- */
- async fetchVersions (force) {
- if ( this.entry.versions && ! force ) return;
-
- const db = this.services.get('database').get(DB_READ, 'filesystem');
-
- let versions = await db.read(
- `SELECT * FROM fsentry_versions WHERE fsentry_id = ?`,
- [this.entry.id]
- );
- const versions_tidy = [];
- for (let index = 0; index < versions.length; index++) {
- const version = versions[index];
- let username = version.user_id ? (await get_user({id: version.user_id})).username : null;
- versions_tidy.push({
- id: version.version_id,
- message: version.message,
- timestamp: version.ts_epoch,
- user: {
- username: username,
- }
- })
- }
-
- this.entry.versions = versions_tidy;
- }
-
- /**
- * Fetches the size of a file or directory if it was not
- * already fetched.
- * @param {object} user the user is needed to fetch the size
- */
- async fetchSize (user) {
- const { fsEntryService } = Context.get('services').values;
-
- // we already have the size for files
- if ( ! this.entry.is_dir ) return;
-
- this.entry.size = await fsEntryService.get_recursive_size(
- this.entry.uuid,
- );
-
- return this.entry.size;
- }
-
- async fetchSuggestedApps (user, force) {
- if ( this.entry.suggested_apps && ! force ) return;
-
- await this.fetchEntry();
- if ( ! this.entry ) return;
-
- this.entry.suggested_apps =
- await suggest_app_for_fsentry(this.entry, { user });
- }
-
- async fetchIsEmpty () {
- if ( ! this.entry ) return;
- if ( ! this.entry.is_dir ) return;
- if ( ! this.uid ) return;
-
- this.entry.is_empty = await is_empty(this.uid);
- }
-
- // TODO: this is currently not called anywhere; for now it
- // will never be fetched since sharing is not a priority.
- async fetchIsShared () {
- if ( ! this.mysql_id ) return;
-
- this.entry.is_shared = await is_shared_with_anyone(this.mysql_id);
- }
-
- async fetchAll(fsEntryFetcher, user, force) {
- await this.fetchEntry({ thumbnail: true });
- await this.fetchSubdomains(user);
- await this.fetchOwner();
- await this.fetchShares();
- await this.fetchVersions();
- await this.fetchSize(user);
- await this.fetchSuggestedApps(user);
- await this.fetchIsEmpty();
- }
-
- async get (key) {
- /*
- This isn't supposed to stay like this!
-
- """ if ( key === something ) return this """
-
- ^ we should use a map of getters instead
-
- Ideally I'd like to make a class trait for classes like
- FSNodeContext that provide a key-value facade to access
- information about some entity.
- */
-
- if ( this.found === false ) {
- throw new Error(
- `Tried to get ${key} of non-existent fsentry: ` +
- this.selector.describe(true)
- );
- }
-
- if ( key === 'entry' ) {
- await this.fetchEntry();
- if ( this.found === false ) {
- throw new Error(
- `Tried to get entry of non-existent fsentry: ` +
- this.selector.describe(true)
- );
- }
- return this.entry;
- }
-
- if ( key === 'path' ) {
- if ( ! this.path ) await this.fetchEntry();
- if ( this.found === false ) {
- throw new Error(
- `Tried to get path of non-existent fsentry: ` +
- this.selector.describe(true)
- );
- }
- if ( ! this.path ) {
- // console.log('PATH WAS NOT ON ENTRY', this);
- await this.fetchPath();
- }
- if ( ! this.path ) {
- throw new Error(`failed to get path`);
- }
- return this.path;
- }
-
- if ( key === 'uid' ) {
- await this.fetchEntry();
- return this.uid;
- }
-
- if ( key === 'mysql-id' ) {
- await this.fetchEntry();
- return this.mysql_id;
- }
-
- const values_from_entry = ['immutable', 'user_id', 'name', 'size', 'parent_uid', 'metadata'];
- for ( const k of values_from_entry ) {
- if ( key === k ) {
- await this.fetchEntry();
- if ( this.found === false ) {
- throw new Error(
- `Tried to get ${key} of non-existent fsentry: ` +
- this.selector.describe(true)
- );
- }
- return this.entry[k];
- }
- }
-
- if ( key === 'type' ) {
- await this.fetchEntry();
-
- // Longest ternary operator chain I've ever written?
- return this.entry.is_shortcut
- ? FSNodeContext.TYPE_SHORTCUT
- : this.entry.is_symlink
- ? FSNodeContext.TYPE_SYMLINK
- : this.entry.is_dir
- ? FSNodeContext.TYPE_DIRECTORY
- : FSNodeContext.TYPE_FILE;
- }
-
- if ( key === 'has-s3' ) {
- await this.fetchEntry();
- if ( this.entry.is_dir ) return false;
- if ( this.entry.is_shortcut ) return false;
- return true;
- }
-
- if ( key === 's3:location' ) {
- await this.fetchEntry();
- if ( ! await this.exists() ) {
- throw new Error('file does not exist');
- }
- return {
- bucket: this.entry.bucket,
- bucket_region: this.entry.bucket_region,
- key: this.entry.uuid,
- };
- }
-
- if ( key === 'is-root' ) {
- await this.fetchEntry();
- return this.isRoot;
- }
-
- throw new Error(`unrecognize key for FSNodeContext.get: ${key}`);
- }
-
- async getParent () {
- if ( this.isRoot ) {
- throw new Error('tried to get parent of root');
- }
-
- if ( this.path ) {
- const parent_fsNode = await this.fs.node({
- path: _path.dirname(this.path),
- })
- return parent_fsNode;
- }
-
- if ( this.selector instanceof NodeChildSelector ) {
- return this.fs.node(this.selector.parent);
- }
-
- if ( ! await this.exists() ) {
- throw new Error('unable to get parent');
- }
-
- const parent_uid = this.entry.parent_uid;
-
- if ( ! parent_uid ) {
- return this.fs.node(new RootNodeSelector());
- }
-
- return this.fs.node(new NodeUIDSelector(parent_uid));
- }
-
- async getChild (name) {
- // If we have a path, we can get an FSNodeContext for the child
- // without fetching anything.
- if ( this.path ) {
- const child_fsNode = await this.fs.node({
- path: _path.join(this.path, name),
- })
- return child_fsNode;
- }
-
- return await this.fs.node(new NodeChildSelector(
- this.selector, name));
- }
-
- async getTarget () {
- await this.fetchEntry();
- const type = await this.get('type');
-
- if ( type === FSNodeContext.TYPE_SYMLINK ) {
- const path = await this.entry.symlink_path;
- return await this.fs.node({ path });
- }
-
- if ( type === FSNodeContext.TYPE_SHORTCUT ) {
- const target_id = await this.entry.shortcut_to;
- return await this.fs.node({ mysql_id: target_id });
- }
-
- return this;
- }
-
- async is_above (child_fsNode) {
- if ( this.isRoot ) return true;
-
- const path_this = await this.get('path');
- const path_child = await child_fsNode.get('path');
-
- return path_child.startsWith(path_this + '/');
- }
-
- async is (fsNode) {
- if ( this.mysql_id && fsNode.mysql_id ) {
- return this.mysql_id === fsNode.mysql_id;
- }
-
- if ( this.uid && fsNode.uid ) {
- return this.uid === fsNode.uid;
- }
-
- await this.fetchEntry();
- await fsNode.fetchEntry();
- return this.uid === fsNode.uid;
- }
-
- async getSafeEntry (fetch_options = {}) {
- if ( this.found === false ) {
- throw new Error(
- `Tried to get entry of non-existent fsentry: ` +
- this.selector.describe(true)
- );
- }
- await this.fetchEntry(fetch_options);
-
- const res = this.entry;
- const fsentry = {};
-
- // This property will not be serialized, but it can be checked
- // by other code to verify that API calls do not send
- // unsanitized filsystem entries.
- Object.defineProperty(fsentry, '__is_safe__', {
- enumerable: false,
- value: true,
- });
-
- for ( const k in res ) {
- fsentry[k] = res[k];
- }
-
- const info = this.services.get('information');
-
- if ( ! this.uid && ! this.entry.uuid ) {
- this.log.noticeme(
- 'whats even happening!?!? ' +
- this.selector.describe() + ' ' +
- JSON.stringify(this.entry, null, ' ')
- );
- }
-
- // If fsentry was found by a path but the entry doesn't
- // have a path, use the path that was used to find it.
- fsentry.path = res.path ?? this.path ?? await info
- .with('fs.fsentry:uuid')
- .obtain('fs.fsentry:path')
- .exec(this.uid ?? this.entry.uuid);
-
- fsentry.dirname = _path.dirname(fsentry.path);
- fsentry.dirpath = fsentry.dirname;
-
- // Do not send internal IDs to clients
- fsentry.id = res.uuid;
- fsentry.parent_id = res.parent_uid;
- // The client calls it uid, not uuid.
- fsentry.uid = res.uuid;
- delete fsentry.uuid;
- delete fsentry.user_id;
- if ( fsentry.suggested_apps ) {
- for ( const app of fsentry.suggested_apps ) {
- if ( app === null ) {
- this.log.warn('null app');
- continue;
- }
- this.log.debug('app?', { value: app });
- delete app.owner_user_id;
- }
- }
-
- // Do not send S3 bucket information to clients
- delete fsentry.bucket;
- delete fsentry.bucket_region;
-
- // Use client-friendly IDs for shortcut_to
- fsentry.shortcut_to = (res.shortcut_to
- ? await id2uuid(res.shortcut_to) : undefined);
- fsentry.shortcut_to_path = (res.shortcut_to
- ? await id2path(res.shortcut_to) : undefined);
-
- // Add file_request_url
- if(res.file_request_token && res.file_request_token !== ''){
- fsentry.file_request_url = config.origin +
- '/upload?token=' + res.file_request_token;
- }
-
- if ( fsentry.associated_app_id ) {
- const app = await get_app({ id: fsentry.associated_app_id });
- fsentry.associated_app = app;
- }
-
- fsentry.is_dir = !! fsentry.is_dir;
-
- // Ensure `size` is numeric
- if ( fsentry.size ) {
- fsentry.size = parseInt(fsentry.size);
- }
-
- return fsentry;
- }
-
- static sanitize_pending_entry_info (res) {
- const fsentry = {};
-
- // This property will not be serialized, but it can be checked
- // by other code to verify that API calls do not send
- // unsanitized filsystem entries.
- Object.defineProperty(fsentry, '__is_safe__', {
- enumerable: false,
- value: true,
- });
-
- for ( const k in res ) {
- fsentry[k] = res[k];
- }
-
- fsentry.dirname = _path.dirname(fsentry.path);
-
- // Do not send internal IDs to clients
- fsentry.id = res.uuid;
- fsentry.parent_id = res.parent_uid;
- // The client calls it uid, not uuid.
- fsentry.uid = res.uuid;
-
- delete fsentry.uuid;
- delete fsentry.user_id;
-
- // Do not send S3 bucket information to clients
- delete fsentry.bucket;
- delete fsentry.bucket_region;
-
- delete fsentry.shortcut_to;
- delete fsentry.shortcut_to_path;
-
- return fsentry;
- }
-}
diff --git a/packages/backend/src/filesystem/FSOperationContext.js b/packages/backend/src/filesystem/FSOperationContext.js
deleted file mode 100644
index e99491e581..0000000000
--- a/packages/backend/src/filesystem/FSOperationContext.js
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const PerformanceMonitor = require('../monitor/PerformanceMonitor');
-
-const FSNodeContext = require('./FSNodeContext');
-const FSAccessContext = require('./FSAccessContext');
-const { Context } = require('../util/context');
-
-/**
- * FSOperationContext represents a single operation on the filesystem.
- *
- * FSOperationContext is used to record events such as side-effects
- * which occur during a high-level filesystem operation. It is also
- * responsible for generating a client-safe result which describes
- * the operation.
- */
-module.exports = class FSOperationContext {
- // TODO: rename this.fs to this.access
- constructor (op_name, context, options) {
- // TRACK: fs:create-service
- // TODO: rename this.fs to this.access
- // NOTE: the 2nd parameter of this constructor
- // was called `fs` and was expected to be FSAccessContext.
- // Now it should be a context object holding the services
- // container. context.access is the FSAccessContext.
- if ( context instanceof FSAccessContext ) {
- this.fs = context;
- } else if ( context ) {
- this.context = context;
- this.fs = context.access;
- } else {
- const x = Context.get();
- this.fs = {};
- this.fs.traceService = x.get('services').get('traceService');
- }
-
- this.name = op_name;
- this.events = [];
- this.parent_dirs_created = [];
- this.created = [];
- this.fields = {};
- this.safeFields = {};
-
- this.valueListeners_ = {};
- this.valueFactories_ = {};
- this.values_ = {};
- this.rejections_ = {};
-
- this.tasks_ = [];
-
- this.currentCheckpoint_ = 'checkpoint not set';
-
- if ( options.parent_operation ) {
- this.parent = options.parent_operation;
- }
-
- this.donePromise = new Promise((resolve, reject) => {
- this.doneResolve = resolve;
- this.doneReject = reject;
- });
-
- // TRACK: arch:trace-service:move-outta-fs
- if ( this.fs.traceService ) {
- // Set 'span_' to current active span
- const { context, trace } = require('@opentelemetry/api');
- this.span_ = trace.getSpan(context.active());
- }
-
- this.monitor = PerformanceMonitor.createContext(`fs.${op_name}`);
- }
-
- checkpoint (label) {
- this.currentCheckpoint_ = label;
- }
-
- async addTask (name, fn) {
- const task = {
- name,
- operations: [],
- promise: Promise.resolve(),
- };
-
- const taskContext = {
- registerOperation: op => {
- task.operations.push(op);
- task.promise = task.promise.then(() => op.awaitDone());
- }
- };
-
- const monitor = PerformanceMonitor.createContext('fs.rm');
- monitor.label(`task:${name}`);
- task.promise = task.promise.then(() => fn(taskContext));
- this.tasks_.push(task);
-
- let last_promise = null;
- while ( task.promise !== last_promise ) {
- last_promise = task.promise;
- await task.promise;
- }
- // await task.promise;
-
- monitor.stamp();
- monitor.end();
- }
-
- get span () { return this.span_; }
-
- recordParentDirCreated (fsNode) {
- if ( ! fsNode ) {
- throw new Error(
- 'falsy value to recordParentDirCreated',
- fsNode,
- );
- }
- this.parent_dirs_created.push(fsNode);
- }
-
- recordCreated (fsNode) {
- this.created.push(fsNode);
- }
-
- set (field, value) {
- this.fields[field] = value;
- }
-
- async set_now (field, value) {
- this.fields[field] = value;
- if ( value instanceof FSNodeContext ) {
- this.safeFields[field] = await value.getSafeEntry();
- }
- }
-
- get (field) {
- return this.fields[field];
- }
-
- complete (options) {
- options = options ?? {};
-
- if ( this.parent ) {
- for ( const fsNode of this.parent_dirs_created ) {
- this.parent.recordParentDirCreated(fsNode);
- }
-
- for ( const fsNode of this.created ) {
- this.parent.recordCreated(fsNode);
- }
- }
-
- if ( this.tasks_.length > 0 ) {
- // TODO: it's mutating input options, which is not ideal
- if ( ! options.after ) options.after = [];
-
- options.after.push(
- this.tasks_.map(task => task.promise)
- );
- }
-
- if ( options.after ) {
- const thingsToWaitFor = options.after.map(item => {
- if ( item.awaitDone ) return item.awaitDone;
- return item;
- });
- (async () => {
- await Promise.all(thingsToWaitFor);
- this.doneResolve();
- })();
- return;
- }
-
- this.doneResolve();
- }
-
- onComplete(fn) {
- this.donePromise.then(fn);
- }
-
- awaitDone () {
- return this.donePromise;
- }
-
- provideValue (key, value) {
- this.values_[key] = value;
-
- let listeners = this.valueListeners_[key];
- if ( ! listeners ) return;
-
- delete this.valueListeners_[key];
-
- for ( let listener of listeners ) {
- if ( Array.isArray(listener) ) listener = listener[0];
- listener(value);
- }
- }
-
- rejectValue (key, err) {
- this.rejections_[key] = err;
-
- let listeners = this.valueListeners_[key];
- if ( ! listeners ) return;
-
- delete this.valueListeners_[key];
-
- for ( let listener of listeners ) {
- if ( ! Array.isArray(listener) ) continue;
- if ( ! listener[1] ) continue;
- listener = listener[1];
-
- listener(err);
- }
- }
-
- awaitValue (key) {
- return new Promise ((rslv, rjct) => {
- this.onValue(key, rslv, rjct);
- });
- }
-
- onValue (key, fn, rjct) {
- if ( this.values_[key] ) {
- fn(this.values_[key]);
- return;
- }
-
- if ( this.rejections_[key] ) {
- if ( rjct ) {
- rjct(this.rejections_[key]);
- } else throw this.rejections_[key];
- return;
- }
-
- if ( ! this.valueListeners_[key] ) {
- this.valueListeners_[key] = [];
- }
- this.valueListeners_[key].push([fn, rjct]);
-
- if ( this.valueFactories_[key] ) {
- const fn = this.valueFactories_[key];
- delete this.valueFactories_[key];
- (async () => {
- try {
- const value = await fn();
- this.provideValue(key, value);
- } catch (e) {
- this.rejectValue(key, e);
- }
- })();
- }
- }
-
- async setFactory (key, factoryFn) {
- if ( this.valueListeners_[key] ) {
- let v;
- try {
- v = await factoryFn();
- } catch (e) {
- this.rejectValue(key, e);
- }
- this.provideValue(key, v);
- return;
- }
-
- this.valueFactories_[key] = factoryFn;
- }
-
- /**
- * Listen for another operation to complete, and then
- * complete this operation. This is useful for operations
- * which delegate to other operations.
- *
- * @param {FSOperationContext} other
- * @returns {FSOperationContext} this
- */
- completedBy (other) {
- other.onComplete(() => {
- this.complete();
- });
-
- return this;
- }
-
- /**
- * Produces an object which describes the operation in a
- * way that is intended to be sent to the client.
- *
- * @returns {Promise}
- */
- async getClientSafeResult () {
- const result = {};
- for ( const field in this.fields ) {
- if ( this.fields[field] instanceof FSNodeContext ) {
- result[field] = this.safeFields[field] ??
- await this.fields[field].getSafeEntry();
- continue;
- }
-
- result[field] = this.fields[field];
- }
-
- result.parent_dirs_created = [];
- for ( const fsNode of this.parent_dirs_created ) {
- const fsNodeResult = await fsNode.getSafeEntry();
- result.parent_dirs_created.push(fsNodeResult);
- }
-
- return result;
- }
-}
diff --git a/packages/backend/src/filesystem/FilesystemService.js b/packages/backend/src/filesystem/FilesystemService.js
deleted file mode 100644
index f8bc952cab..0000000000
--- a/packages/backend/src/filesystem/FilesystemService.js
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-// TODO: database access can be a service
-const { ResourceService, RESOURCE_STATUS_PENDING_CREATE } = require('./storage/ResourceService');
-const DatabaseFSEntryFetcher = require("./storage/DatabaseFSEntryFetcher");
-const { DatabaseFSEntryService } = require('./storage/DatabaseFSEntryService');
-const { SizeService } = require('./storage/SizeService');
-const { TraceService } = require('../services/TraceService.js');
-const FSAccessContext = require('./FSAccessContext.js');
-const SystemFSEntryService = require('./storage/SystemFSEntryService.js');
-const PerformanceMonitor = require('../monitor/PerformanceMonitor.js');
-const { NodePathSelector, NodeUIDSelector, NodeInternalIDSelector } = require('./node/selectors.js');
-const FSNodeContext = require('./FSNodeContext.js');
-const { AdvancedBase } = require('puter-js-common');
-const { Context } = require('../util/context.js');
-const { simple_retry } = require('../util/retryutil.js');
-const APIError = require('../api/APIError.js');
-const { LLMkdir } = require('./ll_operations/ll_mkdir.js');
-const { LLCWrite, LLOWrite } = require('./ll_operations/ll_write.js');
-const { LLCopy } = require('./ll_operations/ll_copy.js');
-const { PermissionUtil, PermissionRewriter, PermissionImplicator } = require('../services/auth/PermissionService.js');
-const { DB_WRITE } = require("../services/database/consts");
-const { UserActorType } = require('../services/auth/Actor');
-const { get_user } = require('../helpers');
-
-class FilesystemService extends AdvancedBase {
- static MODULES = {
- _path: require('path'),
- uuidv4: require('uuid').v4,
- socketio: require('../socketio.js'),
- config: require('../config.js'),
- }
-
- constructor (args) {
- super(args);
- const { services } = args;
-
- this.services = services;
-
- services.registerService('resourceService', ResourceService);
- services.registerService('sizeService', SizeService);
- services.registerService('traceService', TraceService);
-
- // TODO: [fs:remove-separate-updater-and-fetcher]
- services.set('fsEntryFetcher', new DatabaseFSEntryFetcher({
- services: services,
- }));
- services.registerService('fsEntryService', DatabaseFSEntryService);
-
- // The new fs entry service
- services.registerService('systemFSEntryService', SystemFSEntryService);
-
- this.log = services.get('log-service').create('filesystem-service');
-
- // used by update_child_paths
- this.db = services.get('database').get(DB_WRITE, 'filesystem');
-
- const info = services.get('information');
- info.given('fs.fsentry').provide('fs.fsentry:path')
- .addStrategy('entry-or-delegate', async entry => {
- if ( entry.path ) return entry.path;
- return await info
- .with('fs.fsentry:uuid')
- .obtain('fs.fsentry:path')
- .exec(entry.uuid);
- });
-
-
- // Decorate methods with otel span
- // TODO: language tool for traits; this is a trait
- const span_methods = [
- 'write', 'mkdir', 'rm', 'mv', 'cp', 'read', 'stat',
- 'mkdir_2',
- 'update_child_paths',
- ];
- for ( const method of span_methods ) {
- const original_method = this[method];
- this[method] = async (...args) => {
- const tracer = services.get('traceService').tracer;
- let result;
- await tracer.startActiveSpan(`fs-svc:${method}`, async span => {
- result = await original_method.call(this, ...args);
- span.end();
- });
- return result;
- }
- }
-
- // TODO: eventually FilesystemService will extend BaseService
- // and _init() will be called (and awaited) automatically
- this._init();
- }
-
- async _init () {
- const svc_permission = this.services.get('permission');
- svc_permission.register_rewriter(PermissionRewriter.create({
- matcher: permission => {
- if ( ! permission.startsWith('fs:') ) return false;
- const [_, specifier] = PermissionUtil.split(permission);
- if ( ! specifier.startsWith('/') ) return false;
- return true;
- },
- rewriter: async permission => {
- const [_, path, ...rest] = PermissionUtil.split(permission);
- console.log('checking path: ', path);
- const node = await this.node(new NodePathSelector(path));
- if ( ! await node.exists() ) {
- // TOOD: we need a general-purpose error that can have
- // a user-safe message, instead of using APIError
- // which is for API errors.
- throw APIError.create('subject_does_not_exist');
- }
- const uid = await node.get('uid');
- if ( uid === undefined || uid === 'undefined' ) {
- throw new Error(`uid is undefined for path ${path}`);
- }
- return `fs:${uid}:${rest.join(':')}`;
- },
- }));
- svc_permission.register_implicator(PermissionImplicator.create({
- matcher: permission => {
- return permission.startsWith('fs:');
- },
- checker: async (actor, permission) => {
- debugger;
- if ( !(actor.type instanceof UserActorType) ) {
- return undefined;
- }
-
- const [_, uid] = PermissionUtil.split(permission);
- const node = await this.node(new NodeUIDSelector(uid));
-
- if ( ! await node.exists() ) {
- return undefined;
- }
-
- const owner_id = await node.get('user_id');
-
- // These conditions should never happen
- if ( ! owner_id || ! actor.type.user.id ) {
- throw new Error(
- 'something unexpected happened'
- );
- }
-
- if ( owner_id === actor.type.user.id ) {
- return {};
- }
-
- return undefined;
- },
- }));
- }
-
- /**
- * @deprecated - temporary migration method
- */
- get_systemfs () {
- if ( ! this.systemfs_ ) {
- this.systemfs_ = new FSAccessContext();
- this.systemfs_.fsEntryFetcher = this.services.get('fsEntryFetcher');
- this.systemfs_.fsEntryService = this.services.get('fsEntryService');
- this.systemfs_.resourceService = this.services.get('resourceService');
- this.systemfs_.sizeService = this.services.get('sizeService');
- this.systemfs_.traceService = this.services.get('traceService');
- this.systemfs_.services = this.services;
- }
- return this.systemfs_;
- }
-
- async owrite ({
- node, user, immutable,
- file, tmp, fsentry_tmp,
- message,
- }) {
- const ll_owrite = new LLOWrite();
- return await ll_owrite.run({
- node, user, immutable,
- file, tmp, fsentry_tmp,
- message,
- });
- }
-
- // REMINDER: There was an idea that FilesystemService implements
- // an interface, and if that ever happens these arguments are
- // important:
- // parent, name, user, immutable, file, message
- async cwrite (parameters) {
- const ll_cwrite = new LLCWrite();
- return await ll_cwrite.run(parameters);
- }
-
- async mkdir_2 ({parent, name, user, immutable}) {
- const ll_mkdir = new LLMkdir();
- return await ll_mkdir.run({ parent, name, user, immutable });
- }
-
- async mkshortcut ({ parent, name, user, target }) {
-
- // Access Control
- {
- const svc_acl = this.services.get('acl');
-
- if ( ! await svc_acl.check(user, target, 'read') ) {
- throw await svc_acl.get_safe_acl_error(user, target, 'read');
- }
-
- if ( ! await svc_acl.check(user, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(user, parent, 'write');
- }
- }
-
- if ( ! await target.exists() ) {
- throw APIError.create('shortcut_to_does_not_exist');
- }
-
- await target.fetchEntry({ thumbnail: true });
-
- const { _path, uuidv4 } = this.modules;
- const resourceService = this.services.get('resourceService');
- const systemFSEntryService = this.services.get('systemFSEntryService');
-
- const ts = Math.round(Date.now() / 1000);
- const uid = uuidv4();
-
- resourceService.register({
- uid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- console.log('registered entry')
-
- const raw_fsentry = {
- is_shortcut: 1,
- shortcut_to: target.mysql_id,
- is_dir: target.entry.is_dir,
- thumbnail: target.entry.thumbnail,
- uuid: uid,
- parent_uid: await parent.get('uid'),
- path: _path.join(await parent.get('path'), name),
- user_id: user.id,
- name,
- created: ts,
- updated: ts,
- modified: ts,
- immutable: false,
- };
-
- this.log.debug('creating fsentry', { fsentry: raw_fsentry })
-
- const entryOp = await systemFSEntryService.insert(raw_fsentry);
-
- console.log('entry op', entryOp);
-
- (async () => {
- await entryOp.awaitDone();
- this.log.debug('finished creating fsentry', { uid })
- resourceService.free(uid);
- })();
-
- const node = await this.node(new NodeUIDSelector(uid));
-
- const svc_event = this.services.get('event');
- svc_event.emit('fs.create.shortcut', {
- node,
- context: Context.get(),
- });
-
- return node;
- }
-
- async mklink ({ parent, name, user, target }) {
-
- // Access Control
- {
- const svc_acl = this.services.get('acl');
-
- if ( ! await svc_acl.check(user, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(user, parent, 'write');
- }
- }
-
- // We don't check if the target exists because broken links
- // are allowed.
-
- const { _path, uuidv4 } = this.modules;
- const resourceService = this.services.get('resourceService');
- const systemFSEntryService = this.services.get('systemFSEntryService');
-
- const ts = Math.round(Date.now() / 1000);
- const uid = uuidv4();
-
- resourceService.register({
- uid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- const raw_fsentry = {
- is_symlink: 1,
- symlink_path: target,
- is_dir: 0,
- uuid: uid,
- parent_uid: await parent.get('uid'),
- path: _path.join(await parent.get('path'), name),
- user_id: user.id,
- name,
- created: ts,
- updated: ts,
- modified: ts,
- immutable: false,
- };
-
- this.log.debug('creating symlink', { fsentry: raw_fsentry })
-
- const entryOp = await systemFSEntryService.insert(raw_fsentry);
-
- (async () => {
- await entryOp.awaitDone();
- this.log.debug('finished creating symlink', { uid })
- resourceService.free(uid);
- })();
-
- const node = await this.node(new NodeUIDSelector(uid));
-
- const svc_event = this.services.get('event');
- svc_event.emit('fs.create.symlink', {
- node,
- context: Context.get(),
- });
-
- return node;
- }
-
- async copy_2 (...a) {
- const ll_copy = new LLCopy();
- return await ll_copy.run(...a);
- }
-
- async update_child_paths (old_path, new_path, user_id) {
- const monitor = PerformanceMonitor.createContext('update_child_paths');
-
- if ( ! old_path.endsWith('/') ) old_path += '/';
- if ( ! new_path.endsWith('/') ) new_path += '/';
- // TODO: fs:decouple-tree-storage
- await this.db.write(
- `UPDATE fsentries SET path = CONCAT(?, SUBSTRING(path, ?)) WHERE path LIKE ? AND user_id = ?`,
- [new_path, old_path.length + 1, old_path + '%', user_id]
- );
-
- const log = services.get('log-service').create('update_child_paths');
- log.info(`updated ${old_path} -> ${new_path}`);
-
- monitor.end();
- }
-
- /**
- * node() returns a filesystem node using path, uid,
- * or id associated with a filesystem node. Use this
- * method when you need to get a filesystem node and
- * need to collect information about the entry.
- *
- * @param {*} location - path, uid, or id associated with a filesystem node
- * @returns
- */
- async node (selector) {
- if ( typeof selector === 'string' ) {
- if ( selector.startsWith('/') ) {
- selector = new NodePathSelector(selector);
- } else {
- selector = new NodeUIDSelector(selector);
- }
- }
-
- // TEMP: remove when these objects aren't used anymore
- if (
- typeof selector === 'object' &&
- selector.constructor.name === 'Object'
- ) {
- if ( selector.path ) {
- selector = new NodePathSelector(selector.path);
- } else if ( selector.uid ) {
- selector = new NodeUIDSelector(selector.uid);
- } else {
- selector = new NodeInternalIDSelector(
- 'mysql', selector.mysql_id);
- }
- }
-
- let fsNode = new FSNodeContext({
- services: this.services,
- selector,
- fs: this
- });
- return fsNode;
- }
-
- /**
- * get_entry() returns a filesystem entry using
- * path, uid, or id associated with a filesystem
- * node. Use this method when you need to get a
- * filesystem entry but don't need to collect any
- * other information about the entry.
- *
- * @warning The entry returned by this method is not
- * client-safe. Use FSNodeContext to get a client-safe
- * entry by calling it's fetchEntry() method.
- *
- * @param {*} param0 options for getting the entry
- * @param {*} param0.path
- * @param {*} param0.uid
- * @param {*} param0.id please use mysql_id instead
- * @param {*} param0.mysql_id
- */
- async get_entry ({ path, uid, id, mysql_id, ...options }) {
- let fsNode = await this.node({ path, uid, id, mysql_id });
- await fsNode.fetchEntry(options);
- return fsNode.entry;
- }
-}
-
-module.exports = {
- FilesystemService
-};
diff --git a/packages/backend/src/filesystem/backends/Test.js b/packages/backend/src/filesystem/backends/Test.js
deleted file mode 100644
index d2f35d624b..0000000000
--- a/packages/backend/src/filesystem/backends/Test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Test = void 0;
-class Test {
-}
-exports.Test = Test;
diff --git a/packages/backend/src/filesystem/backends/Test.ts b/packages/backend/src/filesystem/backends/Test.ts
deleted file mode 100644
index 6b8585ca9c..0000000000
--- a/packages/backend/src/filesystem/backends/Test.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export class Test {
- //
-}
\ No newline at end of file
diff --git a/packages/backend/src/filesystem/batch/BatchExecutor.js b/packages/backend/src/filesystem/batch/BatchExecutor.js
deleted file mode 100644
index 8356ad6b23..0000000000
--- a/packages/backend/src/filesystem/batch/BatchExecutor.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require('puter-js-common');
-const PathResolver = require('../../routers/filesystem_api/batch/PathResolver');
-const commands = require('./commands').commands;
-const { WorkUnit } = require('../../services/runtime-analysis/ExpectationService');
-const APIError = require('../../api/APIError');
-const { Context } = require('../../util/context');
-const config = require('../../config');
-const { TeePromise } = require('../../util/promise');
-
-class BatchExecutor extends AdvancedBase {
- constructor (x, { user, log, errors }) {
- super();
- this.x = x;
- this.user = user;
- this.pathResolver = new PathResolver({ user });
- this.expectations = x.get('services').get('expectations');
- this.log = log;
- this.errors = errors;
- this.responsePromises = [];
- this.hasError = false;
-
- this.total_tbd = true;
- this.total = 0;
- this.counter = 0;
-
- this.concurrent_ops = 0;
- this.max_concurrent_ops = 20;
- this.ops_promise = null;
- }
-
- async ready_for_more () {
- if ( this.ops_promise === null ) {
- this.ops_promise = new TeePromise();
- }
- await this.ops_promise;
- }
-
- async exec_op (req, op, file) {
- while ( this.concurrent_ops >= this.max_concurrent_ops ) {
- await this.ready_for_more();
- }
-
- this.concurrent_ops++;
- if ( config.env == 'dev' ) {
- const wid = this.x.get('dev_batch-widget');
- wid.ops++;
- }
-
- const { expectations } = this;
- const command_cls = commands[op.op];
- console.log(command_cls, JSON.stringify(op, null, 2));
- delete op.op;
-
- const workUnit = WorkUnit.create();
- expectations.expect_eventually({
- workUnit,
- checkpoint: 'operation responded'
- });
-
- // TEMP: event service will handle this
- op.original_client_socket_id = req.body.original_client_socket_id;
- op.socket_id = req.body.socket_id;
-
- // run the operation
- let p = this.x.arun(async () => {
- const x= Context.get();
- if ( ! x ) throw new Error('no context');
-
- try {
- if ( ! command_cls ) {
- throw APIError.create('invalid_operation', null, {
- operation: op.op,
- });
- }
-
- if ( file ) workUnit.checkpoint(
- 'about to run << ' +
- (file.originalname ?? file.name) +
- ' >> ' +
- JSON.stringify(op)
- );
- const command_ins = await command_cls.run({
- getFile: () => file,
- pathResolver: this.pathResolver,
- user: this.user
- }, op);
- workUnit.checkpoint('operation invoked');
-
- const res = await command_ins.awaitValue('result');
- // const res = await opctx.awaitValue('response');
- workUnit.checkpoint('operation responded');
- return res;
- } catch (e) {
- this.hasError = true;
- if ( ! ( e instanceof APIError ) ) {
- // TODO: alarm condition
- this.errors.report('batch-operation', {
- source: e,
- trace: true,
- alarm: true,
- });
-
- e = APIError.adapt(e);
- }
-
- // Consume stream if there's a file
- if ( file ) {
- try {
- // read entire stream
- await new Promise((resolve, reject) => {
- file.stream.on('end', resolve);
- file.stream.on('error', reject);
- file.stream.resume();
- });
- } catch (e) {
- this.errors.report('batch-operation-2', {
- source: e,
- trace: true,
- alarm: true,
- });
- }
- }
-
- if ( config.env == 'dev' ) {
- console.error(e);
- // process.exit(1);
- }
-
- const serialized_error = e.serialize();
- return serialized_error;
- } finally {
- if ( config.env == 'dev' ) {
- const wid = x.get('dev_batch-widget');
- wid.ops--;
- }
- this.concurrent_ops--;
- if ( this.ops_promise && this.concurrent_ops < this.max_concurrent_ops ) {
- this.ops_promise.resolve();
- this.ops_promise = null;
- }
- }
- });
-
- // decorate with logging
- p = p.then(result => {
- this.counter++;
- const { log, total, total_tbd, counter } = this;
- const total_str = total_tbd ? `TBD(>${total})` : `${total}`;
- log.noticeme(`Batch Progress: ${counter} / ${total_str} operations`);
- return result;
- });
-
- // this.responsePromises.push(p);
-
- // It doesn't really matter whether or not `await` is here
- // (that's a design flaw in the Promise API; what if you
- // want a promise that returns a promise?)
- const result = await p;
- return result;
-
- }
-}
-
-module.exports = {
- BatchExecutor,
-};
diff --git a/packages/backend/src/filesystem/batch/commands.js b/packages/backend/src/filesystem/batch/commands.js
deleted file mode 100644
index 4c03cf3c20..0000000000
--- a/packages/backend/src/filesystem/batch/commands.js
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-const { AsyncProviderTrait } = require("../../traits/AsyncProviderTrait");
-const { HLMkdir, QuickMkdir } = require("../hl_operations/hl_mkdir");
-const { Context } = require("../../util/context");
-const { HLWrite } = require("../hl_operations/hl_write");
-const { get_app } = require("../../helpers");
-const { OperationFrame } = require("../../services/OperationTraceService");
-const { AppUnderUserActorType } = require("../../services/auth/Actor");
-const FSNodeParam = require("../../api/filesystem/FSNodeParam");
-const { TYPE_DIRECTORY } = require("../FSNodeContext");
-const { HLMkShortcut } = require("../hl_operations/hl_mkshortcut");
-const { HLMkLink } = require("../hl_operations/hl_mklink");
-const { HLRemove } = require("../hl_operations/hl_remove");
-
-
-class BatchCommand extends AdvancedBase {
- static TRAITS = [
- new AsyncProviderTrait(),
- ]
- static async run (executor, parameters) {
- const instance = new this();
- let x = Context.get();
- const operationTraceSvc = x.get('services').get('operationTrace');
- const frame = await operationTraceSvc.add_frame('batch:' + this.name);
- if ( parameters.hasOwnProperty('item_upload_id') ) {
- frame.attr('gui_metadata', {
- ...(frame.get_attr('gui_metadata') || {}),
- item_upload_id: parameters.item_upload_id,
- });
- }
- x = x.sub({ [operationTraceSvc.ckey('frame')]: frame });
- await x.arun(async () => {
- await instance.run(executor, parameters);
- });
- frame.status = OperationFrame.FRAME_STATUS_DONE;
- return instance;
- }
-}
-
-class MkdirCommand extends BatchCommand {
- async run (executor, parameters) {
- const context = Context.get();
- const fs = context.get('services').get('filesystem');
-
- const parent = parameters.parent
- ? await fs.node(await executor.pathResolver.awaitSelector(parameters.parent))
- : undefined ;
-
- const meta = parameters.parent
- ? executor.pathResolver.getMeta(parameters.parent)
- : undefined ;
-
- if ( meta?.conflict_free ) {
- // No potential conflict; just create the directory
- const q_mkdir = new QuickMkdir();
- await q_mkdir.run({
- parent,
- path: parameters.path,
- });
- if ( parameters.as ) {
- executor.pathResolver.putSelector(
- parameters.as,
- q_mkdir.created.selector,
- { conflict_free: true }
- );
- }
- this.setFactory('result', async () => {
- await q_mkdir.created.awaitStableEntry();
- const response = await q_mkdir.created.getSafeEntry();
- return response;
- });
- return;
- }
- console.log('USING SLOW MKDIR');
-
- const hl_mkdir = new HLMkdir();
- const response = await hl_mkdir.run({
- parent,
- path: parameters.path,
- overwrite: parameters.overwrite,
- dedupe_name: parameters.dedupe_name,
- create_missing_parents:
- parameters.create_missing_ancestors ??
- parameters.create_missing_parents ??
- false,
- shortcut_to: parameters.shortcut_to,
- user: executor.user,
- });
- if ( parameters.as ) {
- executor.pathResolver.putSelector(
- parameters.as,
- hl_mkdir.created.selector,
- hl_mkdir.used_existing
- ? undefined
- : { conflict_free: true }
- );
- }
- this.provideValue('result', response)
- }
-}
-
-class WriteCommand extends BatchCommand {
- async run (executor, parameters) {
- const context = Context.get();
- const fs = context.get('services').get('filesystem');
-
- const uploaded_file = executor.getFile();
-
- const destinationOrParent =
- await fs.node(await executor.pathResolver.awaitSelector(parameters.path));
-
- let app;
- if ( parameters.app_uid ) {
- app = await get_app({uid: parameters.app_uid})
- }
-
- const hl_write = new HLWrite();
- const response = await hl_write.run({
- destination_or_parent: destinationOrParent,
- specified_name: parameters.name,
- fallback_name: uploaded_file.originalname,
-
- overwrite: parameters.overwrite,
- dedupe_name: parameters.dedupe_name,
-
- create_missing_parents:
- parameters.create_missing_ancestors ??
- parameters.create_missing_parents ??
- false,
- user: executor.user,
-
- file: uploaded_file,
- offset: parameters.offset,
-
- // TODO: handle these with event service instead
- socket_id: parameters.socket_id,
- operation_id: parameters.operation_id,
- item_upload_id: parameters.item_upload_id,
- app_id: app ? app.id : null,
- });
-
- this.provideValue('result', response);
-
-
- // const opctx = await fs.write(fs, {
- // // --- per file ---
- // name: parameters.name,
- // fallbackName: uploaded_file.originalname,
- // destinationOrParent,
- // // app_id: app ? app.id : null,
- // overwrite: parameters.overwrite,
- // dedupe_name: parameters.dedupe_name,
- // file: uploaded_file,
- // thumbnail: parameters.thumbnail,
- // target: parameters.target ? await req.fs.node(parameters.shortcut_to) : null,
- // symlink_path: parameters.symlink_path,
- // operation_id: parameters.operation_id,
- // item_upload_id: parameters.item_upload_id,
- // user: executor.user,
-
- // // --- per batch ---
- // socket_id: parameters.socket_id,
- // original_client_socket_id: parameters.original_client_socket_id,
- // });
-
- // opctx.onValue('response', v => this.provideValue('result', v));
- }
-}
-
-class ShortcutCommand extends BatchCommand {
- async run (executor, parameters) {
- const context = Context.get();
- const fs = context.get('services').get('filesystem');
-
- const destinationOrParent =
- await fs.node(await executor.pathResolver.awaitSelector(parameters.path));
-
- const shortcut_to =
- await fs.node(await executor.pathResolver.awaitSelector(parameters.shortcut_to));
-
- let app;
- if ( parameters.app_uid ) {
- app = await get_app({uid: parameters.app_uid})
- }
-
- await destinationOrParent.fetchEntry({ thumbnail: true });
- await shortcut_to.fetchEntry({ thumbnail: true });
-
- const hl_mkShortcut = new HLMkShortcut();
- const response = await hl_mkShortcut.run({
- parent: destinationOrParent,
- name: parameters.name,
- user: executor.user,
- target: shortcut_to,
-
- // TODO: handle these with event service instead
- socket_id: parameters.socket_id,
- operation_id: parameters.operation_id,
- item_upload_id: parameters.item_upload_id,
- app_id: app ? app.id : null,
- });
-
- this.provideValue('result', response);
- }
-}
-
-class SymlinkCommand extends BatchCommand {
- async run (executor, parameters) {
- const context = Context.get();
- const fs = context.get('services').get('filesystem');
-
- const destinationOrParent =
- await fs.node(await executor.pathResolver.awaitSelector(parameters.path));
-
- let app;
- if ( parameters.app_uid ) {
- app = await get_app({uid: parameters.app_uid})
- }
-
- await destinationOrParent.fetchEntry({ thumbnail: true });
-
- const hl_mkLink = new HLMkLink();
- const response = await hl_mkLink.run({
- parent: destinationOrParent,
- name: parameters.name,
- user: executor.user,
- target: parameters.target,
-
- // TODO: handle these with event service instead
- socket_id: parameters.socket_id,
- operation_id: parameters.operation_id,
- item_upload_id: parameters.item_upload_id,
- app_id: app ? app.id : null,
- });
-
- this.provideValue('result', response);
- }
-}
-
-class DeleteCommand extends BatchCommand {
- async run (executor, parameters) {
- const context = Context.get();
- const fs = context.get('services').get('filesystem');
-
- const target =
- await fs.node(await executor.pathResolver.awaitSelector(parameters.path));
-
- const hl_remove = new HLRemove();
- const response = await hl_remove.run({
- target,
- user: executor.user,
- recursive: parameters.recursive ?? false,
- descendants_only: parameters.descendants_only ?? false,
- });
- this.provideValue('result', response);
- }
-}
-
-module.exports = {
- commands: {
- mkdir: MkdirCommand,
- write: WriteCommand,
- shortcut: ShortcutCommand,
- symlink: SymlinkCommand,
- delete: DeleteCommand,
- }
-};
diff --git a/packages/backend/src/filesystem/core/.gitignore b/packages/backend/src/filesystem/core/.gitignore
deleted file mode 100644
index dc7e0c2bf3..0000000000
--- a/packages/backend/src/filesystem/core/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Typescript directory
-*.js
\ No newline at end of file
diff --git a/packages/backend/src/filesystem/core/BackendAPI.ts b/packages/backend/src/filesystem/core/BackendAPI.ts
deleted file mode 100644
index 5eb1455352..0000000000
--- a/packages/backend/src/filesystem/core/BackendAPI.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { ISelector } from "./Selector";
-
-type PuterUserID = number;
-
-export const enum FSBackendSupportFlags {
- None = 0,
-
- // Platform-related flags
- PlatformCaseSensitive = 1 << 1,
-
- // Puter support flags
- // PuterStatOwner indicates the backend can store `user_id`
- PuterStatOwner = 1 << 2,
- // PuterStatApp indicates the backend can store `associated_app_id`
- PuterStatApp = 1 << 3,
-
- // DetailVerboseReaddir indicates the backend will provide a full
- // stat() result for each entry in readdir().
- DetailVerboseReaddir = 1 << 4,
-}
-
-export const enum FSNodeType {
- File,
- Directory,
- PuterShortcut,
- SymbolicLink,
- KVStore,
- Socket,
-}
-
-export interface IOverwriteOptions {
- readonly overwrite: boolean;
- UserID: PuterUserID,
-}
-
-export interface IWriteOptions extends IOverwriteOptions {
- readonly create: boolean;
-}
-
-export interface IDeleteOptions {
- readonly recursive: boolean;
-}
-
-export interface IStatOptions {
- followSymlinks?: boolean;
-}
-
-export interface IStatResult {
- uuid: string;
- name: string;
- type: FSNodeType;
- size: number;
- mtime: Date;
- ctime: Date;
- atime: Date;
- immutable: boolean;
-}
-
-export interface IMiniStatResult {
- uuid: string;
- name: string;
- type: FSNodeType;
-}
-
-type ReaddirResult = IMiniStatResult | IStatResult;
-
-export interface IMkdirOptions {
- // Not for permission checks by the storage backend.
- // A supporting storage backend will simply store this and
- // return it in the stat() call.
- UserID: PuterUserID,
-}
-
-export interface BackendAPI {
- stat (selector: ISelector, options: IStatOptions): Promise;
- readdir (selector: ISelector): Promise<[string, ReaddirResult][]>;
-
- mkdir (selector: ISelector, name: string): Promise;
- copy (from: ISelector, to: ISelector, options: IOverwriteOptions): Promise;
- rename (from: ISelector, to: ISelector, options: IOverwriteOptions): Promise;
- delete (selector: ISelector, options: IDeleteOptions): Promise;
-
- read_file (selector: ISelector): Promise;
- write_file (selector: ISelector, data: Buffer, options: IOverwriteOptions): Promise;
-}
diff --git a/packages/backend/src/filesystem/core/Selector.ts b/packages/backend/src/filesystem/core/Selector.ts
deleted file mode 100644
index 82546c2ff6..0000000000
--- a/packages/backend/src/filesystem/core/Selector.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import * as _path from 'path';
-import * as _util from 'util';
-
-type TemporeryNodeType = any;
-
-export interface ISelector {
- describe (showDebug?: boolean): string;
- setPropertiesKnownBySelector (node: object): void;
-}
-
-export class NodePathSelector {
- public value: string;
-
- constructor (path: string) {
- this.value = path;
- }
-
- public describe (showDebug?: boolean): string {
- return this.value;
- }
-
- public setPropertiesKnownBySelector (node: TemporeryNodeType): void {
- node.path = this.value;
- node.name = _path.basename(this.value);
- }
-}
-
-export class NodeInternalUIDSelector {
- public value: string;
-
- constructor (uid: string) {
- this.value = uid;
- }
-
- public describe (showDebug?: boolean): string {
- return `[uid:${this.value}]`;
- }
-
- public setPropertiesKnownBySelector (node: TemporeryNodeType): void {
- node.uid = this.value;
- }
-}
-
-export class NodeInternalIDSelector {
- constructor (
- public service: string,
- public id: number,
- public debugInfo: any
- ) { }
-
- public describe (showDebug?: boolean): string {
- if ( showDebug ) {
- return `[db:${this.id}] (${
- _util.inspect(this.debugInfo)
- })`;
- }
- return `[db:${this.id}]`;
- }
-
- public setPropertiesKnownBySelector (node: TemporeryNodeType): void {
- if ( this.service === 'mysql' ) {
- node.id = this.id;
- }
- }
-}
diff --git a/packages/backend/src/filesystem/hl_operations/definitions.js b/packages/backend/src/filesystem/hl_operations/definitions.js
deleted file mode 100644
index 6ba90088bd..0000000000
--- a/packages/backend/src/filesystem/hl_operations/definitions.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { BaseOperation } = require('../../services/OperationTraceService');
-
-class HLFilesystemOperation extends BaseOperation {}
-
-module.exports = {
- HLFilesystemOperation
-};
diff --git a/packages/backend/src/filesystem/hl_operations/hl_mkdir.js b/packages/backend/src/filesystem/hl_operations/hl_mkdir.js
deleted file mode 100644
index 86f84ca77a..0000000000
--- a/packages/backend/src/filesystem/hl_operations/hl_mkdir.js
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { chkperm } = require('../../helpers');
-
-const { RootNodeSelector, NodeChildSelector, NodePathSelector } = require("../node/selectors");
-const APIError = require('../../api/APIError');
-
-const FSNodeParam = require('../../api/filesystem/FSNodeParam');
-const StringParam = require('../../api/filesystem/StringParam');
-const FlagParam = require("../../api/filesystem/FlagParam");
-const UserParam = require('../../api/filesystem/UserParam');
-const FSNodeContext = require('../FSNodeContext');
-const { ContextAwareTrait } = require('../../traits/ContextAwareTrait');
-const { OtelTrait } = require('../../traits/OtelTrait');
-const { HLFilesystemOperation } = require('./definitions');
-const { is_valid_path } = require('../validation');
-const { HLRemove } = require('./hl_remove');
-
-class MkTree extends HLFilesystemOperation {
- static DESCRIPTION = `
- High-level operation for making directory trees
-
- The following input for 'tree':
- ['a/b/c', ['i/j/k'], ['p', ['q'], ['r/s']]]]
-
- Would create a directory tree like this:
- a
- └── b
- └── c
- ├── i
- │ └── j
- │ └── k
- └── p
- ├── q
- └── r
- └── s
- `
-
- static PARAMETERS = {
- parent: new FSNodeParam('parent', { optional: true }),
- }
-
- static PROPERTIES = {
- leaves: () => [],
- directories_created: () => [],
- }
-
- async _run () {
- const { values, context } = this;
-
- await this.create_branch_({
- parent_node: values.parent || await fs.node(new RootNodeSelector()),
- tree: values.tree,
- parent_exists: true,
- });
- }
-
- async create_branch_ ({ parent_node, tree, parent_exists }) {
- const { context, values } = this;
- const { _path } = this.modules;
- const fs = context.get('services').get('filesystem');
- const user = context.get('user');
-
- const trunk = tree[0];
- const branches = tree.slice(1);
-
- let current = parent_node.selector;
- let lastCreatedSelector = parent_node.selector;
-
- // trunk = a/b/c
-
- const dirs = trunk === '.' ? []
- : trunk.split('/').filter(Boolean);
-
- console.log('DIRS', dirs, parent_node.selector.describe())
-
- // dirs = [a, b, c]
-
- let parent_did_exist = parent_exists;
-
- // This is just a loop that goes through each part of the path
- // until it finds the first directory that doesn't exist yet.
- let i = 0;
- if ( parent_exists ) for ( ; i < dirs.length ; i++ ) {
- const dir = dirs[i];
- const currentParent = current;
- current = new NodeChildSelector(current, dir);
-
- const maybe_dir = await fs.node(current);
-
- if ( maybe_dir.isRoot ) continue;
- if ( await maybe_dir.isUserDirectory() ) continue;
-
- if ( await maybe_dir.exists() ) {
-
- if ( await maybe_dir.get('type') !== FSNodeContext.TYPE_DIRECTORY ) {
- throw APIError.create('dest_is_not_a_directory');
- }
-
- continue;
- }
-
- current = currentParent;
- parent_exists = false;
- break;
- }
-
- if ( parent_did_exist && ! parent_exists ) {
- const node = await fs.node(current);
- const has_perm = await chkperm(await node.get('entry'), user.id, 'write');
- if ( ! has_perm ) throw APIError.create('permission_denied');
- }
-
- // This next loop creates the new directories
-
- // We break into a second loop because we know none of these directories
- // exist yet. If we continued those checks each child operation would
- // wait for the previous one to complete because FSNodeContext::fetchEntry
- // will notice ResourceService has a lock on the previous operation
- // we started.
-
- // In this way it goes nyyyoooom because all the database inserts
- // happen concurrently (and probably end up in the same batch).
-
- for ( ; i < dirs.length ; i++ ) {
- const dir = dirs[i];
- const currentParent = current;
- current = new NodeChildSelector(current, dir);
-
- const node = await fs.mkdir_2({
- parent: await fs.node(currentParent),
- name: current.name,
- user,
- })
-
- current = node.selector;
-
- this.directories_created.push(node);
- }
-
- const bottom_parent = await fs.node(current);
-
- console.log('BOTTOM PARENT', bottom_parent.selector.describe());
-
- if ( branches.length === 0 ) {
- this.leaves.push(bottom_parent);
- }
-
- for ( const branch of branches ) {
- await this.create_branch_({
- parent_node: bottom_parent,
- tree: branch,
- parent_exists,
- });
- }
- }
-}
-
-class QuickMkdir extends HLFilesystemOperation {
- async _run () {
- const { context, values } = this;
- let { parent, path } = values;
- const { _path } = this.modules;
- const fs = context.get('services').get('filesystem');
- const user = context.get('user');
-
- parent = parent || await fs.node(new RootNodeSelector());
-
- let current = parent.selector;
-
- const dirs = path === '.' ? []
- : path.split('/').filter(Boolean);
-
- const api = require('@opentelemetry/api');
- const currentSpan = api.trace.getSpan(api.context.active());
- if ( currentSpan ) {
- currentSpan.setAttribute('path', path);
- currentSpan.setAttribute('dirs', dirs.join('/'));
- currentSpan.setAttribute('parent', parent.selector.describe());
- }
-
-
-
- for ( let i=0 ; i < dirs.length ; i++ ) {
- const dir = dirs[i];
- const currentParent = current;
- current = new NodeChildSelector(current, dir);
-
- const node = await fs.mkdir_2({
- parent: await fs.node(currentParent),
- name: current.name,
- user,
- })
-
- current = node.selector;
-
- // this.directories_created.push(node);
- }
-
- this.created = await fs.node(current);
- }
-}
-
-class HLMkdir extends HLFilesystemOperation {
- static DESCRIPTION = `
- High-level mkdir operation.
-
- This operation is a wrapper around the low-level mkdir operation.
- It provides the following features:
- - create missing parent directories
- - overwrite existing files
- - dedupe names
- - create shortcuts
- `
-
- static PARAMETERS = {
- parent: new FSNodeParam('parent', { optional: true }),
- path: new StringParam('path'),
- overwrite: new FlagParam('overwrite', { optional: true }),
- create_missing_parents: new FlagParam('create_missing_parents', { optional: true }),
- user: new UserParam(),
-
- shortcut_to: new FSNodeParam('shortcut_to', { optional: true }),
- };
-
- static MODULES = {
- _path: require('path'),
- socketio: require('../../socketio.js'),
- }
-
- static PROPERTIES = {
- parent_directories_created: () => [],
- }
-
- static TRAITS = [
- new OtelTrait([
- '_get_existing_parent',
- '_create_parents',
- ]),
- ]
-
- async _run () {
- const { context, values } = this;
- const { _path, socketio } = this.modules;
- const fs = context.get('services').get('filesystem');
-
- if ( ! is_valid_path(values.path, {
- no_relative_components: true,
- allow_path_fragment: true,
- }) ) {
- throw APIError.create('field_invalid', null, {
- key: 'path',
- expected: 'valid path',
- got: 'invalid path',
- });
- }
-
- let parent_node = values.parent || await fs.node(new RootNodeSelector());
- console.log('USING PARENT', parent_node.selector.describe());
- let target_basename = _path.basename(values.path);
-
- const top_parent = values.create_missing_parents
- ? await this._create_top_parent({ top_parent: parent_node })
- : await this._get_existing_top_parent({ top_parent: parent_node })
- ;
-
- // `parent_node` becomes the parent of the last directory name
- // specified under `path`.
- parent_node = await this._create_parents({
- parent_node: top_parent,
- user: values.user,
- });
-
- const has_perm = await chkperm(await parent_node.get('entry'), values.user.id, 'write');
- if ( ! has_perm ) throw APIError.create('permission_denied');
-
- const existing = await fs.node(
- new NodeChildSelector(parent_node.selector, target_basename)
- );
-
- await existing.fetchEntry();
-
- if ( existing.found ) {
- const { overwrite, dedupe_name, create_missing_parents } = values;
- if ( overwrite ) {
- // TODO: tag rm operation somehow
- const has_perm = await chkperm(await existing.get('entry'), values.user.id, 'write');
- if ( ! has_perm ) throw APIError.create('permission_denied');
- const hl_remove = new HLRemove();
- await hl_remove.run({
- target: existing,
- user: values.user,
- recursive: true,
- });
- }
- else if ( dedupe_name ) {
- const fsEntryFetcher = context.get('services').get('fsEntryFetcher');
- for ( let i=1 ;; i++ ) {
- let try_new_name = `${target_basename} (${i})`;
- const exists = await fsEntryFetcher.nameExistsUnderParent(
- existing.entry.parent_uid, try_new_name
- );
- if ( ! exists ) {
- target_basename = try_new_name;
- break;
- }
- }
- }
- else if ( create_missing_parents ) {
- if ( ! existing.entry.is_dir ) {
- throw APIError.create('dest_is_not_a_directory');
- }
- this.created = existing;
- this.used_existing = true;
- return {};
- } else {
- throw APIError.create('item_with_same_name_exists', null, {
- entry_name: target_basename,
- });
- }
- }
-
- if ( values.shortcut_to ) {
- const shortcut_to = values.shortcut_to;
- if ( ! await shortcut_to.exists() ) {
- throw APIError.create('shortcut_to_does_not_exist');
- }
- if ( ! shortcut_to.entry.is_dir ) {
- throw APIError.create('shortcut_target_is_a_directory');
- }
- const has_perm = await chkperm(shortcut_to.entry, values.user.id, 'read');
- if ( ! has_perm ) throw APIError.create('forbidden');
-
- this.created = await fs.mkshortcut({
- parent: parent_node,
- name: target_basename,
- user: values.user,
- target: shortcut_to,
- });
-
- await this.created.awaitStableEntry();
- return await this.created.getSafeEntry();
- }
-
- this.created = await fs.mkdir_2({
- parent: parent_node,
- name: target_basename,
- user: values.user,
- });
-
- const all_nodes = [
- ...this.parent_directories_created,
- this.created,
- ];
-
- await Promise.all(all_nodes.map(node => node.awaitStableEntry()));
-
- const response = await this.created.getSafeEntry();
- response.parent_dirs_created = [];
- for ( const node of this.parent_directories_created ) {
- response.parent_dirs_created.push(await node.getSafeEntry());
- }
- response.requested_path = values.path;
-
- return response;
- }
-
- async _create_parents ({ parent_node, user }) {
- const { context, values } = this;
- const { _path } = this.modules;
- const fs = context.get('services').get('filesystem');
-
- let current = parent_node.selector;
- let lastCreatedSelector = null;
-
- const tree_op = new MkTree();
- await tree_op.run({
- parent: parent_node,
- tree: [_path.dirname(values.path)],
- });
-
- this.parent_directories_created = tree_op.directories_created;
-
- return tree_op.leaves[0];
- }
-
- async _get_existing_parent ({ parent_node }) {
- const { context, values } = this;
- const { _path } = this.modules;
- const fs = context.get('services').get('filesystem');
-
- const target_dirname = _path.dirname(values.path);
- const dirs = target_dirname === '.' ? []
- : target_dirname.split('/').filter(Boolean);
-
- let current = parent_node.selector;
- for ( let i=0 ; i < dirs.length ; i++ ) {
- current = new NodeChildSelector(current, dirs[i]);
- }
-
- const node = await fs.node(current);
-
- if ( ! await node.exists() ) {
- console.log('HERE FROM', node.selector.describe(), parent_node.selector.describe());
- throw APIError.create('dest_does_not_exist');
- }
-
- if ( ! node.entry.is_dir ) {
- throw APIError.create('dest_is_not_a_directory');
- }
-
- return node;
- }
-
- async _create_top_parent ({ top_parent }) {
- if ( await top_parent.exists() ) {
- if ( ! top_parent.entry.is_dir ) {
- throw APIError.create('dest_is_not_a_directory');
- }
- return top_parent;
- }
-
- const maybe_path_selector =
- top_parent.get_selector_of_type(NodePathSelector);
-
- if ( ! maybe_path_selector ) {
- throw APIError.create('dest_does_not_exist');
- }
-
- const path = maybe_path_selector.value;
-
- const fs = this.context.get('services').get('filesystem');
-
- const tree_op = new MkTree();
- await tree_op.run({
- parent: await fs.node(new RootNodeSelector()),
- tree: [path],
- });
-
- return tree_op.leaves[0];
- }
-
- async _get_existing_top_parent ({ top_parent }) {
- if ( ! await top_parent.exists() ) {
- throw APIError.create('dest_does_not_exist');
- }
-
- if ( ! top_parent.entry.is_dir ) {
- throw APIError.create('dest_is_not_a_directory');
- }
-
- return top_parent;
- }
-}
-
-module.exports = {
- QuickMkdir,
- HLMkdir,
- MkTree,
-};
diff --git a/packages/backend/src/filesystem/hl_operations/hl_move.js b/packages/backend/src/filesystem/hl_operations/hl_move.js
deleted file mode 100644
index a545f517d4..0000000000
--- a/packages/backend/src/filesystem/hl_operations/hl_move.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { chkperm, validate_fsentry_name, is_ancestor_of } = require("../../helpers");
-const { LLMove } = require("../ll_operations/ll_move");
-const { RootNodeSelector } = require("../node/selectors");
-const { HLFilesystemOperation } = require("./definitions");
-const { MkTree } = require("./hl_mkdir");
-const { HLRemove } = require("./hl_remove");
-const { TYPE_DIRECTORY } = require("../FSNodeContext");
-const config = require("../../config");
-
-class HLMove extends HLFilesystemOperation {
- static MODULES = {
- _path: require('path'),
- }
- async _run () {
- const { _path } = this.modules;
-
- const { context, values } = this;
- const svc = context.get('services');
- const fs = svc.get('filesystem');
-
- const new_metadata = typeof values.new_metadata === 'string'
- ? values.new_metadata : JSON.stringify(values.new_metadata);
-
- // !! new_name, create_missing_parents, overwrite, dedupe_name
-
- let parent = values.destination_or_parent;
- let dest = null;
- const source = values.source;
-
- if ( await source.get('is-root') ) {
- throw APIError.create('immutable');
- }
- if ( await parent.get('is-root') ) {
- throw APIError.create('cannot_copy_to_root');
- }
-
- if ( ! await source.exists() ) {
- throw APIError.create('source_does_not_exist');
- }
-
- if ( ! await chkperm(source.entry, values.user.id, 'cp') ) {
- throw APIError.create('forbidden');
- }
-
- if ( source.entry.immutable ) {
- throw APIError.create('immutable');
- }
-
- // If the "parent" is a file, then it's actually our destination; not the parent.
- if ( ! values.new_name && await parent.exists() && await parent.get('type') !== TYPE_DIRECTORY ) {
- dest = parent;
- parent = await dest.getParent();
- }
-
- if ( ! await parent.exists() ) {
- if ( ! parent.path || ! values.create_missing_parents ) {
- throw APIError.create('dest_does_not_exist');
- }
-
- const tree_op = new MkTree();
- await tree_op.run({
- parent: await fs.node(new RootNodeSelector()),
- tree: [parent.path],
- });
-
- parent = tree_op.leaves[0];
- }
-
- await parent.fetchEntry();
- if ( ! await chkperm(parent.entry, values.user.id, 'write') ) {
- throw APIError.create('forbidden');
- }
- if ( await parent.get('type') !== TYPE_DIRECTORY ) {
- throw APIError.create('dest_is_not_a_directory');
- }
-
- let source_user, dest_user;
-
- // 3. Verify cross-user size constraints
- const src_user_id = await source.get('user_id');
- const par_user_id = await parent.get('user_id');
- if ( src_user_id !== par_user_id ) {
- source_user = await get_user({id: src_user_id});
- if(source_user.id !== par_user_id)
- dest_user = await get_user({id: par_user_id});
- else
- dest_user = source_user;
- await source.fetchSize();
- const item_size = source.entry.size;
- let capacity = config.is_storage_limited ? (dest_user.free_storage === undefined || dest_user.free_storage === null) ? config.storage_capacity : dest_user.free_storage : config.available_device_storage;
- if(capacity - await df(dest_user.id) - item_size < 0){
- throw APIError.create('storage_limit_reached');
- }
- }
-
- let target_name = values.new_name ?? await source.get('name');
- const metadata = new_metadata ?? await source.get('metadata');
-
- try {
- validate_fsentry_name(target_name);
- } catch (e) {
- throw APIError.create(400, e);
- }
-
- if ( dest === null ) {
- dest = await parent.getChild(target_name);
- }
-
- const src_uid = await source.get('uid');
- // const dst_uid = await dest.get('uid');
- const par_uid = await parent.get('uid');
-
- if ( src_uid === par_uid ) {
- throw APIError.create('source_and_dest_are_the_same');
- }
- if ( await is_ancestor_of(src_uid, par_uid) ) {
- throw APIError('cannot_move_item_into_itself');
- }
-
- let overwritten;
- if ( await dest.exists() ) {
- if ( ! values.overwrite && ! values.dedupe_name ) {
- throw APIError.create('item_with_same_name_exists', null, {
- entry_name: target_name,
- });
- }
-
- if ( values.dedupe_name ) {
- const svc_fsEntryFetcher = svc.get('fsEntryFetcher');
- const target_ext = _path.extname(target_name);
- const target_noext = _path.basename(target_name, target_ext);
- for ( let i=1 ;; i++ ) {
- const try_new_name = `${target_noext} (${i})${target_ext}`;
- const exists = await svc_fsEntryFetcher.nameExistsUnderParent(
- parent.uid, try_new_name
- );
- if ( ! exists ) {
- target_name = try_new_name;
- break;
- }
- }
-
- dest = await parent.getChild(target_name);
- }
- else if ( values.overwrite ) {
- overwritten = await dest.getSafeEntry();
- const hl_remove = new HLRemove();
- await hl_remove.run({
- target: dest,
- user: values.user,
- });
- }
- else { throw new Error('unreachable'); }
- }
-
- const old_path = await source.get('path');
-
- const ll_move = new LLMove();
- const source_new = await ll_move.run({
- source,
- parent,
- target_name,
- user: values.user,
- metadata: metadata,
- });
-
- await source_new.awaitStableEntry();
- await source_new.fetchSuggestedApps();
- await source_new.fetchOwner();
- return {
- moved: await source_new.getSafeEntry({ thumbnail: true }),
- overwritten,
- old_path,
- }
- }
-}
-
-module.exports = {
- HLMove,
-};
diff --git a/packages/backend/src/filesystem/hl_operations/hl_readdir.js b/packages/backend/src/filesystem/hl_operations/hl_readdir.js
deleted file mode 100644
index 7b8c413946..0000000000
--- a/packages/backend/src/filesystem/hl_operations/hl_readdir.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { chkperm } = require("../../helpers");
-const { TYPE_DIRECTORY } = require("../FSNodeContext");
-const { LLReadDir } = require("../ll_operations/ll_readdir");
-const { HLFilesystemOperation } = require("./definitions");
-
-class HLReadDir extends HLFilesystemOperation {
- async _run () {
- const { subject, user, no_thumbs, no_assocs, actor } = this.values;
-
- if ( ! await subject.exists() ) {
- throw APIError.create('subject_does_not_exist');
- }
-
- if ( await subject.get('type') !== TYPE_DIRECTORY ) {
- const { context } = this;
- const svc_acl = context.get('services').get('acl');
- if ( ! await svc_acl.check(actor, subject, 'see') ) {
- throw await svc_acl.get_safe_acl_error(actor, subject, 'see');
- }
- return [subject];
- }
-
- const ll_readdir = new LLReadDir();
- const children = await ll_readdir.run(this.values);
-
- return Promise.all(children.map(async child => {
- // await child.fetchAll(null, user);
- if ( ! no_assocs ) {
- await child.fetchSuggestedApps(user);
- await child.fetchSubdomains(user);
- }
- const fs = require('fs');
- // fs.appendFileSync('/tmp/children.log',
- // JSON.stringify({
- // no_thumbs,
- // no_assocs,
- // entry: child.entry,
- // }) + '\n');
- return await child.getSafeEntry({ thumbnail: ! no_thumbs });
- }));
- }
-}
-
-module.exports = {
- HLReadDir,
-};
diff --git a/packages/backend/src/filesystem/hl_operations/hl_stat.js b/packages/backend/src/filesystem/hl_operations/hl_stat.js
deleted file mode 100644
index ed5d21f1ea..0000000000
--- a/packages/backend/src/filesystem/hl_operations/hl_stat.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { chkperm } = require("../../helpers");
-const { Context } = require("../../util/context");
-const { HLFilesystemOperation } = require("./definitions");
-
-class HLStat extends HLFilesystemOperation {
- static MODULES = {
- ['mime-types']: require('mime-types'),
- }
-
- async _run () {
- const {
- subject, user,
- return_subdomains,
- return_permissions,
- return_versions,
- return_size,
- } = this.values;
-
- await subject.fetchEntry();
-
- // file not found
- if( ! subject.found ) throw APIError.create('subject_does_not_exist');
-
- await subject.fetchOwner();
-
- const context = Context.get();
- const svc_acl = context.get('services').get('acl');
- const actor = context.get('actor');
- if ( ! await svc_acl.check(actor, subject, 'read') ) {
- throw await svc_acl.get_safe_acl_error(actor, subject, 'read');
- }
-
- // check permission
- // TODO: this check is redundant now that ACL is used;
- // we will need to remove it to implement user-user permissions
- if(user && !await chkperm(subject.entry, user.id, 'stat')){
- throw { code:`forbidden`, message: `permission denied.`};
- }
-
- // TODO: why is this specific to stat?
- const mime = this.require('mime-types');
- const contentType = mime.contentType(subject.entry.name)
- subject.entry.type = contentType ? contentType : null;
-
- if (return_size) await subject.fetchSize(user);
- if (return_subdomains) await subject.fetchSubdomains(user)
- if (return_permissions) await subject.fetchShares();
- if (return_versions) await subject.fetchVersions();
-
- await subject.fetchIsEmpty();
-
- return await subject.getSafeEntry();
- }
-}
-
-module.exports = {
- HLStat
-};
diff --git a/packages/backend/src/filesystem/hl_operations/hl_write.js b/packages/backend/src/filesystem/hl_operations/hl_write.js
deleted file mode 100644
index c36787f5eb..0000000000
--- a/packages/backend/src/filesystem/hl_operations/hl_write.js
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const FSNodeParam = require("../../api/filesystem/FSNodeParam");
-const FlagParam = require("../../api/filesystem/FlagParam");
-const StringParam = require("../../api/filesystem/StringParam");
-const UserParam = require("../../api/filesystem/UserParam");
-const config = require("../../config");
-const { chkperm, validate_fsentry_name } = require("../../helpers");
-const { TeePromise } = require("../../util/promise");
-const { pausing_tee, logging_stream, offset_write_stream } = require("../../util/streamutil");
-const { TYPE_DIRECTORY } = require("../FSNodeContext");
-const { LLRead } = require("../ll_operations/ll_read");
-const { RootNodeSelector, NodePathSelector } = require("../node/selectors");
-const { is_valid_node_name } = require("../validation");
-const { HLFilesystemOperation } = require("./definitions");
-const { MkTree } = require("./hl_mkdir");
-
-class WriteCommonTrait {
- install_in_instance (instance) {
- instance._verify_size = async function () {
- if (
- this.values.file &&
- this.values.file.size > config.max_file_size
- ) {
- throw APIError.create('file_too_large', null, {
- max_size: config.max_file_size,
- })
- }
-
- if (
- this.values.thumbnail &&
- this.values.thumbnail.size > config.max_thumbnail_size
- ) {
- throw APIError.create('thumbnail_too_large', null, {
- max_size: config.max_thumbnail_size,
- })
- }
- }
-
- instance._verify_room = async function () {
- if ( ! this.values.file ) return;
-
- const sizeService = this.context.get('services').get('sizeService');
- const { file, user } = this.values;
-
- const usage = await sizeService.get_usage(user.id);
- let capacity = config.is_storage_limited ? user.free_storage == undefined
- ? config.storage_capacity : user.free_storage : config.available_device_storage;
- if( capacity - usage - file.size < 0 ) {
- throw APIError.create('storage_limit_reached');
- }
- }
- }
-}
-
-class HLWrite extends HLFilesystemOperation {
- static DESCRIPTION = `
- High-level write operation.
-
- This operation is a wrapper around the low-level write operation.
- It provides the following features:
- - create missing parent directories
- - overwrite existing files
- - deduplicate files with the same name
- // - create thumbnails; this will happen in low-level operation for now
- - create shortcuts
- `
-
- static TRAITS = [
- new WriteCommonTrait(),
- ]
-
- static PARAMETERS = {
- // the parent directory, or a filepath that doesn't exist yet
- destination_or_parent: new FSNodeParam('path'),
-
- // if specified, destination_or_parent must be a directory
- specified_name: new StringParam('specified_name', { optional: true }),
-
- // used if specified_name is undefined and destination_or_parent is a directory
- // NB: if destination_or_parent does not exist and create_missing_parents
- // is true then destination_or_parent will be a directory
- fallback_name: new StringParam('fallback_name', { optional: true }),
-
- overwrite: new FlagParam('overwrite', { optional: true }),
- dedupe_name: new FlagParam('dedupe_name', { optional: true }),
-
- // other options
- shortcut_to: new FSNodeParam('shortcut_to', { optional: true }),
- create_missing_parents: new FlagParam('create_missing_parents', { optional: true }),
- user: new UserParam(),
-
- // file: multer.File
- };
-
- static MODULES = {
- _path: require('path'),
- socketio: require('../../socketio.js'),
- mime: require('mime-types'),
- }
-
- async _run () {
- const { context, values } = this;
- const { _path } = this.modules;
-
- const fs = context.get('services').get('filesystem');
-
- let parent = values.destination_or_parent;
- let destination = null;
-
- await this._verify_size();
- await this._verify_room();
-
- this.checkpoint('before parent exists check');
-
- if ( ! await parent.exists() && values.create_missing_parents ) {
- if ( ! (parent.selector instanceof NodePathSelector) ) {
- throw APIError.create('dest_does_not_exist', null, {
- parent: parent.selector,
- });
- }
- const path = parent.selector.value;
- this.log.noticeme('EXPECTED PATH', { path });
- const tree_op = new MkTree();
- await tree_op.run({
- parent: await fs.node(new RootNodeSelector()),
- tree: [path],
- });
-
- parent = await fs.node(new NodePathSelector(path));
- const parent_exists_now = await parent.exists();
- if ( ! parent_exists_now ) {
- this.log.error('FAILED TO CREATE DESTINATION');
- throw APIError.create('dest_does_not_exist', null, {
- parent: parent.selector,
- });
- }
- }
-
- if ( parent.isRoot ) {
- throw APIError.create('cannot_write_to_root');
- }
-
- let target_name = values.specified_name || values.fallback_name;
-
- // If a name is specified then the destination must be a directory
- if ( values.specified_name ) {
- this.checkpoint('specified name condition');
- if ( ! await parent.exists() ) {
- throw APIError.create('dest_does_not_exist');
- }
- if ( await parent.get('type') !== TYPE_DIRECTORY ) {
- throw APIError.create('dest_is_not_a_directory');
- }
- target_name = values.specified_name;
- }
-
- this.checkpoint('check parent DNE or is not a directory');
- if (
- ! await parent.exists() ||
- await parent.get('type') !== TYPE_DIRECTORY
- ) {
- destination = parent;
- parent = await destination.getParent();
- target_name = destination.name;
- }
-
- if ( parent.isRoot ) {
- throw APIError.create('cannot_write_to_root');
- }
-
- if ( values.user && ! await chkperm(await parent.get('entry'), values.user.id, 'write') ) {
- throw APIError.create('forbidden');
- }
-
- try {
- // old validator is kept here to avoid changing the
- // error messages; eventually is_valid_node_name
- // will support more detailed error reporting
- validate_fsentry_name(target_name);
- if ( ! is_valid_node_name(target_name) ) {
- throw { message: 'invalid node name' };
- }
- } catch (e) {
- throw APIError.create('invalid_file_name', null, {
- name: target_name,
- reason: e.message,
- });
- }
-
- if ( ! destination ) {
- destination = await parent.getChild(target_name);
- }
-
- let is_overwrite = false;
-
- // TODO: Gotta come up with a reasonable guideline for if/when we put
- // object members in the scope; it feels too arbitrary right now.
- const { overwrite, dedupe_name } = values;
-
- this.checkpoint('before overwrite behaviours');
-
- const dest_exists = await destination.exists();
-
- if ( values.offset !== undefined && ! dest_exists ) {
- throw APIError.create('offset_without_existing_file');
- }
-
- if ( dest_exists ) {
- console.log('DESTINATION EXISTS', dedupe_name)
- if ( ! overwrite && ! dedupe_name ) {
- throw APIError.create('item_with_same_name_exists', null, {
- entry_name: target_name
- });
- }
-
- if ( dedupe_name ) {
- const fsEntryFetcher = context.get('services').get('fsEntryFetcher');
- const target_ext = _path.extname(target_name);
- const target_noext = _path.basename(target_name, target_ext);
- for ( let i=1 ;; i++ ) {
- const try_new_name = `${target_noext} (${i})${target_ext}`;
- const exists = await fsEntryFetcher.nameExistsUnderParent(
- parent.uid, try_new_name
- );
- if ( ! exists ) {
- target_name = try_new_name;
- break;
- }
- }
-
- destination = await parent.getChild(target_name);
- }
-
- else if ( overwrite ) {
- if ( await destination.get('immutable') ) {
- throw APIError.create('immutable');
- }
- if ( await destination.get('type') === TYPE_DIRECTORY ) {
- throw APIError.create('cannot_overwrite_a_directory');
- }
- is_overwrite = true;
- }
- }
-
- if ( values.shortcut_to ) {
- this.checkpoint('shortcut condition');
- const shortcut_to = values.shortcut_to;
- if ( ! await shortcut_to.exists() ) {
- throw APIError.create('shortcut_to_does_not_exist');
- }
- if ( await shortcut_to.get('type') === TYPE_DIRECTORY ) {
- throw APIError.create('shortcut_target_is_a_directory');
- }
- const has_perm = await chkperm(shortcut_to.entry, values.user.id, 'read');
- if ( ! has_perm ) throw APIError.create('permission_denied');
-
- this.created = await fs.mkshortcut({
- parent,
- name: target_name,
- user: values.user,
- target: shortcut_to,
- });
-
- await this.created.awaitStableEntry();
- await this.created.fetchEntry({ thumbnail: true });
- return await this.created.getSafeEntry();
- }
-
- this.checkpoint('before thumbnail');
-
- let thumbnail_promise = new TeePromise();
- let thumbnail; (async () => {
- const reason = await (async () => {
- const { mime } = this.modules;
- const thumbnails = context.get('services').get('thumbnails');
- if ( values.thumbnail ) return 'already thumbnail';
-
- const content_type = mime.contentType(target_name);
- console.log('CONTENT TYPE', content_type);
- if ( ! content_type ) return 'no content type';
- if ( ! thumbnails.is_supported_mimetype(content_type) ) return 'unsupported content type';
- if ( ! thumbnails.is_supported_size(values.file.size) ) return 'too large';
-
- // Create file object for thumbnail by either using an existing
- // buffer (ex: /download endpoint) or by forking a stream
- // (ex: /write and /batch endpoints).
- const thumb_file = (() => {
- if ( values.file.buffer ) return values.file;
-
- const [replace_stream, thumbnail_stream] =
- pausing_tee(values.file.stream, 2);
-
- values.file.stream = replace_stream;
- return { ...values.file, stream: thumbnail_stream };
- })();
-
- thumbnail = await thumbnails.thumbify(thumb_file);
- thumbnail_promise.resolve(thumbnail);
- })();
- if ( reason ) {
- console.log('REASON', reason);
- thumbnail_promise.resolve(undefined);
-
- // values.file.stream = logging_stream(values.file.stream);
- }
- })();
-
- this.checkpoint('before delegate');
-
- if ( values.offset !== undefined ) {
- if ( ! is_overwrite ) {
- throw APIError.create('offset_requires_overwrite');
- }
-
- if ( ! values.file.stream ) {
- throw APIError.create('offset_requires_stream');
- }
-
- const replace_length = values.file.size;
- let dst_size = await destination.get('size');
- if ( values.offset > dst_size ) {
- values.offset = dst_size;
- }
-
- if ( values.offset + values.file.size > dst_size ) {
- dst_size = values.offset + values.file.size;
- }
-
- const ll_read = new LLRead();
- const read_stream = await ll_read.run({
- fsNode: destination,
- });
-
- values.file.stream = offset_write_stream({
- originalDataStream: read_stream,
- newDataStream: values.file.stream,
- offset: values.offset,
- replace_length,
- });
- values.file.size = dst_size;
- }
-
- if ( is_overwrite ) {
- this.written = await fs.owrite({
- node: destination,
- user: values.user,
- file: values.file,
- tmp: {
- socket_id: values.socket_id,
- operation_id: values.operation_id,
- item_upload_id: values.item_upload_id,
- },
- fsentry_tmp: {
- thumbnail_promise,
- },
- message: values.message,
- });
- } else {
- this.written = await fs.cwrite({
- parent,
- name: target_name,
- user: values.user,
- file: values.file,
- tmp: {
- socket_id: values.socket_id,
- operation_id: values.operation_id,
- item_upload_id: values.item_upload_id,
- },
- fsentry_tmp: {
- thumbnail_promise,
- },
- message: values.message,
- app_id: values.app_id,
- });
- }
-
- this.checkpoint('after delegate');
-
- await this.written.awaitStableEntry();
- this.checkpoint('after await stable entry');
- const response = await this.written.getSafeEntry({ thumbnail: true });
- this.checkpoint('after get safe entry');
-
- return response;
- }
-}
-
-module.exports = {
- HLWrite,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/definitions.js b/packages/backend/src/filesystem/ll_operations/definitions.js
deleted file mode 100644
index 8f2db1cb23..0000000000
--- a/packages/backend/src/filesystem/ll_operations/definitions.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { BaseOperation } = require("../../services/OperationTraceService");
-
-class LLFilesystemOperation extends BaseOperation {}
-
-module.exports = {
- LLFilesystemOperation
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_copy.js b/packages/backend/src/filesystem/ll_operations/ll_copy.js
deleted file mode 100644
index 406e90d5c2..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_copy.js
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const config = require('../../config');
-const { Context } = require('../../util/context');
-const { ParallelTasks } = require('../../util/otelutil');
-const FSNodeContext = require('../FSNodeContext');
-const { NodeUIDSelector } = require('../node/selectors');
-const { RESOURCE_STATUS_PENDING_CREATE } = require('../storage/ResourceService');
-const { UploadProgressTracker } = require('../storage/UploadProgressTracker');
-const { LLFilesystemOperation } = require('./definitions');
-
-class LLCopy extends LLFilesystemOperation {
- static MODULES = {
- _path: require('path'),
- uuidv4: require('uuid').v4,
- }
-
- async _run () {
- const { _path, uuidv4 } = this.modules;
- const { context } = this;
- const { source, parent, user, actor, target_name } = this.values;
- const svc = context.get('services');
-
- const tracer = svc.get('traceService').tracer;
- const fs = svc.get('filesystem');
- const svc_event = svc.get('event');
-
- const uuid = uuidv4();
- const ts = Math.round(Date.now()/1000);
-
- this.field('target-uid', uuid);
- this.field('source', source.selector.describe());
-
- this.checkpoint('before fetch parent entry');
- await parent.fetchEntry();
- this.checkpoint('before fetch source entry');
- await source.fetchEntry({ thumbnail: true });
- this.checkpoint('fetched source and parent entries');
-
- console.log('PATH PARAMETERS', {
- path: await parent.get('path'),
- target_name,
- })
-
- // Access Control
- {
- const svc_acl = context.get('services').get('acl');
- this.checkpoint('copy :: access control');
-
- // Check read access to source
- if ( ! await svc_acl.check(actor, source, 'read') ) {
- throw await svc_acl.get_safe_acl_error(actor, source, 'read');
- }
-
- // Check write access to destination
- if ( ! await svc_acl.check(actor, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, source, 'write');
- }
- }
-
- const raw_fsentry = {
- uuid,
- is_dir: source.entry.is_dir,
- ...(source.entry.is_shortcut ? {
- is_shortcut: source.entry.is_shortcut,
- shortcut_to: source.entry.shortcut_to,
- } :{}),
- parent_uid: parent.uid,
- name: target_name,
- created: ts,
- modified: ts,
-
- path: _path.join(await parent.get('path'), target_name),
-
- // if property exists but the value is undefined,
- // it will still be included in the INSERT, causing
- // an error
- ...(source.entry.thumbnail ?
- { thumbnail: source.entry.thumbnail } : {}),
-
- user_id: user.id,
- };
-
- svc_event.emit('fs.pending.file', {
- fsentry: FSNodeContext.sanitize_pending_entry_info(raw_fsentry),
- context: this.context,
- })
-
- this.checkpoint('emitted fs.pending.file');
-
- if ( await source.get('has-s3') ) {
- Object.assign(raw_fsentry, {
- size: source.entry.size,
- associated_app_id: source.entry.associated_app_id,
- bucket: source.entry.bucket,
- bucket_region: source.entry.bucket_region,
- });
-
- await tracer.startActiveSpan(`fs:cp:storage-copy`, async span => {
- let progress_tracker = new UploadProgressTracker();
-
- svc_event.emit('fs.storage.progress.copy', {
- upload_tracker: progress_tracker,
- context: Context.get(),
- meta: {
- item_uid: uuid,
- item_path: raw_fsentry.path,
- }
- });
-
- this.checkpoint('emitted fs.storage.progress.copy');
-
- // const storage = new PuterS3StorageStrategy({ services: svc });
- const storage = Context.get('storage');
- const state_copy = storage.create_copy();
- await state_copy.run({
- src_node: source,
- dst_storage: {
- key: uuid,
- bucket: raw_fsentry.bucket,
- bucket_region: raw_fsentry.bucket_region,
- },
- storage_api: { progress_tracker },
- });
-
- this.checkpoint('finished storage copy');
- span.end();
- });
- }
-
- {
- const svc_size = svc.get('sizeService');
- await svc_size.add_node_size(undefined, source, user);
-
- this.checkpoint('added source size');
- }
-
- const svc_resource = svc.get('resourceService');
- svc_resource.register({
- uid: uuid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- const svc_fsentry = svc.get('systemFSEntryService');
- this.log.info(`inserting entry: ` + uuid);
- const entryOp = await svc_fsentry.insert(raw_fsentry);
-
- let node;
-
- this.checkpoint('before parallel tasks');
- const tasks = new ParallelTasks({ tracer, max: 4 });
- await tracer.startActiveSpan(`fs:cp:parallel-portion`, async span => {
- this.checkpoint('starting parallel tasks');
- // Add child copy tasks if this is a directory
- if ( source.entry.is_dir ) {
- const fsEntryService = svc.get('fsEntryService');
- const children = await fsEntryService.fast_get_direct_descendants(
- source.uid
- );
- for ( const child_uuid of children ) {
- tasks.add(`fs:cp:copy-child`, async () => {
- const child_node = await fs.node(
- new NodeUIDSelector(child_uuid)
- );
- const child_name = await child_node.get('name');
- // TODO: this should be LLCopy instead
- const ll_copy = new LLCopy();
- console.log('LL Copy Start');
- await ll_copy.run({
- source: await fs.node(
- new NodeUIDSelector(child_uuid)
- ),
- parent: await fs.node(
- new NodeUIDSelector(uuid)
- ),
- user,
- target_name: child_name,
- });
- console.log('LL Copy End');
- // const hl_copy = new HLCopy();
- // await hl_copy.run({
- // destination_or_parent: await fs.node(
- // new NodeUIDSelector(uuid)
- // ),
- // source: await fs.node(
- // new NodeUIDSelector(child_uuid)
- // ),
- // user
- // });
- // await fs.cp(fs, {
- // source: await fs.node(
- // new NodeUIDSelector(child_uuid)
- // ),
- // // TODO: don't do this when cp supports uuids
- // destinationOrParent: await fs.node(
- // new NodeUIDSelector(uuid)
- // ),
- // user,
- // overwrite: false,
- // create_missing_parents: false,
- // ancestor_check_not_needed: true,
- // });
- });
- }
- }
-
- // Add task to await entry
- tasks.add(`fs:cp:entry-op`, async () => {
- await entryOp.awaitDone();
- svc_resource.free(uuid);
- this.log.info(`done inserting entry: ` + uuid);
- const copy_fsNode = await fs.node(new NodeUIDSelector(uuid));
- copy_fsNode.entry = raw_fsentry;
- copy_fsNode.found = true;
- copy_fsNode.path = raw_fsentry.path;
-
- node = copy_fsNode;
-
- svc_event.emit('fs.create.file', {
- node,
- context: this.context,
- })
- }, { force: true });
-
- this.checkpoint('waiting for parallel tasks');
- await tasks.awaitAll();
- this.checkpoint('finishing up');
-
- span.end();
- });
-
- node = node || await fs.node(new NodeUIDSelector(uuid));
-
- // TODO: What event do we emit? How do we know if we're overwriting?
- return node;
- }
-}
-
-module.exports = {
- LLCopy,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_copy_idea.js b/packages/backend/src/filesystem/ll_operations/ll_copy_idea.js
deleted file mode 100644
index 3ee21ac92b..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_copy_idea.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-/*
-
- This file describes an idea to make fine-grained
- steps of a filesystem operation more declarative.
-
- This could have advantages like:
- - easier tracking of side-effects
- - steps automatically mark checkpoints
- - steps automatically have tracing
- - implications of re-ordering steps would
- always be known
- - easier to diagnose stuck operations
-
-*/
-
-const STEPS_COPY_CONTENTS = [
- {
- id: 'add storage info to fsentry',
- behaviour: 'none',
- fn: async ({ util, values }) => {
- const { source } = values;
- // "util.assign" makes it possible to
- // track changes caused by this step
- util.assign('raw_fsentry', {
- size: source.entry.size,
- // ...
- })
- }
- },
- {
- id: 'create progress tracker',
- behaviour: 'values',
- fn: async () => {
- const progress_tracker =
- new UploadProgressTracker();
- return {
- progress_tracker
- };
- }
- },
- {
- id: 'emit copy progress event',
- behaviour: 'side-effect',
- fn: async ({ services }) => {
- services.event.emit(
- /// ...
- )
- }
- },
- {
- id: 'get storage backend',
- behaviour: 'values',
- fn: async ({ services }) => {
- const storage = new
- PuterS3StorageStrategy({
- services
- })
- return { storage };
- }
- },
- // ...
-]
-
-const STEPS = [
- {
- id: 'generate uuid and ts',
- behaviour: 'values',
- fn: async ({ modules }) => {
- return {
- uuid: modules.uuidv4(),
- ts: Math.round(Date.now()/1000)
- };
- }
- },
- {
- id: 'redundancy fetch',
- behaviour: 'side-effect',
- fn: async ({ values }) => {
- await values.source.fetchEntry({
- thumbnail: true,
- });
- await values.parent.fetchEntry();
- }
- },
- {
- id: 'generate raw fsentry',
- behaviour: 'values',
- fn: async ({ values }) => {
- const {
- source,
- parent, target_name,
- uuid, ts,
- user,
- } = values;
- const raw_fsentry = {
- uuid,
- is_dir: source.entry.is_dir,
- // ...
- };
- return { raw_fsentry };
- }
- },
- {
- id: 'emit fs.pending.file',
- fn: () => {
- // ...
- }
- },
- {
- id: 'copy contents',
- cond: async ({ values }) => {
- return await values.source.get('has-s3');
- },
- steps: STEPS_COPY_CONTENTS,
- },
- // ...
-]
-
-class LLCopy extends LLFilesystemOperation {
- static STEPS = STEPS
-}
diff --git a/packages/backend/src/filesystem/ll_operations/ll_mkdir.js b/packages/backend/src/filesystem/ll_operations/ll_mkdir.js
deleted file mode 100644
index 72b274d76f..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_mkdir.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { MODE_WRITE } = require("../../services/fs/FSLockService");
-const { Context } = require("../../util/context");
-const { TYPE_DIRECTORY } = require("../FSNodeContext");
-const { NodeUIDSelector, NodeChildSelector } = require("../node/selectors");
-const { RESOURCE_STATUS_PENDING_CREATE } = require("../storage/ResourceService");
-const { LLFilesystemOperation } = require("./definitions");
-
-class LLMkdir extends LLFilesystemOperation {
- static MODULES = {
- _path: require('path'),
- uuidv4: require('uuid').v4,
- }
-
- async _run () {
- const { context } = this;
- const { parent, name } = this.values;
-
- this.checkpoint('lock requested');
- this.log.noticeme('GET FSLOCK');
- const svc_fslock = context.get('services').get('fslock');
- this.log.noticeme('REQUESTING LOCK');
- const lock_handle = await svc_fslock.lock_child(
- await parent.get('path'),
- name,
- MODE_WRITE,
- );
- this.log.noticeme('GOT LOCK');
- this.checkpoint('lock acquired');
-
- try {
- return await this._locked_run();
- } finally {
- await lock_handle.unlock();
- }
- }
- async _locked_run () {
- const { _path, uuidv4 } = this.modules;
- const { context } = this;
- const { parent, name, user, immutable, actor } = this.values;
-
- const ts = Math.round(Date.now() / 1000);
- const uid = uuidv4();
- const resourceService = context.get('services').get('resourceService');
- const systemFSEntryService = context.get('services').get('systemFSEntryService');
- const svc_event = context.get('services').get('event');
- const fs = context.get('services').get('filesystem');
-
- this.field('fsentry-uid', uid);
-
- const existing = await fs.node(
- new NodeChildSelector(parent.selector, name)
- );
-
- if ( await existing.exists() ) {
- throw APIError.create('item_with_same_name_exists', null, {
- entry_name: name,
- });
- }
-
- this.checkpoint('before acl');
- const svc_acl = context.get('services').get('acl');
- if ( ! await parent.exists() ) {
- throw APIError.create('subject_does_not_exist');
- }
- if ( ! await svc_acl.check(actor, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
- }
-
- resourceService.register({
- uid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- const raw_fsentry = {
- is_dir: 1,
- uuid: uid,
- parent_uid: await parent.get('uid'),
- path: _path.join(await parent.get('path'), name),
- user_id: user.id,
- name,
- created: ts,
- accessed: ts,
- modified: ts,
- immutable: immutable ?? false,
- ...(this.values.thumbnail ? {
- thumbnail: this.values.thumbnail,
- } : {}),
- };
-
- this.log.debug('creating fsentry', { fsentry: raw_fsentry })
-
- this.checkpoint('about to enqueue insert');
- const entryOp = await systemFSEntryService.insert(raw_fsentry);
-
- this.field('fsentry-created', false);
-
- this.checkpoint('enqueued insert');
- // Asynchronous behaviour temporarily disabled
- // (async () => {
- await entryOp.awaitDone();
- this.log.debug('finished creating fsentry', { uid })
- resourceService.free(uid);
- this.field('fsentry-created', true);
- // })();
-
- const node = await fs.node(new NodeUIDSelector(uid));
-
- svc_event.emit('fs.create.directory', {
- node,
- context: Context.get(),
- });
-
- this.checkpoint('returning node');
- return node
- }
-}
-
-module.exports = {
- LLMkdir,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_move.js b/packages/backend/src/filesystem/ll_operations/ll_move.js
deleted file mode 100644
index 02bcaf4212..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_move.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { LLFilesystemOperation } = require("./definitions");
-
-class LLMove extends LLFilesystemOperation {
- static MODULES = {
- _path: require('path'),
- }
-
- async _run () {
- const { _path } = this.modules;
- const { context } = this;
- const { source, parent, user, actor, target_name, metadata } = this.values;
- const svc = context.get('services');
-
- // Access Control
- {
- const svc_acl = context.get('services').get('acl');
- this.checkpoint('move :: access control');
-
- // Check write access to source
- if ( ! await svc_acl.check(actor, source, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, source, 'write');
- }
-
- // Check write access to destination
- if ( ! await svc_acl.check(actor, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
- }
- }
-
- const old_path = await source.get('path');
-
- const svc_fsEntry = svc.get('fsEntryService');
- const op_update = await svc_fsEntry.update(source.uid, {
- ...(
- await source.get('parent_uid') !== await parent.get('uid')
- ? { parent_uid: await parent.get('uid') }
- : {}
- ),
- path: _path.join(await parent.get('path'), target_name),
- name: target_name,
- ...(metadata ? { metadata } : {}),
- });
-
- source.entry.name = target_name;
- source.entry.path = _path.join(await parent.get('path'), target_name);
-
- await op_update.awaitDone();
-
- const svc_fs = svc.get('filesystem');
- await svc_fs.update_child_paths(old_path, source.entry.path, user.id);
-
- const svc_event = svc.get('event');
-
- await svc_event.emit('fs.move.file', {
- context: this.context,
- moved: source,
- old_path,
- });
-
- return source;
- }
-}
-
-module.exports = {
- LLMove,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_read.js b/packages/backend/src/filesystem/ll_operations/ll_read.js
deleted file mode 100644
index c2279e9c63..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_read.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { CodeModel } = require("../../codex/CodeModel");
-const { Sequence } = require("../../codex/Sequence");
-
-const { DB_WRITE } = require("../../services/database/consts");
-const { Context } = require("../../util/context");
-const { buffer_to_stream } = require("../../util/streamutil");
-const { TYPE_SYMLINK, TYPE_DIRECTORY } = require("../FSNodeContext");
-const { LLFilesystemOperation } = require("./definitions");
-
-class LLRead extends LLFilesystemOperation {
- static METHODS = {
- _run: new Sequence({
- async before_each (a, step) {
- const operation = a.iget();
- operation.checkpoint('step:' + step.name);
- }
- }, [
- async function check_that_node_exists (a) {
- if ( ! await a.get('fsNode').exists() ) {
- throw APIError.create('subject_does_not_exist');
- }
- },
- async function type_check_for_read (a) {
- const fsNode = a.get('fsNode');
- if ( await fsNode.get('type') === TYPE_DIRECTORY ) {
- throw APIError.create('cannot_read_a_directory');
- }
- },
- async function resolve_symlink (a) {
- let fsNode = a.get('fsNode');
- let type = await fsNode.get('type');
- while ( type === TYPE_SYMLINK ) {
- fsNode = await fsNode.getTarget();
- type = await fsNode.get('type');
- }
- a.set('fsNode', fsNode);
- },
- async function check_ACL_for_read (a) {
- if ( a.get('no_acl') ) return;
- const context = a.iget('context');
- const svc_acl = context.get('services').get('acl');
- const { fsNode, actor } = a.values();
- if ( ! await svc_acl.check(actor, fsNode, 'read') ) {
- throw await svc_acl.get_safe_acl_error(actor, fsNode, 'read');
- }
- },
- async function calculate_has_range (a) {
- const { offset, length } = a.values();
- const fsNode = a.get('fsNode');
- const has_range = (
- offset !== undefined &&
- offset !== 0
- ) || (
- length !== undefined &&
- length != await fsNode.get('size')
- );
- a.set('has_range', has_range);
- },
- async function update_accessed (a) {
- const context = a.iget('context');
- const db = context.get('services')
- .get('database').get(DB_WRITE, 'filesystem');
-
- const fsNode = a.get('fsNode');
-
- await db.write(
- 'UPDATE `fsentries` SET `accessed` = ? WHERE `id` = ?',
- [Date.now()/1000, fsNode.mysql_id]
- );
- },
- async function check_for_cached_copy (a) {
- const context = a.iget('context');
- const svc_fileCache = context.get('services').get('file-cache');
-
- const { fsNode } = a.values();
-
- const maybe_buffer = await svc_fileCache.try_get(fsNode, a.log);
- if ( maybe_buffer ) {
- a.log.info('cache hit');
- const { has_range } = a.values();
- if ( has_range ) {
- return a.stop(
- buffer_to_stream(maybe_buffer.slice(offset, offset+length))
- );
- }
- return a.stop(
- buffer_to_stream(maybe_buffer)
- );
- }
-
- a.log.info('cache miss');
- },
- async function create_S3_read_stream (a) {
- const context = a.iget('context');
- const storage = context.get('storage');
-
- const { fsNode, version_id, offset, length, has_range } = a.values();
-
- const location = await fsNode.get('s3:location');
-
- const stream = (await storage.create_read_stream(await fsNode.get('uid'), {
- // TODO: fs:decouple-s3
- bucket: location.bucket,
- bucket_region: location.bucket_region,
- version_id,
- key: location.key,
- ...(has_range ? {
- range: `bytes=${offset}-${offset+length-1}`
- } : {}),
- }));
-
- a.set('stream', stream);
- },
- async function store_in_cache (a) {
- const context = a.iget('context');
- const svc_fileCache = context.get('services').get('file-cache');
-
- const { fsNode, stream, has_range } = a.values();
-
- if ( ! has_range ) {
- const res = await svc_fileCache.maybe_store(fsNode, stream);
- if ( res.stream ) a.set('stream', res.stream);
- }
- },
- async function return_stream (a) {
- return a.get('stream');
- },
- ]),
- };
-}
-
-module.exports = {
- LLRead
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_readdir.js b/packages/backend/src/filesystem/ll_operations/ll_readdir.js
deleted file mode 100644
index 545460a28f..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_readdir.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { RootNodeSelector } = require("../node/selectors");
-const { NodeUIDSelector, NodeChildSelector } = require("../node/selectors");
-const { LLFilesystemOperation } = require("./definitions");
-
-class LLReadDir extends LLFilesystemOperation {
- async _run () {
- const { context } = this;
- const { subject, user, actor } = this.values;
-
- if ( ! await subject.exists() ) {
- throw APIError.create('subject_does_not_exist');
- }
-
- const svc_acl = context.get('services').get('acl');
- if ( ! await svc_acl.check(actor, subject, 'list') ) {
- throw await svc_acl.get_safe_acl_error(actor, subject, 'list');
- }
-
- const subject_uuid = await subject.get('uid');
-
- const svc = context.get('services');
- const svc_fsentry = svc.get('fsEntryService');
- const svc_fs = svc.get('filesystem');
-
- if ( subject.isRoot ) {
- if ( ! actor.type.user ) return [];
- return [
- await svc_fs.node(new NodeChildSelector(
- new RootNodeSelector(),
- actor.type.user.username,
- ))
- ];
- }
-
- this.checkpoint('before get direct descendants')
- const child_uuids = await svc_fsentry
- .fast_get_direct_descendants(subject_uuid);
- this.checkpoint('after get direct descendants')
- const children = await Promise.all(child_uuids.map(async uuid => {
- return await svc_fs.node(new NodeUIDSelector(uuid));
- }));
- this.checkpoint('after get children');
-
- return children;
- }
-}
-
-module.exports = {
- LLReadDir,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_rmdir.js b/packages/backend/src/filesystem/ll_operations/ll_rmdir.js
deleted file mode 100644
index dd260714ee..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_rmdir.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const APIError = require("../../api/APIError");
-const { ParallelTasks } = require("../../util/otelutil");
-const FSNodeContext = require("../FSNodeContext");
-const { NodeUIDSelector } = require("../node/selectors");
-const { LLFilesystemOperation } = require("./definitions");
-const { LLRmNode } = require('./ll_rmnode');
-
-class LLRmDir extends LLFilesystemOperation {
- async _run () {
- const {
- target,
- user,
- actor,
- descendants_only,
- recursive,
-
- max_tasks = 8,
- } = this.values;
-
- const { context } = this;
-
- const svc = context.get('services');
-
- // Access Control
- {
- const svc_acl = context.get('services').get('acl');
- this.checkpoint('remove :: access control');
-
- // Check write access to target
- if ( ! await svc_acl.check(actor, target, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, target, 'write');
- }
- }
-
- if ( await target.get('immutable') && ! descendants_only ) {
- throw APIError.create('immutable');
- }
-
- const svc_fsEntry = svc.get('fsEntryService');
- const fs = svc.get('filesystem');
-
- const children = await svc_fsEntry.fast_get_direct_descendants(
- await target.get('uid')
- );
-
- if ( children.length > 0 && ! recursive ) {
- throw APIError.create('not_empty');
- }
-
- const tracer = svc.get('traceService').tracer;
- const tasks = new ParallelTasks({ tracer, max: max_tasks });
-
- for ( const child_uuid of children ) {
- tasks.add(`fs:rm:rm-child`, async () => {
- const child_node = await fs.node(
- new NodeUIDSelector(child_uuid)
- );
- const type = await child_node.get('type');
- if ( type === FSNodeContext.TYPE_DIRECTORY ) {
- const ll_rm = new LLRmDir();
- await ll_rm.run({
- target: await fs.node(
- new NodeUIDSelector(child_uuid),
- ),
- user,
- recursive: true,
- descendants_only: false,
-
- max_tasks: (v => v > 1 ? v : 1)(Math.floor(max_tasks / 2)),
- });
- } else {
- const ll_rm = new LLRmNode();
- await ll_rm.run({
- target: await fs.node(
- new NodeUIDSelector(child_uuid),
- ),
- user,
- });
- }
- });
- }
-
- if ( ! descendants_only ) {
- tasks.add(`fs:rm:rm-self`, async () => {
- const ll_rm = new LLRmNode();
- await ll_rm.run({
- target,
- user,
- });
- });
- }
-
- await tasks.awaitAll();
- }
-}
-
-module.exports = {
- LLRmDir,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_rmnode.js b/packages/backend/src/filesystem/ll_operations/ll_rmnode.js
deleted file mode 100644
index cb4d246922..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_rmnode.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { Context } = require("../../util/context");
-const { ParallelTasks } = require("../../util/otelutil");
-const { LLFilesystemOperation } = require("./definitions");
-
-class LLRmNode extends LLFilesystemOperation {
- async _run () {
- const { target, actor } = this.values;
-
- const { context } = this;
-
- const svc = context.get('services');
-
- // Access Control
- {
- const svc_acl = context.get('services').get('acl');
- this.checkpoint('remove :: access control');
-
- // Check write access to target
- if ( ! await svc_acl.check(actor, target, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, target, 'write');
- }
- }
-
- if ( await target.get('immutable') ) {
- throw new APIError(403, 'File is immutable.');
- }
-
- const svc_size = svc.get('sizeService');
- const svc_fsEntry = svc.get('fsEntryService');
-
- svc_size.change_usage(
- await target.get('user_id'),
- -1 * await target.get('size')
- );
-
- const tracer = svc.get('traceService').tracer;
- const tasks = new ParallelTasks({ tracer, max: 4 });
-
- tasks.add(`remove-fsentry`, async () => {
- await svc_fsEntry.delete(await target.get('uid'));
- });
-
- if ( await target.get('has-s3') ) {
- tasks.add(`remove-from-s3`, async () => {
- // const storage = new PuterS3StorageStrategy({ services: svc });
- const storage = Context.get('storage');
- const state_delete = storage.create_delete();
- await state_delete.run({
- node: target,
- });
- });
- }
-
- await tasks.awaitAll();
- }
-}
-
-module.exports = {
- LLRmNode,
-};
diff --git a/packages/backend/src/filesystem/ll_operations/ll_write.js b/packages/backend/src/filesystem/ll_operations/ll_write.js
deleted file mode 100644
index fc4359a21b..0000000000
--- a/packages/backend/src/filesystem/ll_operations/ll_write.js
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { Context } = require("../../util/context");
-const { LLFilesystemOperation } = require("./definitions");
-const { RESOURCE_STATUS_PENDING_CREATE } = require("../storage/ResourceService");
-const { NodeUIDSelector } = require("../node/selectors");
-const { UploadProgressTracker } = require("../storage/UploadProgressTracker");
-const FSNodeContext = require("../FSNodeContext");
-const APIError = require("../../api/APIError");
-const { progress_stream, stuck_detector_stream } = require("../../util/streamutil");
-const { OperationFrame } = require("../../services/OperationTraceService");
-const { Actor } = require("../../services/auth/Actor");
-const { DB_WRITE } = require("../../services/database/consts");
-
-const STUCK_STATUS_TIMEOUT = 10 * 1000;
-const STUCK_ALARM_TIMEOUT = 20 * 1000;
-
-class LLWriteBase extends LLFilesystemOperation {
- static MODULES = {
- config: require('../../config.js'),
- simple_retry: require('../../util/retryutil.js').simple_retry,
- }
-
- async _storage_upload ({
- uuid,
- bucket, bucket_region, file,
- tmp,
- }) {
- const { config } = this.modules;
-
- const svc = Context.get('services');
- const log = svc.get('log-service').create('fs._storage_upload');
- const errors = svc.get('error-service').create(log);
- const svc_event = svc.get('event');
-
- const storage = Context.get('storage');
-
- bucket ??= config.s3_bucket;
- bucket_region ??= config.s3_region;
-
- let upload_tracker = new UploadProgressTracker();
-
- svc_event.emit('fs.storage.upload-progress', {
- upload_tracker,
- context: Context.get(),
- meta: {
- item_uid: uuid,
- item_path: tmp.path,
- }
- })
-
- if ( ! file.buffer ) {
- let stream = file.stream;
- let alarm_timeout = null;
- stream = stuck_detector_stream(stream, {
- timeout: STUCK_STATUS_TIMEOUT,
- on_stuck: () => {
- this.frame.status = OperationFrame.FRAME_STATUS_STUCK;
- log.warn('Upload stream stuck might be stuck', {
- bucket_region,
- bucket,
- uuid,
- });
- alarm_timeout = setTimeout(() => {
- errors.report('fs.write.s3-upload', {
- message: 'Upload stream stuck for too long',
- alarm: true,
- extra: {
- bucket_region,
- bucket,
- uuid,
- },
- });
- }, STUCK_ALARM_TIMEOUT);
- },
- on_unstuck: () => {
- clearTimeout(alarm_timeout);
- this.frame.status = OperationFrame.FRAME_STATUS_WORKING;
- }
- });
- file = { ...file, stream, };
- }
-
- const state_upload = storage.create_upload();
-
- try {
- await state_upload.run({
- uid: uuid,
- file,
- storage_meta: { bucket, bucket_region },
- storage_api: { progress_tracker: upload_tracker },
- });
- } catch (e) {
- errors.report('fs.write.storage-upload', {
- source: e || new Error('unknown'),
- trace: true,
- alarm: true,
- extra: {
- bucket_region,
- bucket,
- uuid,
- },
- });
- throw APIError.create('upload_failed');
- }
-
- return state_upload;
- }
-}
-
-class LLOWrite extends LLWriteBase {
- async _run () {
- const {
- node, user, immutable,
- file, tmp, fsentry_tmp,
- message,
- } = this.values;
-
- let { actor } = this.values;
-
- const svc = Context.get('services');
- const sizeService = svc.get('sizeService');
- const resourceService = svc.get('resourceService');
- const systemFSEntryService = svc.get('systemFSEntryService');
- const svc_event = svc.get('event');
-
- // TODO: fs:decouple-versions
- // add version hook externally so LLCWrite doesn't
- // need direct database access
- const db = svc.get('database').get(DB_WRITE, 'filesystem');
-
- // TODO: Add symlink write
- if ( ! await node.exists() ) {
- // TODO: different class of errors for low-level operations
- throw APIError.create('subject_does_not_exist');
- }
-
- actor = actor ?? Actor.adapt(user);
-
- const svc_acl = this.context.get('services').get('acl');
- if ( ! await svc_acl.check(actor, node, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, node, 'write');
- }
-
- const uid = await node.get('uid');
-
- const bucket_region = node.entry.bucket_region;
- const bucket = node.entry.bucket;
-
- const state_upload = await this._storage_upload({
- uuid: node.entry.uuid,
- bucket, bucket_region, file,
- tmp: {
- ...tmp,
- path: await node.get('path'),
- }
- });
-
- fsentry_tmp.thumbnail = await fsentry_tmp.thumbnail_promise;
- delete fsentry_tmp.thumbnail_promise;
-
- const ts = Math.round(Date.now() / 1000);
- const raw_fsentry_delta = {
- modified: ts,
- accessed: ts,
- size: file.size,
- ...fsentry_tmp,
- };
-
- resourceService.register({
- uid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- const filesize = file.size;
- sizeService.change_usage(user.id, filesize);
-
- const entryOp = await systemFSEntryService.update(uid, raw_fsentry_delta);
-
- // depends on fsentry, does not depend on S3
- (async () => {
- await entryOp.awaitDone();
- this.log.debug('[owrite] finished creating fsentry', { uid })
- resourceService.free(uid);
- })();
-
- state_upload.post_insert({
- db, user, node, uid, message, ts,
- });
-
- const svc_fileCache = this.context.get('services').get('file-cache');
- await svc_fileCache.invalidate(node);
-
- svc_event.emit('fs.write.file', {
- node,
- context: this.context,
- });
-
- return node;
- }
-}
-
-class LLCWrite extends LLWriteBase {
- static MODULES = {
- _path: require('path'),
- uuidv4: require('uuid').v4,
- config: require('../../config.js'),
- }
-
- async _run () {
- const { _path, uuidv4, config } = this.modules;
- const {
- parent, name, user, immutable,
- file, tmp, fsentry_tmp,
- message,
-
- actor,
- app_id,
- } = this.values;
-
- const svc = Context.get('services');
- const sizeService = svc.get('sizeService');
- const resourceService = svc.get('resourceService');
- const systemFSEntryService = svc.get('systemFSEntryService');
- const svc_event = svc.get('event');
- const fs = svc.get('filesystem');
-
- // TODO: fs:decouple-versions
- // add version hook externally so LLCWrite doesn't
- // need direct database access
- const db = svc.get('database').get(DB_WRITE, 'filesystem');
-
- const uid = uuidv4();
- this.field('fsentry-uid', uid);
-
- // determine bucket region
- let bucket_region = config.s3_region;
- let bucket = config.s3_bucket;
-
- this.checkpoint('before acl');
- if ( ! await parent.exists() ) {
- throw APIError.create('subject_does_not_exist');
- }
-
- const svc_acl = this.context.get('services').get('acl');
- if ( ! await svc_acl.check(actor, parent, 'write') ) {
- throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
- }
-
- this.checkpoint('before storage upload');
-
- const storage_resp = await this._storage_upload({
- uuid: uid,
- bucket, bucket_region, file,
- tmp: {
- ...tmp,
- path: _path.join(await parent.get('path'), name),
- }
- });
-
- this.checkpoint('after storage upload');
-
- fsentry_tmp.thumbnail = await fsentry_tmp.thumbnail_promise;
- delete fsentry_tmp.thumbnail_promise;
-
- this.checkpoint('after thumbnail promise');
-
- const ts = Math.round(Date.now() / 1000);
- const raw_fsentry = {
- uuid: uid,
- is_dir: 0,
- user_id: user.id,
- created: ts,
- accessed: ts,
- modified: ts,
- parent_uid: await parent.get('uid'),
- name,
- size: file.size,
- path: _path.join(await parent.get('path'), name),
- ...fsentry_tmp,
-
- bucket_region,
- bucket,
-
- associated_app_id: app_id ?? null,
- };
-
- svc_event.emit('fs.pending.file', {
- fsentry: FSNodeContext.sanitize_pending_entry_info(raw_fsentry),
- context: this.context,
- })
-
- this.checkpoint('after emit pending file');
-
- resourceService.register({
- uid,
- status: RESOURCE_STATUS_PENDING_CREATE,
- });
-
- const filesize = file.size;
- sizeService.change_usage(user.id, filesize);
-
- this.checkpoint('after change_usage');
-
- const entryOp = await systemFSEntryService.insert(raw_fsentry);
-
- this.checkpoint('after fsentry insert enqueue');
-
- (async () => {
- await entryOp.awaitDone();
- this.log.debug('finished creating fsentry', { uid })
- resourceService.free(uid);
-
- const new_item_node = await fs.node(new NodeUIDSelector(uid));
- const new_item = await new_item_node.get('entry');
- const store_version_id = storage_resp.VersionId;
- if( store_version_id ){
- // insert version into db
- db.write(
- "INSERT INTO `fsentry_versions` (`user_id`, `fsentry_id`, `fsentry_uuid`, `version_id`, `message`, `ts_epoch`) VALUES (?, ?, ?, ?, ?, ?)",
- [
- user.id,
- new_item.id,
- new_item.uuid,
- store_version_id,
- message ?? null,
- ts,
- ]
- );
- }
- })();
-
- this.checkpoint('after version IIAFE');
-
- const node = await fs.node(new NodeUIDSelector(uid));
-
- this.checkpoint('after create FSNodeContext');
-
- svc_event.emit('fs.create.file', {
- node,
- context: this.context,
- });
-
- this.checkpoint('return result');
-
- return node;
- }
-}
-
-module.exports = {
- LLCWrite,
- LLOWrite,
-};
diff --git a/packages/backend/src/filesystem/node/selectors.js b/packages/backend/src/filesystem/node/selectors.js
deleted file mode 100644
index c64f6df760..0000000000
--- a/packages/backend/src/filesystem/node/selectors.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const _path = require('path');
-const { PuterPath } = require('../lib/PuterPath');
-
-class NodePathSelector {
- constructor (path) {
- this.value = path;
- }
-
- setPropertiesKnownBySelector (node) {
- node.path = this.value;
- node.name = _path.basename(this.value);
- }
-
- describe () {
- return this.value;
- }
-}
-
-class NodeUIDSelector {
- constructor (uid) {
- this.value = uid;
- }
-
- setPropertiesKnownBySelector (node) {
- node.uid = this.value;
- }
-
- // Note: the selector could've been added by FSNodeContext
- // during fetch, but this was more efficient because the
- // object is created lazily, and it's somtimes not needed.
- static implyFromFetchedData (node) {
- if ( node.uid ) {
- return new NodeUIDSelector(node.uid);
- }
- return null;
- }
-
- describe () {
- return `[uid:${this.value}]`;
- }
-}
-
-class NodeInternalIDSelector {
- constructor (service, id, debugInfo) {
- this.service = service;
- this.id = id;
- this.debugInfo = debugInfo;
- }
-
- setPropertiesKnownBySelector (node) {
- if ( this.service === 'mysql' ) {
- node.mysql_id = this.id;
- }
- }
-
- describe (showDebug) {
- if ( showDebug ) {
- return `[db:${this.id}] (${
- JSON.stringify(this.debugInfo, null, 2)
- })`
- }
- return `[db:${this.id}]`
- }
-}
-
-class NodeChildSelector {
- constructor (parent, name) {
- this.parent = parent;
- this.name = name;
- }
-
- setPropertiesKnownBySelector (node) {
- node.name = this.name;
- // no properties known
- }
-
- describe () {
- return this.parent.describe() + '/' + this.name;
- }
-}
-
-class RootNodeSelector {
- static entry = {
- is_dir: true,
- is_root: true,
- uuid: PuterPath.NULL_UUID,
- name: '/',
- };
- setPropertiesKnownBySelector (node) {
- node.path = '/';
- node.root = true;
- node.uid = PuterPath.NULL_UUID;
- }
- constructor () {
- this.entry = this.constructor.entry;
- }
-
- describe () {
- return '[root]';
- }
-}
-
-class NodeRawEntrySelector {
- constructor (entry) {
- // Fix entries from get_descendants
- if ( ! entry.uuid && entry.uid ) {
- entry.uuid = entry.uid;
- if ( entry._id ) {
- entry.id = entry._id;
- delete entry._id;
- }
- }
-
- this.entry = entry;
- }
-
- setPropertiesKnownBySelector (node) {
- node.found = true;
- node.entry = this.entry;
- node.uid = this.entry.uid ?? this.entry.uuid;
- node.name = this.entry.name;
- if ( this.entry.path ) node.path = this.entry.path;
- }
-
- describe () {
- return '[raw entry]';
- }
-}
-
-const relativeSelector = (parent, path) => {
- if ( path === '.' ) return parent;
- if ( path.startsWith('..') ) {
- throw new Error('currently unsupported');
- }
-
- let selector = parent;
-
- const parts = path.split('/').filter(Boolean);
- for ( const part of parts ) {
- selector = new NodeChildSelector(selector, part);
- }
-
- return selector;
-}
-
-module.exports = {
- NodePathSelector,
- NodeUIDSelector,
- NodeInternalIDSelector,
- NodeChildSelector,
- RootNodeSelector,
- NodeRawEntrySelector,
- relativeSelector,
-};
diff --git a/packages/backend/src/filesystem/storage/DatabaseFSEntryFetcher.js b/packages/backend/src/filesystem/storage/DatabaseFSEntryFetcher.js
deleted file mode 100644
index 82ece7eb2e..0000000000
--- a/packages/backend/src/filesystem/storage/DatabaseFSEntryFetcher.js
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { DB_READ } = require("../../services/database/consts");
-const { abtest } = require("../../util/otelutil");
-const { NodePathSelector, NodeUIDSelector, NodeInternalIDSelector, NodeChildSelector, RootNodeSelector } = require("../node/selectors");
-
-module.exports = class DatabaseFSEntryFetcher {
- constructor ({ services }) {
- this.services = services;
- this.log = services.get('log-service').create('DatabaseFSEntryFetcher');
-
- this.db = services.get('database').get(DB_READ, 'filesystem');
-
- this.defaultProperties = [
- 'id',
- 'associated_app_id',
- 'uuid',
- 'public_token',
- 'bucket',
- 'bucket_region',
- 'file_request_token',
- 'user_id',
- 'parent_uid',
- 'is_dir',
- 'is_public',
- 'is_shortcut',
- 'is_symlink',
- 'symlink_path',
- 'shortcut_to',
- 'sort_by',
- 'sort_order',
- 'immutable',
- 'name',
- 'metadata',
- 'modified',
- 'created',
- 'accessed',
- 'size',
- 'layout',
- 'path',
- ]
- }
-
- async find (selector, fetch_entry_options) {
- if ( selector instanceof RootNodeSelector ) {
- return selector.entry;
- }
- if ( selector instanceof NodePathSelector ) {
- return await this.findByPath(
- selector.value, fetch_entry_options);
- }
- if ( selector instanceof NodeUIDSelector ) {
- return await this.findByUID(
- selector.value, fetch_entry_options);
- }
- if ( selector instanceof NodeInternalIDSelector ) {
- return await this.findByID(
- selector.id, fetch_entry_options);
- }
- if ( selector instanceof NodeChildSelector ) {
- let id;
-
- if ( selector.parent instanceof RootNodeSelector ) {
- id = await this.findNameInRoot(selector.name);
- } else {
- const parentEntry = await this.find(selector.parent);
- if ( ! parentEntry ) return null;
- id = await this.findNameInParent(
- parentEntry.uuid, selector.name
- );
- }
-
- if ( id === undefined ) return null;
- if ( typeof id !== 'number' ) {
- throw new Error(
- 'unexpected type for id value',
- typeof id,
- id
- );
- }
- return this.find(new NodeInternalIDSelector('mysql', id));
- }
- }
-
- async findByUID(uuid, fetch_entry_options = {}) {
- const { thumbnail } = fetch_entry_options;
-
- let fsentry = await this.db.requireRead(
- `SELECT ` +
- this.defaultProperties.join(', ') +
- (thumbnail ? `, thumbnail` : '') +
- ` FROM fsentries WHERE uuid = ? LIMIT 1`,
- [uuid]
- );
-
- return fsentry[0];
- }
-
- async findByID(id, fetch_entry_options = {}) {
- const { thumbnail } = fetch_entry_options;
-
- let fsentry = await this.db.requireRead(
- `SELECT ` +
- this.defaultProperties.join(', ') +
- (thumbnail ? `, thumbnail` : '') +
- ` FROM fsentries WHERE id = ? LIMIT 1`,
- [id]
- );
-
- return fsentry[0];
- }
-
- async findByPath(path, fetch_entry_options = {}) {
- const { thumbnail } = fetch_entry_options;
-
- if ( path === '/' ) {
- return this.find(new RootNodeSelector());
- }
-
- const parts = path.split('/').filter(path => path !== '');
- if ( parts.length === 0 ) {
- // TODO: invalid path; this should be an error
- return false;
- }
-
-
- // TODO: use a closure table for more efficient path resolving
- let parent_uid = null;
- let result;
-
- const resultColsSql = this.defaultProperties.join(', ') +
- (thumbnail ? `, thumbnail` : '');
-
- result = await this.db.read(
- `SELECT ` + resultColsSql +
- ` FROM fsentries WHERE path=? LIMIT 1`,
- [path]
- );
-
- // using knex instead
-
- if ( result[0] ) return result[0];
-
- this.log.info(`findByPath (not cached): ${path}`)
-
- const loop = async () => {
- for ( let i=0 ; i < parts.length ; i++ ) {
- const part = parts[i];
- const isLast = i == parts.length - 1;
- const colsSql = isLast ? resultColsSql : 'uuid';
- if ( parent_uid === null ) {
- result = await this.db.read(
- `SELECT ` + colsSql +
- ` FROM fsentries WHERE parent_uid IS NULL AND name=? LIMIT 1`,
- [part]
- );
- } else {
- result = await this.db.read(
- `SELECT ` + colsSql +
- ` FROM fsentries WHERE parent_uid=? AND name=? LIMIT 1`,
- [parent_uid, part]
- );
- }
-
- if ( ! result[0] ) return false;
- parent_uid = result[0].uuid;
- }
- }
-
- if ( fetch_entry_options.tracer ) {
- const tracer = fetch_entry_options.tracer;
- const options = fetch_entry_options.trace_options;
- await tracer.startActiveSpan(`fs:sql:findByPath`,
- ...(options ? [options] : []),
- async span => {
- await loop();
- span.end();
- });
- } else {
- await loop();
- }
-
- return result[0];
- }
-
- async findNameInRoot (name) {
- let child_id = await this.db.read(
- "SELECT `id` FROM `fsentries` WHERE `parent_uid` IS NULL AND name = ? LIMIT 1",
- [name]
- );
- return child_id[0]?.id;
- }
-
- async findNameInParent (parent_uid, name) {
- let child_id = await this.db.read(
- "SELECT `id` FROM `fsentries` WHERE `parent_uid` = ? AND name = ? LIMIT 1",
- [parent_uid, name]
- );
- return child_id[0]?.id;
- }
-
- async nameExistsUnderParent (parent_uid, name) {
- let check_dupe = await this.db.read(
- "SELECT `id` FROM `fsentries` WHERE `parent_uid` = ? AND name = ? LIMIT 1",
- [parent_uid, name]
- );
- return !! check_dupe[0];
- }
-}
diff --git a/packages/backend/src/filesystem/storage/DatabaseFSEntryService.js b/packages/backend/src/filesystem/storage/DatabaseFSEntryService.js
deleted file mode 100644
index eca07c00bb..0000000000
--- a/packages/backend/src/filesystem/storage/DatabaseFSEntryService.js
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { AdvancedBase } = require("puter-js-common");
-const { id2path } = require("../../helpers");
-
-const { PuterPath } = require("../lib/PuterPath");
-const { NodeUIDSelector } = require("../node/selectors");
-const { OtelTrait } = require("../../traits/OtelTrait");
-const { Context } = require("../../util/context");
-const { DB_WRITE } = require("../../services/database/consts");
-
-class AbstractDatabaseFSEntryOperation {
- static STATUS_PENDING = {};
- static STATUS_RUNNING = {};
- static STATUS_DONE = {};
- constructor () {
- this.status_ = this.constructor.STATUS_PENDING;
- this.donePromise = new Promise((resolve, reject) => {
- this.doneResolve = resolve;
- this.doneReject = reject;
- });
- }
- get status () {
- return this.status_;
- }
- set status (status) {
- this.status_ = status;
- if ( status === this.constructor.STATUS_DONE ) {
- this.doneResolve();
- }
- }
- awaitDone () {
- return this.donePromise;
- }
- onComplete(fn) {
- this.donePromise.then(fn);
- }
-}
-
-class DatabaseFSEntryInsert extends AbstractDatabaseFSEntryOperation {
- static requiredForCreate = [
- 'uuid',
- 'parent_uid',
- ];
-
- static allowedForCreate = [
- ...this.requiredForCreate,
- 'name',
- 'user_id',
- 'is_dir',
- 'created',
- 'modified',
- 'immutable',
- 'shortcut_to',
- 'is_shortcut',
- 'metadata',
- 'bucket',
- 'bucket_region',
- 'thumbnail',
- 'accessed',
- 'size',
- 'symlink_path',
- 'is_symlink',
- 'associated_app_id',
- 'path',
- ];
-
- constructor (entry) {
- super();
- const requiredForCreate = this.constructor.requiredForCreate;
- const allowedForCreate = this.constructor.allowedForCreate;
-
- {
- const sanitized_entry = {};
- for ( const k of allowedForCreate ) {
- if ( entry.hasOwnProperty(k) ) {
- sanitized_entry[k] = entry[k];
- }
- }
- entry = sanitized_entry;
- }
-
- for ( const k of requiredForCreate ) {
- if ( ! entry.hasOwnProperty(k) ) {
- throw new Error(`Missing required property: ${k}`);
- }
- }
-
- this.entry = entry;
- }
-
- getStatement () {
- const fields = Object.keys(this.entry);
- const statement = `INSERT INTO fsentries ` +
- `(${fields.join(', ')}) ` +
- `VALUES (${fields.map(() => '?').join(', ')})`;
- const values = fields.map(k => this.entry[k]);
- return { statement, values };
- }
-
- apply (answer) {
- answer.entry = { ...this.entry };
- }
-
- get uuid () {
- return this.entry.uuid;
- }
-}
-
-class DatabaseFSEntryUpdate extends AbstractDatabaseFSEntryOperation {
- static allowedForUpdate = [
- 'name',
- 'parent_uid',
- 'user_id',
- 'modified',
- 'shortcut_to',
- 'metadata',
- 'thumbnail',
- 'size',
- 'path',
- ];
-
- constructor (uuid, entry) {
- super();
- const allowedForUpdate = this.constructor.allowedForUpdate;
-
- {
- const sanitized_entry = {};
- for ( const k of allowedForUpdate ) {
- if ( entry.hasOwnProperty(k) ) {
- sanitized_entry[k] = entry[k];
- }
- }
- entry = sanitized_entry;
- }
-
- this.uuid = uuid;
- this.entry = entry;
- }
-
- getStatement () {
- const fields = Object.keys(this.entry);
- const statement = `UPDATE fsentries SET ` +
- `${fields.map(k => `${k} = ?`).join(', ')} ` +
- `WHERE uuid = ? LIMIT 1`;
- const values = fields.map(k => this.entry[k]);
- values.push(this.uuid);
- return { statement, values };
- }
-
- apply (answer) {
- if ( ! answer.entry ) {
- answer.is_diff = true;
- answer.entry = {};
- }
- Object.assign(answer.entry, this.entry);
- }
-}
-
-class DatabaseFSEntryDelete extends AbstractDatabaseFSEntryOperation {
- constructor (uuid) {
- super();
- this.uuid = uuid;
- }
-
- getStatement () {
- const statement = `DELETE FROM fsentries WHERE uuid = ? LIMIT 1`;
- const values = [this.uuid];
- return { statement, values };
- }
-
- apply (answer) {
- answer.entry = null;
- }
-}
-
-
-class DatabaseFSEntryService extends AdvancedBase {
- static STATUS_READY = {};
- static STATUS_RUNNING_JOB = {};
-
- static TRAITS = [
- new OtelTrait([
- 'insert',
- 'update',
- 'delete',
- 'fast_get_descendants',
- 'fast_get_direct_descendants',
- 'get',
- 'get_descendants',
- 'get_recursive_size',
- 'enqueue_',
- 'checkShouldExec_',
- 'exec_',
- ]),
- ]
-
- constructor ({ services, label }) {
- super();
- this.db = services.get('database').get(DB_WRITE, 'filesystem');
-
- this.log = services.get('log-service').create('fsentry-service');
-
- this.label = label || 'DatabaseFSEntryService';
-
- const params = services.get('params');
- params.createParameters('fsentry-service', [
- {
- id: 'max_queue',
- description: 'Maximum queue size',
- default: 50,
- },
- ], this);
-
- this.status = this.constructor.STATUS_READY;
-
- this.currentState = {
- queue: [],
- updating_uuids: {},
- };
- this.deferredState = {
- queue: [],
- updating_uuids: {},
- };
-
- this.entryListeners_ = {};
-
- this.mkPromiseForQueueSize_();
-
- // Register information providers
- const info = services.get('information');
-
- // uuid -> path via mysql
- info.given('fs.fsentry:uuid').provide('fs.fsentry:path')
- .addStrategy('mysql', async uuid => {
- // TODO: move id2path here
- return await id2path(uuid);
- });
-
- (async () => {
- await services.ready;
- if ( services.has('commands') ) {
- this._registerCommands(services.get('commands'));
- }
- })();
- }
-
- mkPromiseForQueueSize_ () {
- this.queueSizePromise = new Promise((resolve, reject) => {
- this.queueSizeResolve = resolve;
- });
- }
-
- async insert (entry) {
- const op = new DatabaseFSEntryInsert(entry);
- await this.enqueue_(op);
- return op;
- }
-
- async update (uuid, entry) {
- const op = new DatabaseFSEntryUpdate(uuid, entry);
- await this.enqueue_(op);
- return op;
- }
-
- async delete (uuid) {
- const op = new DatabaseFSEntryDelete(uuid);
- await this.enqueue_(op);
- return op;
- }
-
- async fast_get_descendants (uuid) {
- return (await this.db.read(`
- WITH RECURSIVE descendant_cte AS (
- SELECT uuid, parent_uid
- FROM fsentries
- WHERE parent_uid = ?
-
- UNION ALL
-
- SELECT f.uuid, f.parent_uid
- FROM fsentries f
- INNER JOIN descendant_cte d ON f.parent_uid = d.uuid
- )
- SELECT uuid FROM descendant_cte
- `, [uuid])).map(x => x.uuid);
- }
-
- async fast_get_direct_descendants (uuid) {
- return (uuid === PuterPath.NULL_UUID
- ? await this.db.read(
- `SELECT uuid FROM fsentries WHERE parent_uid IS NULL`)
- : await this.db.read(
- `SELECT uuid FROM fsentries WHERE parent_uid = ?`,
- [uuid])).map(x => x.uuid);
- }
-
- waitForEntry (node, callback) {
- // *** uncomment to debug slow waits ***
- // console.log('ATTEMPT TO WAIT FOR', selector.describe())
- let selector = node.get_selector_of_type(NodeUIDSelector);
- if ( selector === null ) {
- this.log.debug('cannot wait for this selector');
- // console.log(new Error('========'));
- return;
- }
-
- const entry_already_enqueued =
- this.currentState.updating_uuids.hasOwnProperty(selector.value) ||
- this.deferredState.updating_uuids.hasOwnProperty(selector.value) ;
-
- if ( entry_already_enqueued ) {
- callback();
- return;
- }
-
- const k = `uid:${selector.value}`;
- if ( ! this.entryListeners_.hasOwnProperty(k) ) {
- this.entryListeners_[k] = [];
- }
-
- const det = {
- detach: () => {
- const i = this.entryListeners_[k].indexOf(callback);
- if ( i === -1 ) return;
- this.entryListeners_[k].splice(i, 1);
- if ( this.entryListeners_[k].length === 0 ) {
- delete this.entryListeners_[k];
- }
- }
- };
-
- this.entryListeners_[k].push(callback);
-
- return det;
- }
-
- async get (uuid, fetch_entry_options) {
- this.log.debug('--- finding ops for', { uuid })
- const answer = {};
- for ( const op of this.currentState.queue ) {
- if ( op.uuid != uuid ) continue;
- this.log.debug('=== found op!', { op });
- op.apply(answer);
- }
- for ( const op of this.deferredState.queue ) {
- if ( op.uuid != uuid ) continue;
- this.log.debug('=== found op**!', { op });
- op.apply(answer);
- op.apply(answer);
- }
- if ( answer.is_diff ) {
- const fsEntryFetcher = Context.get('services').get('fsEntryFetcher');
- const base_entry = await fsEntryFetcher.find(
- new NodeUIDSelector(uuid),
- fetch_entry_options,
- );
- answer.entry = { ...base_entry, ...answer.entry };
- }
- return answer.entry;
- }
-
- async get_descendants (uuid) {
- return uuid === PuterPath.NULL_UUID
- ? await this.db.read(
- `SELECT uuid FROM fsentries WHERE parent_uid IS NULL`,
- [uuid],
- )
- : await this.db.read(
- `SELECT uuid FROM fsentries WHERE parent_uid = ?`,
- [uuid],
- )
- ;
- }
-
- async get_recursive_size (uuid) {
- const cte_query = `
- WITH RECURSIVE descendant_cte AS (
- SELECT uuid, parent_uid, size
- FROM fsentries
- WHERE parent_uid = ?
-
- UNION ALL
-
- SELECT f.uuid, f.parent_uid, f.size
- FROM fsentries f
- INNER JOIN descendant_cte d
- ON f.parent_uid = d.uuid
- )
- SELECT SUM(size) AS total_size FROM descendant_cte
- `;
- const rows = await this.db.read(cte_query, [uuid]);
- return rows[0].total_size;
- }
-
- async enqueue_ (op) {
- while (
- this.currentState.queue.length > this.max_queue ||
- this.deferredState.queue.length > this.max_queue
- ) {
- await this.queueSizePromise;
- }
-
- if ( ! (op instanceof AbstractDatabaseFSEntryOperation) ) {
- throw new Error('Invalid operation');
- }
-
- const state = this.status === this.constructor.STATUS_READY ?
- this.currentState : this.deferredState;
-
- if ( ! state.updating_uuids.hasOwnProperty(op.uuid) ) {
- state.updating_uuids[op.uuid] = [];
- }
- state.updating_uuids[op.uuid].push(state.queue.length);
-
- state.queue.push(op);
-
- // DRY: same pattern as FSOperationContext:provideValue
- // DRY: same pattern as FSOperationContext:rejectValue
- if ( this.entryListeners_.hasOwnProperty(op.uuid) ) {
- const listeners = this.entryListeners_[op.uuid];
-
- delete this.entryListeners_[op.uuid];
-
- for ( const lis of listeners ) lis();
- }
-
- this.checkShouldExec_();
- }
-
- checkShouldExec_ () {
- if ( this.status !== this.constructor.STATUS_READY ) return;
- if ( this.currentState.queue.length === 0 ) return;
- this.exec_();
- }
-
- async exec_ () {
- if ( this.status !== this.constructor.STATUS_READY ) {
- throw new Error('Duplicate exec_ call');
- }
-
- const queue = this.currentState.queue;
-
- this.log.info(
- `\x1B[36;1m[${this.label}]\x1B[0m ` +
- `Executing ${queue.length} operations...`
- );
-
- this.status = this.constructor.STATUS_RUNNING_JOB;
-
- // const conn = await this.db_primary.promise().getConnection();
- // await conn.beginTransaction();
-
- for ( const op of queue ) {
- op.status = op.constructor.STATUS_RUNNING;
- // await conn.execute(stmt, values);
- }
-
- // await conn.commit();
- // conn.release();
-
- // const stmtAndVals = queue.map(op => op.getStatementAndValues());
- // const stmts = stmtAndVals.map(x => x.stmt).join('; ');
- // const vals = stmtAndVals.reduce((acc, x) => acc.concat(x.values), []);
-
- // *** uncomment to debug batch queries ***
- // this.log.debug({ stmts, vals });
- // console.log('<<========================');
- // console.log({ stmts, vals });
- // console.log('>>========================');
-
- // this.log.debug('array?', Array.isArray(vals))
-
- await this.db.batch_write(queue.map(op => op.getStatement()));
-
-
- for ( const op of queue ) {
- op.status = op.constructor.STATUS_DONE;
- }
-
- this.flipState_();
- this.status = this.constructor.STATUS_READY;
-
- this.log.info(
- `\x1B[36;1m[${this.label}]\x1B[0m ` +
- `Finished ${queue.length} operations.`
- )
-
- for ( const op of queue ) {
- op.status = op.constructor.STATUS_DONE;
- }
-
- this.checkShouldExec_();
- }
-
- flipState_ () {
- this.currentState = this.deferredState;
- this.deferredState = {
- queue: [],
- updating_uuids: {},
- };
- const queueSizeResolve = this.queueSizeResolve;
- this.mkPromiseForQueueSize_();
- queueSizeResolve();
- }
-
- _registerCommands (commands) {
- commands.registerCommands('mysql-fsentry-service', [
- {
- id: 'get-queue-size-current',
- description: 'Get the current queue size',
- handler: async (args, log) => {
- log.log(this.currentState.queue.length);
- }
- },
- {
- id: 'get-queue-size-deferred',
- description: 'Get the deferred queue size',
- handler: async (args, log) => {
- log.log(this.deferredState.queue.length);
- }
- }
- ])
- }
-}
-
-module.exports = {
- DatabaseFSEntryService
-};
\ No newline at end of file
diff --git a/packages/backend/src/filesystem/storage/SizeService.js b/packages/backend/src/filesystem/storage/SizeService.js
deleted file mode 100644
index 3d9929d039..0000000000
--- a/packages/backend/src/filesystem/storage/SizeService.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { get_dir_size, id2path, get_user, invalidate_cached_user_by_id } = require("../../helpers");
-
-const { DB_WRITE } = require("../../services/database/consts");
-const { Context } = require("../../util/context");
-
-// TODO: expose to a utility library
-class UserParameter {
- static async adapt (value) {
- if ( typeof value == 'object' ) return value;
- const query_object = typeof value === 'number'
- ? { id: value }
- : { username: value };
- return await get_user(query_object);
- }
-}
-
-class SizeService {
- constructor ({ services }) {
- this.db = services.get('database').get(DB_WRITE, 'filesystem');
- this.log = services.get('log-service').create('size-service');
- this.errors = services.get('error-service').create(this.log);
-
- this.usages = {};
-
- const svc_commands = services.get('commands');
- svc_commands.registerCommands('size', [
- {
- id: 'get-usage',
- description: 'get usage for a user',
- handler: async (args, log) => {
- const user = await UserParameter.adapt(args[0]);
- const usage = await this.get_usage(user.id);
- log.log(`usage: ${usage} bytes`);
- }
- },
- {
- id: 'get-capacity',
- description: 'get storage capacity for a user',
- handler: async (args, log) => {
- const user = await UserParameter.adapt(args[0]);
- const capacity = await this.get_storage_capacity(user);
- log.log(`capacity: ${capacity} bytes`);
- }
- },
- {
- id: 'get-cache-size',
- description: 'get the number of cached users',
- handler: async (args, log) => {
- const size = Object.keys(this.usages).length;
- log.log(`cache size: ${size}`);
- }
- },
- ])
- }
-
- async get_usage (user_id) {
- // if ( this.usages.hasOwnProperty(user_id) ) {
- // return this.usages[user_id];
- // }
-
- const fsentry = await this.db.read(
- "SELECT SUM(size) AS total FROM `fsentries` WHERE `user_id` = ? LIMIT 1",
- [user_id]
- );
- if(!fsentry[0] || !fsentry[0].total) {
- this.usages[user_id] = 0;
- } else {
- this.usages[user_id] = parseInt(fsentry[0].total);
- }
-
- return this.usages[user_id];
- }
-
- async change_usage (user_id, delta) {
- const usage = await this.get_usage(user_id);
- this.usages[user_id] = usage + delta;
- }
-
- // TODO: remove fs arg and update all calls
- async add_node_size (fs, node, user, factor = 1) {
- const {
- fsEntryService
- } = Context.get('services').values;
-
- let sz;
- if ( node.entry.is_dir ) {
- if ( node.entry.uuid ) {
- sz = await fsEntryService.get_recursive_size(node.entry.uuid);
- } else {
- // very unlikely, but a warning is better than a throw right now
- // TODO: remove this once we're sure this is never hit
- this.log.warn('add_node_size: node has no uuid :(', node)
- sz = await get_dir_size(await id2path(node.mysql_id), user);
- }
- } else {
- sz = node.entry.size;
- }
- await this.change_usage(user.id, sz * factor);
- }
-
- async get_storage_capacity (user_or_id) {
- const user = await UserParameter.adapt(user_or_id);
- return user.free_storage;
- }
-
- /**
- * Attempt to add storage for a user.
-
- * In the case of an error, this method will fail silently to the caller and
- * produce an alarm for further investigation.
- *
- * @param {*} user_or_id - user id, username, or user object
- * @param {*} amount_in_bytes - amount of bytes to add
- * @param {*} reason - please specify a reason for the storage increase
- * @param {*} param3 - optional fields to add to the audit log
- */
- async add_storage (user_or_id, amount_in_bytes, reason, { field_a, field_b } = {}) {
- const user = await UserParameter.adapt(user_or_id);
- const capacity = await this.get_storage_capacity(user);
-
- // Audit log
- {
- const entry = {
- user_id: user.id,
- user_id_keep: user.id,
- amount: amount_in_bytes,
- reason,
- ...(field_a ? { field_a } : {}),
- ...(field_b ? { field_b } : {}),
- };
-
- const fields_ = Object.keys(entry);
- const fields = fields_.join(', ');
- const placeholders = fields_.map(f => '?').join(', ');
- const values = fields_.map(f => entry[f]);
-
- try {
- await this.db.write(
- `INSERT INTO storage_audit (${fields}) VALUES (${placeholders})`,
- values,
- );
- } catch (e) {
- this.errors.report('size-service.audit-add-storage', {
- source: e,
- trace: true,
- alarm: true,
- })
- }
- }
-
- // Storage increase
- {
- try {
- const res = await this.db.write(
- "UPDATE `user` SET `free_storage` = ? WHERE `id` = ? LIMIT 1",
- [capacity + amount_in_bytes, user.id]
- );
- if ( ! res.anyRowsAffected ) {
- throw new Error(`add_storage: failed to update user ${user.id}`);
- }
- } catch (e) {
- this.errors.report('size-service.add-storage', {
- source: e,
- trace: true,
- alarm: true,
- })
- }
- invalidate_cached_user_by_id(user.id);
- }
- }
-}
-
-module.exports = {
- SizeService,
-};
diff --git a/packages/backend/src/filesystem/storage/SystemFSEntryService.js b/packages/backend/src/filesystem/storage/SystemFSEntryService.js
deleted file mode 100644
index e9abb9baee..0000000000
--- a/packages/backend/src/filesystem/storage/SystemFSEntryService.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2024 Puter Technologies Inc.
- *
- * This file is part of Puter.
- *
- * Puter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-const { PuterPath } = require("../lib/PuterPath");
-
-// Redis keys:
-// :::::
-//
-// note: is added by redisService automatically.
-//
-// If `` is `multi`, then the format differs slightly:
-//