diff --git a/.cursor/rules/test-location.mdc b/.cursor/rules/test-location.mdc
new file mode 100644
index 00000000..c717f429
--- /dev/null
+++ b/.cursor/rules/test-location.mdc
@@ -0,0 +1,5 @@
+---
+description: Describes where to write test files
+globs: *.test.ts
+---
+test files are placed in the same folder of the file they test. For example [get-files.test.ts](mdc:plugma/src/tasks/common/get-files.test.ts) is beside [get-files.ts](mdc:plugma/src/tasks/common/get-files.ts)
\ No newline at end of file
diff --git a/.cursor/rules/vitest.mdc b/.cursor/rules/vitest.mdc
new file mode 100644
index 00000000..87e351eb
--- /dev/null
+++ b/.cursor/rules/vitest.mdc
@@ -0,0 +1,163 @@
+---
+description: Vitest usage guide
+globs: **/*.test.ts
+---
+ # Vitest Usage Guide
+
+## Basic Test Structure
+
+Tests are organized following these patterns:
+
+~~~typescript
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+
+describe('Component/Feature Name', () => {
+ // Setup and teardown
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ describe('Specific Aspect', () => {
+ test('should do something specific', () => {
+ // Test implementation
+ });
+ });
+});
+~~~
+
+## Mocking Patterns
+
+### Module Mocking
+
+1. **Hoisted Mocks**: Use `vi.hoisted()` for mocks needed across multiple tests:
+~~~typescript
+const mocks = vi.hoisted(() => ({
+ registerCleanup: vi.fn(),
+ getDirName: vi.fn(),
+}));
+
+vi.mock('#utils/cleanup.js', () => ({
+ registerCleanup: mocks.registerCleanup,
+}));
+~~~
+
+2. **Partial Module Mocks**: Keep original functionality while mocking specific exports:
+~~~typescript
+vi.mock('node:fs', () => ({
+ ...vi.importActual('node:fs'),
+ readFileSync: vi.fn((path) => {
+ // Custom implementation
+ }),
+}));
+~~~
+
+3. **External Module Mocks**: Mock external dependencies:
+~~~typescript
+vi.mock('vite', () => ({
+ createServer: vi.fn(),
+}));
+~~~
+
+### Mock Implementations
+
+1. **Mock Classes**: Create mock implementations for complex objects:
+~~~typescript
+class MockWebSocketServer extends EventEmitter {
+ clients = new Set();
+ close = vi.fn().mockResolvedValue(undefined);
+ // ... other methods
+}
+~~~
+
+2. **Mock Functions**: Use `vi.fn()` with specific implementations:
+~~~typescript
+const mockFn = vi.fn()
+ .mockReturnValue(defaultValue)
+ .mockImplementation((arg) => {
+ // Custom implementation
+ });
+~~~
+
+3. **Async Mocks**: Handle promises in mocks:
+~~~typescript
+mockFunction.mockResolvedValue(value); // for Promise.resolve
+mockFunction.mockRejectedValue(error); // for Promise.reject
+~~~
+
+## Testing Patterns
+
+### Cleanup and Reset
+
+1. **Clear Mocks**: Reset all mocks before each test:
+~~~typescript
+beforeEach(() => {
+ vi.clearAllMocks();
+});
+~~~
+
+2. **Mock Reset**: Reset specific mocks:
+~~~typescript
+mockFunction.mockClear(); // Clear usage data
+mockFunction.mockReset(); // Clear usage and implementation
+mockFunction.mockRestore(); // Restore original implementation
+~~~
+
+### Assertions
+
+1. **Function Calls**:
+~~~typescript
+expect(mockFn).toHaveBeenCalled();
+expect(mockFn).toHaveBeenCalledWith(expect.any(Function));
+expect(mockFn).toHaveBeenCalledTimes(1);
+~~~
+
+2. **Objects and Values**:
+~~~typescript
+expect(result).toBe(value); // Strict equality
+expect(object).toEqual(expected); // Deep equality
+expect(object).toMatchObject(partial); // Partial object match
+~~~
+
+3. **Async Tests**:
+~~~typescript
+await expect(asyncFn()).rejects.toThrow('error message');
+await expect(asyncFn()).resolves.toBe(value);
+~~~
+
+### Event Testing
+
+1. **Event Emitters**:
+~~~typescript
+mockServer.emit('connection', mockClient, { url: '?source=test' });
+expect(mockClient.send).toHaveBeenCalledWith(
+ expect.stringContaining('"event":"client_list"')
+);
+~~~
+
+2. **Error Events**:
+~~~typescript
+await expect(
+ () => new Promise((_, reject) => {
+ server.on('error', reject);
+ server.emit('error', new Error('Test error'));
+ })
+).rejects.toThrow('Expected error');
+~~~
+
+## Best Practices
+
+1. **Organize Tests**: Group related tests using nested `describe` blocks
+2. **Mock Isolation**: Use `beforeEach` to reset mocks and state
+3. **Type Safety**: Maintain type safety in mocks using TypeScript interfaces
+4. **Error Cases**: Test both success and error scenarios
+5. **Clear Descriptions**: Use descriptive test names that explain the expected behavior
+6. **Avoid Test Interdependence**: Each test should be independent and not rely on other tests
+
+## Common Gotchas
+
+1. **Async Cleanup**: Always handle async cleanup in tests
+2. **Mock Scope**: Be aware of mock hoisting and scoping rules
+3. **Event Order**: Consider event timing in async tests
+4. **Type Assertions**: Use proper type assertions for mocked objects
+5. **Promise Handling**: Always await promises in async tests
+~~~
diff --git a/.editorconfig b/.editorconfig
index 92e643ca..c357259e 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -3,7 +3,6 @@ root = true
[*]
charset = utf-8
end_of_line = lf
-indent_size = 4
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index 2974d138..00000000
--- a/.prettierrc
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "useTabs": true,
- "semi": false,
- "singleQuote": true,
- "printWidth": 120,
- "braceStyle": "collapse,preserve-inline",
- "overrides": [
- {
- "files": "*.md",
- "options": {
- "useTabs": false,
- "tabWidth": 4
- }
- }
- ]
-}
diff --git a/package-lock.json b/package-lock.json
index 1dbfc3d4..4817dae2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,7 +17,8 @@
"devDependencies": {
"@dotenv-run/esbuild": "^1.4.0",
"@vercel/analytics": "^1.3.1",
- "taskr": "^1.1.0"
+ "taskr": "^1.1.0",
+ "vitest": "^3.0.4"
}
},
"node_modules/@ampproject/remapping": {
@@ -72,7 +73,6 @@
"os": [
"aix"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -89,7 +89,6 @@
"os": [
"android"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -106,7 +105,6 @@
"os": [
"android"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -123,7 +121,6 @@
"os": [
"android"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -140,7 +137,6 @@
"os": [
"darwin"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -157,7 +153,6 @@
"os": [
"darwin"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -174,7 +169,6 @@
"os": [
"freebsd"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -191,7 +185,6 @@
"os": [
"freebsd"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -208,7 +201,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -225,7 +217,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -242,7 +233,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -259,7 +249,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -276,7 +265,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -293,7 +281,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -310,7 +297,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -327,7 +313,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -344,7 +329,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -361,7 +345,6 @@
"os": [
"netbsd"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -378,7 +361,6 @@
"os": [
"openbsd"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -395,7 +377,6 @@
"os": [
"sunos"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -412,7 +393,6 @@
"os": [
"win32"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -429,7 +409,6 @@
"os": [
"win32"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -446,7 +425,6 @@
"os": [
"win32"
],
- "peer": true,
"engines": {
"node": ">=12"
}
@@ -718,8 +696,7 @@
"optional": true,
"os": [
"android"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.24.0",
@@ -732,8 +709,7 @@
"optional": true,
"os": [
"android"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.24.0",
@@ -746,8 +722,7 @@
"optional": true,
"os": [
"darwin"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.24.0",
@@ -760,8 +735,7 @@
"optional": true,
"os": [
"darwin"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.24.0",
@@ -774,8 +748,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.24.0",
@@ -788,8 +761,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.24.0",
@@ -802,8 +774,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.24.0",
@@ -816,8 +787,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.24.0",
@@ -830,8 +800,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.24.0",
@@ -844,8 +813,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.24.0",
@@ -858,8 +826,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.24.0",
@@ -872,8 +839,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.24.0",
@@ -886,8 +852,7 @@
"optional": true,
"os": [
"linux"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.24.0",
@@ -900,8 +865,7 @@
"optional": true,
"os": [
"win32"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.24.0",
@@ -914,8 +878,7 @@
"optional": true,
"os": [
"win32"
- ],
- "peer": true
+ ]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.24.0",
@@ -928,8 +891,7 @@
"optional": true,
"os": [
"win32"
- ],
- "peer": true
+ ]
},
"node_modules/@sveltejs/vite-plugin-svelte": {
"version": "3.1.2",
@@ -974,8 +936,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/@types/node": {
"version": "22.7.6",
@@ -1008,6 +969,119 @@
}
}
},
+ "node_modules/@vitest/expect": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.4.tgz",
+ "integrity": "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.0.4",
+ "@vitest/utils": "3.0.4",
+ "chai": "^5.1.2",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.4.tgz",
+ "integrity": "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.0.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.4.tgz",
+ "integrity": "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.4.tgz",
+ "integrity": "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.0.4",
+ "pathe": "^2.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.4.tgz",
+ "integrity": "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.0.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.4.tgz",
+ "integrity": "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.4.tgz",
+ "integrity": "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.0.4",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
"node_modules/acorn": {
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
@@ -1070,6 +1144,16 @@
"node": ">= 0.4"
}
},
+ "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/axobject-query": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
@@ -1105,6 +1189,33 @@
"concat-map": "0.0.1"
}
},
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chai": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
+ "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "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": ">=12"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -1128,6 +1239,16 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
"license": "MIT"
},
+ "node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
"node_modules/chokidar": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
@@ -1214,9 +1335,9 @@
}
},
"node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -1230,6 +1351,16 @@
}
}
},
+ "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"
+ }
+ },
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -1267,13 +1398,19 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
+ "node_modules/es-module-lexer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/esbuild": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz",
"integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==",
"hasInstallScript": true,
"license": "MIT",
- "peer": true,
"bin": {
"esbuild": "bin/esbuild"
},
@@ -1320,11 +1457,20 @@
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/estree": "^1.0.0"
}
},
+ "node_modules/expect-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
+ "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -1373,7 +1519,6 @@
"os": [
"darwin"
],
- "peer": true,
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
@@ -1516,10 +1661,17 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
+ "node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/magic-string": {
- "version": "0.30.11",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
- "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
@@ -1669,6 +1821,23 @@
"node": ">=0.10.0"
}
},
+ "node_modules/pathe": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
+ "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
"node_modules/periscopic": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
@@ -1685,8 +1854,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
- "license": "ISC",
- "peer": true
+ "license": "ISC"
},
"node_modules/postcss": {
"version": "8.4.47",
@@ -1707,7 +1875,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.1.0",
@@ -1728,7 +1895,6 @@
}
],
"license": "MIT",
- "peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -1769,7 +1935,6 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/estree": "1.0.6"
},
@@ -1830,6 +1995,13 @@
"integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==",
"dev": true
},
+ "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": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -1847,11 +2019,24 @@
"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",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
+ "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/std-env": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+ "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -1950,6 +2135,13 @@
"node": ">= 4.6"
}
},
+ "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/tinydate": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz",
@@ -1960,6 +2152,43 @@
"node": ">=4"
}
},
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinypool": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+ "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -2002,7 +2231,6 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
"integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -2057,6 +2285,29 @@
}
}
},
+ "node_modules/vite-node": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.4.tgz",
+ "integrity": "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.0",
+ "es-module-lexer": "^1.6.0",
+ "pathe": "^2.0.2",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
"node_modules/vitefu": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
@@ -2071,6 +2322,93 @@
}
}
},
+ "node_modules/vitest": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.4.tgz",
+ "integrity": "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "3.0.4",
+ "@vitest/mocker": "3.0.4",
+ "@vitest/pretty-format": "^3.0.4",
+ "@vitest/runner": "3.0.4",
+ "@vitest/snapshot": "3.0.4",
+ "@vitest/spy": "3.0.4",
+ "@vitest/utils": "3.0.4",
+ "chai": "^5.1.2",
+ "debug": "^4.4.0",
+ "expect-type": "^1.1.0",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.2",
+ "std-env": "^3.8.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinypool": "^1.0.2",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
+ "vite-node": "3.0.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.0.4",
+ "@vitest/ui": "3.0.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "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": ">=8"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
diff --git a/package.json b/package.json
index 7295bf65..79626dc6 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"devDependencies": {
"@dotenv-run/esbuild": "^1.4.0",
"@vercel/analytics": "^1.3.1",
- "taskr": "^1.1.0"
+ "taskr": "^1.1.0",
+ "vitest": "^3.0.4"
}
}
diff --git a/packages/plugma/.cursor/notes/.gitignore b/packages/plugma/.cursor/notes/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/packages/plugma/.cursor/notes/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/packages/plugma/.cursor/rules/code-style.mdc b/packages/plugma/.cursor/rules/code-style.mdc
new file mode 100644
index 00000000..ce707f63
--- /dev/null
+++ b/packages/plugma/.cursor/rules/code-style.mdc
@@ -0,0 +1,10 @@
+---
+description: Preferences regarding code style
+globs: *.ts,*.js,*.svelte,*.tsx
+---
+- Your notes folder is `.cursor/notes` (at the root of the workspace or projects in monorepos) is yours to use. Only you will ever read the contents in there. Use it to store plans, task lists, notes, learnings, and important reminders for you.
+- When your response contains the code of a markdown file, code blocks inside said markdown file MUST use "~~~"
+- when importing node native modules, like fs or url, always prepend them with 'node:', like in 'node:fs' and 'node:url'
+- Always document exported functions, classes, types, etc with a robust TSDoc comment. Also document complex functions, even if not exported.
+- Use "for ... of" loops instead `.forEach`.
+- to prevent issues with commands being aliased, always use `command BUILTIN` for built-in commands, like `command cat` or `command ls`.
\ No newline at end of file
diff --git a/packages/plugma/.cursorignore b/packages/plugma/.cursorignore
new file mode 100644
index 00000000..b723f6cc
--- /dev/null
+++ b/packages/plugma/.cursorignore
@@ -0,0 +1,2 @@
+# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
+archive/
diff --git a/packages/plugma/.cursorrules b/packages/plugma/.cursorrules
new file mode 100644
index 00000000..9ca5c148
--- /dev/null
+++ b/packages/plugma/.cursorrules
@@ -0,0 +1,32 @@
+- Your notes folder is `.claude-notes` (at the root of the workspace or projects in monorepos) is yours to use. Only you will ever read the contents in there. Use it to store plans, task lists, notes, learnings, and important reminders for you.
+- When your response contains the code of a markdown file, code blocks inside said markdown file MUST use "~~~"
+- when importing node native modules, like fs or url, always prepend them with 'node:', like in 'node:fs' and 'node:url'
+- Always document exported functions, classes, types, etc with a robust TSDoc comment. Also document complex functions, even if not exported.
+- Use "for ... of" loops instead `.forEach`.
+- to prevent issues with commands being aliased, always use `command BUILTIN` for built-in commands, like `command cat` or `command ls`.
+- When fixing test failures:
+ 1. Analyze test structure and organization:
+ - Verify all imports are hoisted to the top
+ - Check that vi.hoisted() is used for mock objects
+ - Ensure mock implementations are defined before use
+ 2. Review mock setup and implementation:
+ - Verify centralized mocks object contains all required mocks
+ - Check mock functions return appropriate values/promises
+ - Ensure consistent mocking patterns are used
+ 3. Validate module mocking:
+ - Confirm all external modules are mocked with vi.mock()
+ - Verify mocked implementations reference hoisted mocks
+ - Check mock implementations match expected behavior
+ 4. Inspect test lifecycle management:
+ - Review beforeEach/afterEach setup and cleanup
+ - Verify mocks are cleared between test runs
+ - Check initialization state is correct
+ 5. Debug test execution:
+ - Run tests and capture detailed error output
+ - Analyze failure messages and stack traces
+ - Fix issues iteratively, verifying each change
+ 6. Common failure points to check:
+ - File operations match mock filesystem state
+ - Async operations resolve in expected order
+ - Event handlers and watchers trigger correctly
+ - Collections/sets have proper initial state
diff --git a/packages/plugma/.editorconfig b/packages/plugma/.editorconfig
new file mode 100644
index 00000000..9ed9efd3
--- /dev/null
+++ b/packages/plugma/.editorconfig
@@ -0,0 +1,3 @@
+tab_width = 2
+indent_size = 2
+indent_style = space
diff --git a/packages/plugma/.gitignore b/packages/plugma/.gitignore
new file mode 100644
index 00000000..404abb22
--- /dev/null
+++ b/packages/plugma/.gitignore
@@ -0,0 +1 @@
+coverage/
diff --git a/packages/plugma/.vscode/extensions.json b/packages/plugma/.vscode/extensions.json
new file mode 100644
index 00000000..4116f52a
--- /dev/null
+++ b/packages/plugma/.vscode/extensions.json
@@ -0,0 +1,13 @@
+{
+ "recommendations": [
+ "streetsidesoftware.code-spell-checker",
+ "streetsidesoftware.code-spell-checker-portuguese",
+ "streetsidesoftware.code-spell-checker-portuguese-brazilian",
+ "ms-vsliveshare.vsliveshare",
+ "svelte.svelte-vscode",
+ "gplane.dprint2",
+ "biomejs.biome",
+ "oven.bun-vscode",
+ "foxundermoon.shell-format"
+ ]
+}
diff --git a/packages/plugma/.vscode/launch.json b/packages/plugma/.vscode/launch.json
new file mode 100644
index 00000000..de72bd1d
--- /dev/null
+++ b/packages/plugma/.vscode/launch.json
@@ -0,0 +1,94 @@
+{
+ "version": "0.2.0",
+ "compounds": [
+ {
+ "name": "Run Figma then Attach",
+ "configurations": ["Run Figma", "Wait to Attach to Figma"],
+ "stopAll": false,
+ "presentation": {
+ "hidden": false,
+ // __ will place this at the top of the debug menu
+ "group": "__",
+ "order": 1
+ }
+ }
+ ],
+ "configurations": [
+ {
+ "name": "Run Figma",
+ "type": "node",
+ "request": "launch",
+ "cwd": "${workspaceFolder}",
+ "internalConsoleOptions": "neverOpen",
+ "runtimeExecutable": "/Applications/Figma.app/Contents/MacOS/Figma",
+ "runtimeArgs": [
+ "--args",
+ "--remote-debugging-port=9222",
+ "--inspect",
+ "--log-level=2",
+ "-v=2"
+ ],
+ "outputCapture": "std",
+ "autoAttachChildProcesses": true,
+ "console": "integratedTerminal",
+ "presentation": {
+ "hidden": false,
+ "group": "Figma",
+ "order": 1
+ }
+ },
+ {
+ "name": "Debug Jest Tests",
+ "type": "node",
+ "request": "launch",
+ "runtimeArgs": [
+ "--inspect-brk",
+ "${workspaceRoot}/../../../../node_modules/.bin/jest",
+ "--runInBand"
+ ],
+ "console": "integratedTerminal",
+ "internalConsoleOptions": "neverOpen"
+ },
+ {
+ "preLaunchTask": "Wait for it",
+ "name": "Wait to Attach to Figma",
+ "type": "chrome",
+ "request": "attach",
+ "address": "localhost",
+ "port": 9222,
+ "targetSelection": "pick",
+ "pauseForSourceMap": true,
+ "pathMapping": {
+ "/file/": "${workspaceFolder}/",
+ "../src/": "${workspaceFolder}/src/",
+ "src/": "${workspaceFolder}/src/"
+ },
+ "presentation": {
+ "hidden": true,
+ "group": "Figma",
+ "order": 2
+ },
+ "internalConsoleOptions": "openOnSessionStart"
+ },
+ {
+ "name": "Attach to Figma",
+ "type": "chrome",
+ "request": "attach",
+ "address": "localhost",
+ "port": 9222,
+ "targetSelection": "pick",
+ "pauseForSourceMap": true,
+ "pathMapping": {
+ "/file/": "${workspaceFolder}/",
+ "../src/": "${workspaceFolder}/src/",
+ "src/": "${workspaceFolder}/src/"
+ },
+ "presentation": {
+ "hidden": false,
+ "group": "Figma",
+ "order": 2
+ },
+ "internalConsoleOptions": "openOnSessionStart"
+ }
+ ]
+}
diff --git a/packages/plugma/.vscode/settings.json b/packages/plugma/.vscode/settings.json
new file mode 100644
index 00000000..5289e4cf
--- /dev/null
+++ b/packages/plugma/.vscode/settings.json
@@ -0,0 +1,67 @@
+{
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "gplane.dprint2",
+ "[javascript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[svelte]": {
+ "editor.defaultFormatter": "svelte.svelte-vscode"
+ },
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.patterns": {
+ "Config Files.md": "biome.*, dprint.*, .env*, *.cjs, *.config.ts, *.setup.ts, .git*, *.config, *.config.json, *config.js, *config.mjs, *config.cjs, *config.ts, *config.toml, *config.yaml, *config.yml, *rc, *rc.json, *rc.js, *rc.mjs, *rc.cjs, *rc.ts, *rc.toml, *rc.yaml, *rc.yml, *ignore, Dockerfile*, docker-*, *.toml, package-lock.json, yarn.lock, pnpm-lock.yaml, .prototools, rollup.*, renovate.json, .size-limit.*, vitest*",
+ "*.json": "${capture}.lock",
+ "*.ts": "${capture}.test.ts"
+ },
+ "search.exclude": {
+ "**/coverage": true,
+ "**/dist": true,
+ "**/node_modules": true
+ },
+ "typescript.enablePromptUseWorkspaceTsdk": true,
+ "typescript.preferences.autoImportFileExcludePatterns": ["dist/**"],
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "cSpell.words": [
+ "@endindex",
+ "antfu",
+ "Automator",
+ "biomejs",
+ "clickoutside",
+ "commitlint",
+ "conventionalcommits",
+ "dprint",
+ "endindex",
+ "Fong",
+ "plugma",
+ "stylelint",
+ "texthighlight",
+ "tokilabs",
+ "typecheck"
+ ],
+ "gutterpreview.enableReferenceLookup": true,
+ "gutterpreview.currentColorForSVG": "#CCC",
+ "svelte.enable-ts-plugin": true,
+ "svelte-autoimport.doubleQuotes": false,
+ "svelte.plugin.svelte.format.config.singleQuote": true,
+ "prettier.jsxSingleQuote": true,
+ "prettier.singleQuote": true,
+ "yaml.format.singleQuote": true,
+ "[jsonc]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "editor.codeActionsOnSave": {
+ // "source.organizeImports": "always",
+ // "source.fixAll": "always",
+ // "source.fixAll.biome": "always",
+ // "source.organizeImports.biome": "always",
+ // "source.removeUnusedImports": "always",
+ // "source.sortImports": "always"
+ },
+ "vitest.rootConfig": "vitest.config.ts"
+}
diff --git a/packages/plugma/.vscode/tasks.json b/packages/plugma/.vscode/tasks.json
new file mode 100644
index 00000000..53990be0
--- /dev/null
+++ b/packages/plugma/.vscode/tasks.json
@@ -0,0 +1,71 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
+ // for the documentation about the tasks.json format
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Wait for it",
+ "detail": "Sleeps for 10 seconds",
+ "type": "shell",
+ "command": "sleep 10",
+ "isBackground": false,
+ "windows": {
+ "command": "ping 127.0.0.1 -n 10 > nul"
+ },
+ "runOptions": {
+ "instanceLimit": 1,
+ },
+ "promptOnClose": false,
+ "hide": false,
+ "presentation": {
+
+ "reveal": "never",
+ "panel": "dedicated",
+ "showReuseMessage": false,
+ "close": true,
+ "echo": false
+ },
+ "problemMatcher": []
+ },
+ {
+ "label": "RunFigma",
+ "type": "shell",
+ "command": "/Applications/Figma.app/Contents/MacOS/Figma",
+ "detail": "Runs figma with remote debugging and inspect enabled",
+ "isBackground": true,
+ "args": [
+ "--args",
+ "--remote-debugging-port=9222",
+ "--inspect",
+ "--log-level=2",
+ "-v=2",
+ "--no-sandbox",
+ "--log-file=${workspaceFolder}/figma.log"
+ ],
+ "promptOnClose": true,
+ "runOptions": {
+ "instanceLimit": 1
+ },
+ "presentation": {
+ "echo": true,
+ "reveal": "always",
+ "focus": false,
+ "panel": "new",
+ "showReuseMessage": true,
+ "clear": false
+ },
+ "problemMatcher": {
+ "owner": "electron",
+ "fileLocation": "autoDetect",
+ "pattern": {
+ "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
+ "file": 1,
+ "line": 2,
+ "column": 3,
+ "severity": 4,
+ "message": 5
+ }
+ }
+ }
+ ]
+}
diff --git a/packages/plugma/Changelog.md b/packages/plugma/Changelog.md
new file mode 100644
index 00000000..334858c9
--- /dev/null
+++ b/packages/plugma/Changelog.md
@@ -0,0 +1,6 @@
+# Changelog
+
+## 1.3.0
+
+- Conversion of the codebase to typescript
+-
diff --git a/packages/plugma/Config Files.md b/packages/plugma/Config Files.md
new file mode 100644
index 00000000..7d394a01
--- /dev/null
+++ b/packages/plugma/Config Files.md
@@ -0,0 +1,4 @@
+# Configuration Files
+
+This mainly serves as a way to group configuration files together via a setting in the `.vscode/settings.json` file.
+But we can also add documentation here in the future to help onboard new contributors.
diff --git a/packages/plugma/apps/DevToolbar.html b/packages/plugma/apps/DevToolbar.html
deleted file mode 100644
index ee7ff3fc..00000000
--- a/packages/plugma/apps/DevToolbar.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/packages/plugma/apps/apps-architecture.md b/packages/plugma/apps/apps-architecture.md
new file mode 100644
index 00000000..1c53d34b
--- /dev/null
+++ b/packages/plugma/apps/apps-architecture.md
@@ -0,0 +1,184 @@
+# A Tale of 3 Apps
+
+## Overview
+
+Plugma orchestrates three apps to enable modern plugin development with browser-based hot reloading while maintaining secure communication with Figma:
+
+1. **FigmaBridge** - The secure communication bridge (formerly PluginWindow)
+2. **DevServer** - The development environment host (formerly ViteApp)
+3. **Plugin UI** - The user's plugin interface
+
+## Fourth Layer: Runtime Core
+
+~~~mermaid
+graph TD
+ R[plugma-runtime] --> F[Figma Integration]
+ R --> S[State Management]
+ R --> I[API Interception]
+ R --> M[Message Routing]
+~~~
+
+**Key Responsibilities**:
+- Figma API interception/proxying
+- Window state management
+- Client storage operations
+- Message validation/transformation
+- Cross-environment consistency
+
+**Injection Points**:
+- Development: Injected into both FigmaBridge and Plugin UI
+- Production: Only injected into Plugin UI
+
+## Apps Roles & Injection Points
+
+### FigmaBridge
+- **Role**: Acts as a secure bridge between Figma and the development environment
+- **Injection**: Used only during development/preview (`plugma dev` or `plugma preview`)
+- **Location**: Injected into `ui.html` as a wrapper around the user's Plugin UI
+- **Key Responsibilities**:
+ - Manages iframe containing DevServer/Plugin UI
+ - Handles bi-directional message relay between:
+ - Figma (parent window)
+ - Plugin UI (iframe)
+ - WebSocket server
+ - Syncs Figma styles and classes
+ - Provides developer toolbar
+ - Monitors server status
+
+### DevServer
+- **Role**: Hosts the user's Plugin UI in development
+- **Injection**: Only used during development/preview
+- **Location**: Served by Vite dev server, loaded in FigmaBridge's iframe
+- **Key Responsibilities**:
+ - Provides hot module replacement (HMR)
+ - Handles WebSocket communication
+ - Manages developer tools state
+ - Provides fallback error displays
+
+### Plugin UI
+- **Role**: The user's actual plugin interface
+- **Injection**: Always present (dev, preview, and production)
+- **Location**:
+ - Dev/Preview: Inside DevServer
+ - Production: Direct in Figma
+- **Key Responsibilities**:
+ - Implements the plugin's interface
+ - Handles user interactions
+ - Communicates with Figma's plugin API
+
+## Command Behavior
+
+### Development (`plugma dev`)
+- Uses FigmaBridge and DevServer
+- Full development features (HMR, dev tools)
+- Unminified code for better debugging
+- WebSocket server optional (--ws flag)
+
+### Preview (`plugma preview`)
+- Uses FigmaBridge and DevServer
+- Production-like build (minified/optimized)
+- Development features still available
+- WebSocket server enabled by default
+- Plugin window starts minimized
+
+### Build (`plugma build`)
+- Creates final production bundle
+- No FigmaBridge or DevServer included
+- Direct compilation of Plugin UI
+- Minified and optimized for production
+- No development features
+
+## Communication Flow
+
+~~~
+Development/Preview:
+┌─────────────┐ ┌────────────────┐ ┌─────────────┐
+│ │ │ FigmaBridge │ │ │
+│ Figma │ ◄─────► │ (bridge) │ ◄─────► │ Plugin UI │
+│ │ │ │ │ │
+└─────────────┘ └────────────────┘ └─────────────┘
+ ▲
+ │
+ ▼
+ ┌─────────────┐
+ │ WebSocket │
+ │ Server │
+ └─────────────┘
+
+Production (after build):
+┌─────────────┐ ┌─────────────┐
+│ │ │ │
+│ Figma │ ◄─────► │ Plugin UI │
+│ │ │ │
+└─────────────┘ └─────────────┘
+~~~
+
+## Why Three Apps?
+
+1. **Sandboxing & Security**
+ - Figma plugins run in a highly restricted sandbox environment
+ - The Plugin UI can only communicate with Figma through `postMessage` and specific APIs
+ - Direct communication between a browser-based dev server and Figma is not possible
+
+2. **Development vs Production**
+ - DevServer is purely for development - it includes HMR, dev tools, and other development features
+ - These development features would bloat the production bundle and potentially cause issues in Figma
+ - By having FigmaBridge separate, we can strip out all development features in production
+
+3. **Message Routing Complexity**
+ - When developing in a browser, we need to simulate Figma's message passing
+ - FigmaBridge acts as a "virtual Figma" in the browser, maintaining the same messaging patterns
+ - This ensures the Plugin UI works the same in development as it will in production
+
+If we tried to do everything in DevServer:
+1. We'd have to include all the Figma message handling code in the production bundle
+2. Development features would be harder to strip out
+3. The architecture would be less flexible for future enhancements
+4. We'd lose the clear separation between development environment and production code
+
+The three-app approach gives us a clean separation of concerns:
+- FigmaBridge: Handles Figma integration and message routing
+- DevServer: Handles development experience and hot reloading
+- Plugin UI: Focuses purely on plugin functionality
+
+This makes the codebase more maintainable and ensures plugins work consistently in both development and production environments.
+
+## Implementation Details
+
+### CLI Integration
+1. During `plugma dev`:
+ - FigmaBridge is injected into `ui.html`
+ - DevServer serves the development version of the Plugin UI
+ - WebSocket server enables real-time communication
+
+2. During `plugma build`:
+ - Only essential production code is included
+ - Development-specific features are stripped out
+
+### Message Handling
+- Messages flow through multiple contexts:
+ 1. Figma → FigmaBridge → Plugin UI
+ 2. Plugin UI → FigmaBridge → Figma
+ 3. WebSocket ↔ All Apps
+
+### Style Synchronization
+- FigmaBridge monitors Figma styles/classes
+- Changes are propagated to DevServer/Plugin UI
+- Ensures consistent appearance during development
+
+## Benefits
+1. **Developer Experience**
+ - Hot reloading
+ - Browser developer tools
+ - Real-time style updates
+
+2. **Production Ready**
+ - Clean separation of concerns
+ - Minimal production bundle
+ - Maintained plugin functionality
+
+3. **Flexibility**
+ - Support for various UI frameworks
+ - Extensible architecture
+ - Framework-agnostic approach
+~~~
diff --git a/packages/plugma/apps/dev-server/App.svelte b/packages/plugma/apps/dev-server/App.svelte
new file mode 100644
index 00000000..cf93b637
--- /dev/null
+++ b/packages/plugma/apps/dev-server/App.svelte
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+{#if !(isInsideIframe || isInsideFigma)}
+ {#if isServerActive}
+ {#if !isWebsocketsEnabled}
+
+ {:else if !isWebsocketServerActive}
+
+ {:else if $pluginWindowClients.length < 1}
+
+ {/if}
+ {:else}
+
+ {/if}
+{/if}
diff --git a/packages/plugma/apps/dev-server/README.md b/packages/plugma/apps/dev-server/README.md
new file mode 100644
index 00000000..d4388cf3
--- /dev/null
+++ b/packages/plugma/apps/dev-server/README.md
@@ -0,0 +1,54 @@
+# DevServer
+
+The main application component that handles communication between Figma and the plugin's UI, manages WebSocket connections, and handles various UI states.
+
+## App.svelte
+
+The main component that orchestrates the plugin's functionality. Here's what it does:
+
+### Core Features
+
+1. **Figma Integration**
+ - Detects if running inside Figma or an iframe
+ - Handles Figma-specific keyboard shortcuts (⌘P for plugin re-run)
+ - Manages Figma styles and class synchronization
+
+2. **WebSocket Communication**
+ - Sets up bidirectional communication between plugin UI and server
+ - Maintains connection status and handles reconnection
+ - Intercepts and relays messages when running outside Figma
+
+3. **Message Handling**
+ - Implements custom message event handling
+ - Manages postMessage interception for non-Figma environments
+ - Maintains style synchronization between Figma and plugin UI
+
+4. **UI State Management**
+ - Shows connection status when not in Figma
+ - Handles developer tools integration
+ - Manages toolbar visibility
+
+### Technical Details
+
+- Uses Svelte for reactivity and component management
+- Implements WebSocket connection monitoring
+- Stores Figma styles in localStorage for persistence across reloads
+- Provides fallback behavior when running outside Figma
+
+### States & Conditions
+
+The component handles several states:
+
+- WebSocket server connection status
+- Figma connection status
+- Developer tools status
+- Plugin window client connections
+
+### Environment Detection
+
+Automatically detects and adapts behavior based on:
+
+- Whether it's running inside Figma
+- Whether it's running in an iframe
+- WebSocket availability
+- Server connection status
diff --git a/packages/plugma/apps/dev-server/index.html b/packages/plugma/apps/dev-server/index.html
new file mode 100644
index 00000000..25abe2f2
--- /dev/null
+++ b/packages/plugma/apps/dev-server/index.html
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/plugma/apps/dev-server/main.ts b/packages/plugma/apps/dev-server/main.ts
new file mode 100644
index 00000000..709daf66
--- /dev/null
+++ b/packages/plugma/apps/dev-server/main.ts
@@ -0,0 +1,12 @@
+import App from './App.svelte';
+
+// if (!PLUGMA_APP_NAME) {
+// throw new Error('PLUGMA_APP_NAME environment variable is not defined');
+// }
+
+const app = new App({
+ // biome-ignore lint/style/noNonNullAssertion:
+ target: document.getElementById('dev-server')!,
+});
+
+export default app;
diff --git a/packages/plugma/apps/dev-server/vite.config.ts b/packages/plugma/apps/dev-server/vite.config.ts
new file mode 100644
index 00000000..d65159fe
--- /dev/null
+++ b/packages/plugma/apps/dev-server/vite.config.ts
@@ -0,0 +1,5 @@
+import { defineConfig } from 'vite';
+
+import { createAppConfig } from '../vite.create-app-config';
+
+export default defineConfig(createAppConfig('dev-server'));
diff --git a/packages/plugma/apps/figma-bridge/App.svelte b/packages/plugma/apps/figma-bridge/App.svelte
new file mode 100644
index 00000000..12c6e60a
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/App.svelte
@@ -0,0 +1,160 @@
+
+
+{#if $isDeveloperToolsActive}
+
+{/if}
+
+
+
+
+{#if $isLocalhostWithoutPort}
+
+{:else if !isServerActive}
+
+{/if}
+
+
diff --git a/packages/plugma/apps/figma-bridge/README.md b/packages/plugma/apps/figma-bridge/README.md
new file mode 100644
index 00000000..fe5ef526
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/README.md
@@ -0,0 +1,65 @@
+# Plugin Window App
+
+The Plugin Window app serves as a wrapper/container for Figma plugins, providing essential functionality for plugin-Figma communication, developer tools, and server status monitoring.
+
+## Core Features
+
+- **Iframe Management**: Hosts the plugin's UI in an iframe, handling URL monitoring and redirects
+- **Bi-directional Communication**: Relays messages between:
+ - Figma (parent window)
+ - Plugin UI (iframe)
+ - WebSocket server
+- **Figma Styles Sync**: Monitors and syncs Figma's classes and styles to ensure UI consistency
+- **Developer Tools**: Provides a toolbar for development when developer tools are active
+- **Server Status**: Monitors and displays the development server status
+
+## Architecture
+
+### Communication Flow
+
+~~~
+┌─────────────┐ ┌────────────────┐ ┌─────────────┐
+│ │ │ Plugin Window │ │ │
+│ Figma │ ◄─────► │ (wrapper) │ ◄─────► │ Plugin UI │
+│ │ │ │ │ │
+└─────────────┘ └────────────────┘ └─────────────┘
+ ▲
+ │
+ ▼
+ ┌─────────────┐
+ │ WebSocket │
+ │ Server │
+ └─────────────┘
+~~~
+
+### Key Components
+
+1. **WebSocket Setup**
+ - Establishes communication channels between all parties
+ - Handles message routing and relay
+
+2. **Figma Integration**
+ - Syncs Figma's classes and styles
+ - Monitors style changes and propagates updates
+ - Handles Figma-specific window management
+
+3. **Development Features**
+ - Developer toolbar (when dev tools are active)
+ - Server status monitoring
+ - Error reporting for localhost issues
+
+### Event Handling
+
+The app implements several observers and event handlers:
+- Style and class changes in Figma
+- Server status monitoring
+- Developer tools status
+- Window resizing
+- Message relay between different contexts
+
+## Technical Details
+
+- Uses Svelte for the UI framework
+- Implements real-time bi-directional communication
+- Monitors both HTML classes and stylesheet changes
+- Provides fallback error displays for server issues
diff --git a/packages/plugma/apps/figma-bridge/app.css b/packages/plugma/apps/figma-bridge/app.css
new file mode 100644
index 00000000..e5484a45
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/app.css
@@ -0,0 +1,28 @@
+.figma-dark {
+ --elevation-400-menu-panel:
+ 0px 10px 16px rgba(0, 0, 0, 0.35), 0px 2px 5px rgba(0, 0, 0, 0.35), inset 0px 0.5px 0px rgba(255, 255, 255, 0.08), inset 0px 0px 0.5px rgba(
+ 255,
+ 255,
+ 255,
+ 0.35
+ );
+}
+
+.figma-light {
+ --elevation-400-menu-panel: 0px 0px 0.5px rgba(0, 0, 0, 0.12), 0px 10px 16px rgba(0, 0, 0, 0.12), 0px 2px 5px rgba(0, 0, 0, 0.15);
+}
+
+:where(html) {
+ --radius-medium: 0.3125rem;
+ --radius-large: 0.8125rem;
+ --ramp-grey-900: #1e1e1e;
+ --ramp-grey-700: #383838;
+ --color-bg-menu: var(--ramp-grey-900);
+ --color-border-menu: var(--ramp-grey-700);
+}
+
+#figma-bridge {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+}
diff --git a/packages/plugma/apps/figma-bridge/components/Button.svelte b/packages/plugma/apps/figma-bridge/components/Button.svelte
new file mode 100644
index 00000000..e4c36a48
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Button.svelte
@@ -0,0 +1,109 @@
+
+
+
+
+{#if href}
+
+ {#if loading}
+
+ {:else}
+
+ {/if}
+
+{:else}
+
+ {#if loading}
+
+ {:else}
+
+ {/if}
+
+{/if}
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/Counter.svelte b/packages/plugma/apps/figma-bridge/components/Counter.svelte
new file mode 100644
index 00000000..979b4dfc
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Counter.svelte
@@ -0,0 +1,10 @@
+
+
+
+ count is {count}
+
diff --git a/packages/plugma/apps/figma-bridge/components/Dropdown.svelte b/packages/plugma/apps/figma-bridge/components/Dropdown.svelte
new file mode 100644
index 00000000..2af082b7
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Dropdown.svelte
@@ -0,0 +1,113 @@
+
+
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/DropdownDivider.svelte b/packages/plugma/apps/figma-bridge/components/DropdownDivider.svelte
new file mode 100644
index 00000000..428eae7d
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/DropdownDivider.svelte
@@ -0,0 +1,10 @@
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/DropdownItem.svelte b/packages/plugma/apps/figma-bridge/components/DropdownItem.svelte
new file mode 100644
index 00000000..de5c89b2
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/DropdownItem.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/Icon.svelte b/packages/plugma/apps/figma-bridge/components/Icon.svelte
new file mode 100644
index 00000000..d7a63b91
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Icon.svelte
@@ -0,0 +1,91 @@
+
+
+
+ {#if svg === "horizontal-ellipsis"}
+
+
+
+
+
+ {/if}
+
+ {#if svg === "socket-connected"}
+
+
+
+
+ {/if}
+
+ {#if svg === "socket-disconnected"}
+
+
+
+ {/if}
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/Select.svelte b/packages/plugma/apps/figma-bridge/components/Select.svelte
new file mode 100644
index 00000000..e14dde13
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Select.svelte
@@ -0,0 +1,178 @@
+
+
+
+
+ Select an option
+ {#each options as option (option.value)}
+ {#if option.isDivider}
+ ────────
+ {:else}
+ {option.label}
+ {/if}
+ {/each}
+
+
+
+
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/components/Toolbar.svelte b/packages/plugma/apps/figma-bridge/components/Toolbar.svelte
new file mode 100644
index 00000000..e5ff391b
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/components/Toolbar.svelte
@@ -0,0 +1,198 @@
+
+
+
+
+
+
diff --git a/packages/plugma/apps/figma-bridge/index.html b/packages/plugma/apps/figma-bridge/index.html
new file mode 100644
index 00000000..4c234772
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/index.html
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/plugma/apps/figma-bridge/lib/monitorDeveloperToolsStatus.js b/packages/plugma/apps/figma-bridge/lib/monitorDeveloperToolsStatus.js
new file mode 100644
index 00000000..8ab681e1
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/lib/monitorDeveloperToolsStatus.js
@@ -0,0 +1,18 @@
+import {
+ isDeveloperToolsActive,
+ pluginWindowSettings,
+} from '../../shared/stores';
+
+export async function monitorDeveloperToolsStatus() {
+ return new Promise((resolve) => {
+ window.addEventListener('message', async (event) => {
+ const message = event.data?.pluginMessage;
+
+ if (message?.event === 'PLUGMA_PLUGIN_WINDOW_SETTINGS') {
+ pluginWindowSettings.set(message.data);
+ isDeveloperToolsActive.set(message.data.toolbarEnabled);
+ resolve(true);
+ }
+ });
+ });
+}
diff --git a/packages/plugma/apps/figma-bridge/lib/redirectIframe.js b/packages/plugma/apps/figma-bridge/lib/redirectIframe.js
new file mode 100644
index 00000000..12c52419
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/lib/redirectIframe.js
@@ -0,0 +1,36 @@
+import { Logger } from '../../../src/utils/log/logger';
+
+const log = new Logger({
+ debug: window.runtimeData.debug,
+});
+
+// FIXME: Does this need changing so styles are applied as soon as url is changed, and the rest of the stuff loads when the iframe loads?
+export async function redirectIframe(iframe, url) {
+ return new Promise((resolve, reject) => {
+ // Set the iframe source
+
+ iframe.src = new URL(url).href;
+
+ function onIframeLoad() {
+ log.info(`Iframe successfully redirected to: ${iframe.src}`);
+
+ // Resolve the promise when the iframe is successfully loaded
+ resolve('Iframe successfully redirected');
+ iframe.removeEventListener('load', onIframeLoad);
+ }
+ // Listen for the iframe's load event
+ iframe.addEventListener('load', onIframeLoad); // Remove the listener after it's called
+ // pluginWindowIframe.onload = function () {
+ // iframeLoaded = true
+ // console.log('Iframe successfully redirected to:', pluginWindowIframe.src)
+
+ // // Resolve the promise when the iframe is successfully loaded
+ // resolve('Iframe successfully redirected')
+ // }
+
+ // Set a timeout in case the iframe fails to load after a certain time
+ setTimeout(() => {
+ reject(new Error('Iframe redirection timeout or failed'));
+ }, 5000); // You can adjust the timeout duration as necessary
+ });
+}
diff --git a/packages/plugma/apps/figma-bridge/lib/setBodyStyles.js b/packages/plugma/apps/figma-bridge/lib/setBodyStyles.js
new file mode 100644
index 00000000..a8df1995
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/lib/setBodyStyles.js
@@ -0,0 +1,9 @@
+// Remove padding and margin because app has it's own body tag
+export function setBodyStyles() {
+ document.body.style.padding = '0'
+ document.body.style.margin = '0'
+ document.body.style.color = 'var(--figma-color-text)'
+ document.body.style.fontFamily = 'Inter, system-ui, Helvetica, Arial, sans-serif'
+ document.body.style.fontSize = '16px'
+ document.body.style.display = 'flex'
+}
diff --git a/packages/plugma/apps/figma-bridge/main.ts b/packages/plugma/apps/figma-bridge/main.ts
new file mode 100644
index 00000000..0b36ec5a
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/main.ts
@@ -0,0 +1,13 @@
+import App from './App.svelte';
+import "./app.css";
+
+// if (!PLUGMA_APP_NAME) {
+// throw new Error('PLUGMA_APP_NAME environment variable is not defined');
+// }
+
+const app = new App({
+ // biome-ignore lint/style/noNonNullAssertion:
+ target: document.getElementById('figma-bridge')!,
+});
+
+export default app;
diff --git a/packages/plugma/apps/figma-bridge/stores.js b/packages/plugma/apps/figma-bridge/stores.js
new file mode 100644
index 00000000..1d6a4b33
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/stores.js
@@ -0,0 +1,3 @@
+import { writable } from 'svelte/store';
+
+export const isDeveloperToolsActive = writable(false);
diff --git a/packages/plugma/apps/figma-bridge/vite.config.ts b/packages/plugma/apps/figma-bridge/vite.config.ts
new file mode 100644
index 00000000..ddb974db
--- /dev/null
+++ b/packages/plugma/apps/figma-bridge/vite.config.ts
@@ -0,0 +1,5 @@
+import { defineConfig } from 'vite';
+
+import { createAppConfig } from '../vite.create-app-config';
+
+export default defineConfig(createAppConfig('figma-bridge'));
diff --git a/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-resize.ts b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-resize.ts
new file mode 100644
index 00000000..97acde1d
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-resize.ts
@@ -0,0 +1,23 @@
+import { getWindowSettings } from '../utils/get-window-settings';
+import { figmaApi } from './figma-api';
+
+/**
+ * Custom resize function that takes into account minimized state.
+ * @param width - The desired window width
+ * @param height - The desired window height
+ */
+export function customResize(width: number, height: number): void {
+ getWindowSettings().then((pluginWindowSettings) => {
+ const dimensions = {
+ width,
+ height,
+ };
+
+ if (pluginWindowSettings.minimized) {
+ dimensions.height = 40;
+ dimensions.width = 200;
+ }
+
+ figmaApi.resize(dimensions.width, dimensions.height);
+ });
+}
diff --git a/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-show-ui.ts b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-show-ui.ts
new file mode 100644
index 00000000..04b8b969
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/custom-show-ui.ts
@@ -0,0 +1,107 @@
+import type { PlugmaRuntimeData, ShowUIOptions } from '../types';
+import { getCommandHistory } from '../utils/get-command-history';
+import {
+ DEFAULT_WINDOW_SETTINGS,
+ getWindowSettings,
+} from '../utils/get-window-settings';
+import { figmaApi } from './figma-api';
+
+declare const runtimeData: PlugmaRuntimeData;
+
+/**
+ * Enhanced showUI function with support for window settings persistence and positioning.
+ * @param htmlString - The HTML content to display in the plugin window
+ * @param initialOptions - Configuration options for the plugin window
+ */
+export function customShowUI(
+ htmlString: string,
+ initialOptions?: ShowUIOptions,
+): void {
+ const options = { ...initialOptions };
+
+ // Show UI to receive messages
+ const mergedOptions = { visible: false, ...options };
+ figmaApi.showUI(htmlString, mergedOptions);
+
+ getCommandHistory().then((commandHistory) => {
+ getWindowSettings(DEFAULT_WINDOW_SETTINGS['dev']).then(
+ (pluginWindowSettings) => {
+ const hasCommandChanged =
+ commandHistory.previousCommand !== runtimeData.command;
+ const hasInstanceChanged =
+ commandHistory.previousInstanceId !== runtimeData.instanceId;
+
+ if (runtimeData.command === 'preview') {
+ pluginWindowSettings.minimized = true;
+ pluginWindowSettings.toolbarEnabled = true;
+
+ const zoom = figma.viewport.zoom;
+ options.position = {
+ x: figma.viewport.bounds.x + (12 / zoom),
+ y: figma.viewport.bounds.y + (figma.viewport.bounds.height - ((80 + 12) / zoom))
+ };
+ }
+
+ if (hasCommandChanged && runtimeData.command === 'dev') {
+ const zoom = figma.viewport.zoom;
+
+ if (!options.position) {
+ options.position = {
+ x: figma.viewport.center.x - (options.width || 300) / 2 / zoom,
+ y:
+ figma.viewport.center.y -
+ ((options.height || 200) + 41) / 2 / zoom,
+ };
+ }
+ }
+
+ if (hasInstanceChanged && runtimeData.command === 'preview') {
+ pluginWindowSettings.toolbarEnabled = true;
+ pluginWindowSettings.minimized = true;
+ }
+
+ if (options.height) {
+ pluginWindowSettings.height = options.height;
+ }
+
+ if (options.width) {
+ pluginWindowSettings.width = options.width;
+ }
+
+ if (pluginWindowSettings.toolbarEnabled && options.height) {
+ options.height += 41; // Add toolbar height
+ }
+
+ if (pluginWindowSettings.minimized) {
+ options.height = 40;
+ options.width = 200;
+ }
+
+ // Apply window dimensions
+ if (options.width && options.height) {
+ figmaApi.resize(options.width, options.height);
+ } else if (pluginWindowSettings.toolbarEnabled) {
+ figmaApi.resize(300, 241); // 200 + 41 for toolbar
+ } else {
+ figmaApi.resize(300, 200);
+ }
+
+ // Apply window position
+ if (options.position?.x != null && options.position?.y != null) {
+ figmaApi.reposition(options.position.x, options.position.y);
+ }
+
+ // Notify UI of window settings
+ figma.ui.postMessage({
+ event: 'PLUGMA_PLUGIN_WINDOW_SETTINGS',
+ data: pluginWindowSettings,
+ });
+
+ // Show UI unless explicitly set to false
+ if (options.visible !== false) {
+ figma.ui.show();
+ }
+ },
+ );
+ });
+}
diff --git a/packages/plugma/apps/plugma-runtime/figma-api-interceptors/figma-api.ts b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/figma-api.ts
new file mode 100644
index 00000000..c4c6ed82
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/figma-api.ts
@@ -0,0 +1,10 @@
+/**
+ * References to native Figma functions.
+ * Since our runtime code is injected after all Vite transformations,
+ * we can safely access Figma APIs directly.
+ */
+export const figmaApi = {
+ resize: figma.ui.resize.bind(figma.ui),
+ showUI: figma.showUI.bind(figma),
+ reposition: figma.ui.reposition.bind(figma.ui),
+} as const;
diff --git a/packages/plugma/apps/plugma-runtime/figma-api-interceptors/index.ts b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/index.ts
new file mode 100644
index 00000000..b31ad404
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/figma-api-interceptors/index.ts
@@ -0,0 +1,6 @@
+//@index('./*', f => `export * from '${f.path}.js';`)
+export * from '../types.js';
+export * from './custom-resize.js';
+export * from './custom-show-ui.js';
+export * from './figma-api.js';
+//@endindex
diff --git a/packages/plugma/apps/plugma-runtime/handlers/delete-client-storage.ts b/packages/plugma/apps/plugma-runtime/handlers/delete-client-storage.ts
new file mode 100644
index 00000000..c99378f9
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/delete-client-storage.ts
@@ -0,0 +1,20 @@
+import type { PluginMessage } from '../types.js';
+
+/**
+ * Deletes all client storage data except for the Figma stylesheet.
+ * Notifies the user when the operation is complete.
+ */
+export async function handleDeleteClientStorage(
+ _msg: PluginMessage,
+): Promise {
+ const clientStorageKeys = await figma.clientStorage.keysAsync();
+ for (const key of clientStorageKeys) {
+ if (key !== 'figma-stylesheet') {
+ await figma.clientStorage.deleteAsync(key);
+ console.log(`[plugma] ${key} deleted from clientStorage`);
+ }
+ }
+ figma.notify('ClientStorage deleted');
+}
+
+handleDeleteClientStorage.EVENT_NAME = 'PLUGMA_DELETE_CLIENT_STORAGE' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/delete-file-storage.ts b/packages/plugma/apps/plugma-runtime/handlers/delete-file-storage.ts
new file mode 100644
index 00000000..f772551d
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/delete-file-storage.ts
@@ -0,0 +1,16 @@
+import type { PluginMessage } from '../types.js';
+
+/**
+ * Deletes all plugin data stored in the root node.
+ * Notifies the user when the operation is complete.
+ */
+export function handleDeleteFileStorage(_msg: PluginMessage): void {
+ const pluginDataKeys = figma.root.getPluginDataKeys();
+ for (const key of pluginDataKeys) {
+ figma.root.setPluginData(key, '');
+ console.log(`[plugma] ${key} deleted from root pluginData`);
+ }
+ figma.notify('Root pluginData deleted');
+}
+
+handleDeleteFileStorage.EVENT_NAME = 'PLUGMA_DELETE_FILE_STORAGE' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/delete-root-pluginData.ts b/packages/plugma/apps/plugma-runtime/handlers/delete-root-pluginData.ts
new file mode 100644
index 00000000..719f5c8c
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/delete-root-pluginData.ts
@@ -0,0 +1,12 @@
+/**
+ * Handles deletion of all plugin data from the root node
+ */
+export async function handleDeleteRootPluginData() {
+ const pluginDataKeys = figma.root.getPluginDataKeys();
+ for (const key of pluginDataKeys) {
+ figma.root.setPluginData(key, "");
+ console.log(`[plugma] ${key} deleted from root pluginData`);
+ }
+ figma.notify("Root pluginData deleted");
+}
+handleDeleteRootPluginData.EVENT_NAME = "PLUGMA_DELETE_ROOT_PLUGIN_DATA";
diff --git a/packages/plugma/apps/plugma-runtime/handlers/get-on-run-messages.ts b/packages/plugma/apps/plugma-runtime/handlers/get-on-run-messages.ts
new file mode 100644
index 00000000..d97ccdb7
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/get-on-run-messages.ts
@@ -0,0 +1,20 @@
+import type { PluginMessage } from '../types.js';
+
+/**
+ * Retrieves and posts all saved on-run messages to the UI.
+ */
+export async function handleGetOnRunMessages(
+ _msg: PluginMessage,
+): Promise {
+ const data = (await figma.clientStorage.getAsync(
+ 'plugma-on-run-messages',
+ )) as Array<{
+ pluginMessage: unknown;
+ }>;
+
+ for (const msg of data) {
+ figma.ui.postMessage(msg.pluginMessage);
+ }
+}
+
+handleGetOnRunMessages.EVENT_NAME = 'PLUGMA_GET_ON_RUN_MESSAGES' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/hide-toolbar.ts b/packages/plugma/apps/plugma-runtime/handlers/hide-toolbar.ts
new file mode 100644
index 00000000..99619285
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/hide-toolbar.ts
@@ -0,0 +1,20 @@
+import { figmaApi } from '../figma-api-interceptors/figma-api';
+import type { PluginMessage } from '../types';
+import { getWindowSettings } from '../utils/get-window-settings';
+import { saveWindowSettings } from './save-window-settings';
+
+/**
+ * Handles toolbar visibility toggle request.
+ * Updates window height and settings based on toolbar state.
+ */
+export async function handleHideToolbar(_msg: PluginMessage): Promise {
+ if (!figmaApi) throw new Error('Figma API not available');
+
+ const settings = await getWindowSettings();
+ settings.toolbarEnabled = false;
+ figmaApi.resize(settings.width, settings.height);
+
+ await saveWindowSettings(settings);
+}
+
+handleHideToolbar.EVENT_NAME = 'PLUGMA_HIDE_TOOLBAR' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/index.ts b/packages/plugma/apps/plugma-runtime/handlers/index.ts
new file mode 100644
index 00000000..ae504ef7
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/index.ts
@@ -0,0 +1,12 @@
+//@index('./!(*.test).*', f => `export * from '${f.path}.js';`)
+export * from './delete-client-storage.js';
+export * from './delete-file-storage.js';
+export * from './delete-root-pluginData.js';
+export * from './get-on-run-messages.js';
+export * from './hide-toolbar.js';
+export * from './maximize-window.js';
+export * from './minimize-window.js';
+export * from './save-on-run-messages.js';
+export * from './save-window-settings.js';
+export * from './setup.js';
+//@endindex
diff --git a/packages/plugma/apps/plugma-runtime/handlers/maximize-window.ts b/packages/plugma/apps/plugma-runtime/handlers/maximize-window.ts
new file mode 100644
index 00000000..22b23b7f
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/maximize-window.ts
@@ -0,0 +1,22 @@
+import { figmaApi } from '../figma-api-interceptors/figma-api';
+import type { PluginMessage } from '../types';
+import { getWindowSettings } from '../utils/get-window-settings';
+import { saveWindowSettings } from './save-window-settings';
+
+/**
+ * Handles window maximization request.
+ * Restores window to previous dimensions and updates settings.
+ */
+export async function handleMaximizeWindow(_msg: PluginMessage): Promise {
+ if (!figmaApi) throw new Error('Figma API not available');
+
+ const settings = await getWindowSettings();
+ settings.minimized = false;
+ const height = settings.toolbarEnabled
+ ? settings.height + 41
+ : settings.height;
+ figmaApi.resize(settings.width, height);
+ await saveWindowSettings(settings);
+}
+
+handleMaximizeWindow.EVENT_NAME = 'PLUGMA_MAXIMIZE_WINDOW' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/minimize-window.ts b/packages/plugma/apps/plugma-runtime/handlers/minimize-window.ts
new file mode 100644
index 00000000..2e3465c2
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/minimize-window.ts
@@ -0,0 +1,19 @@
+import { figmaApi } from '../figma-api-interceptors/figma-api.js';
+import type { PluginMessage } from '../types.js';
+import { getWindowSettings } from '../utils/get-window-settings.js';
+import { saveWindowSettings } from './save-window-settings.js';
+
+/**
+ * Handles window minimization request.
+ * Sets window dimensions to minimized state (200x40) and updates settings.
+ */
+export async function handleMinimizeWindow(_msg: PluginMessage): Promise {
+ if (!figmaApi) throw new Error('Figma API not available');
+
+ const settings = await getWindowSettings();
+ settings.minimized = true;
+ figmaApi.resize(200, 40);
+ await saveWindowSettings(settings);
+}
+
+handleMinimizeWindow.EVENT_NAME = 'PLUGMA_MINIMIZE_WINDOW' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/save-on-run-messages.ts b/packages/plugma/apps/plugma-runtime/handlers/save-on-run-messages.ts
new file mode 100644
index 00000000..b0b41830
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/save-on-run-messages.ts
@@ -0,0 +1,12 @@
+import type { PluginMessage } from '../types.js';
+
+/**
+ * Saves messages that should be replayed when the plugin runs.
+ */
+export async function handleSaveOnRunMessages(
+ msg: PluginMessage,
+): Promise {
+ await figma.clientStorage.setAsync('plugma-on-run-messages', msg.data);
+}
+
+handleSaveOnRunMessages.EVENT_NAME = 'plugma-save-on-run-messages' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.test.ts b/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.test.ts
new file mode 100644
index 00000000..85291d61
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.test.ts
@@ -0,0 +1,80 @@
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
+import { WINDOW_SETTINGS_KEY, type WindowSettings } from '../types.js';
+import { handleSaveWindowSettings } from './save-window-settings.js';
+
+// Mock Figma API
+const mocks = vi.hoisted(() => ({
+ clientStorage: {
+ getAsync: vi.fn(),
+ setAsync: vi.fn(),
+ },
+ resize: vi.fn(),
+}));
+
+// @ts-expect-error - Mocking global figma object
+global.figma = {
+ clientStorage: mocks.clientStorage,
+ ui: {
+ // Mock the resize function using string concatenation
+ // to match the production code's Vite workaround
+ ['re' + 'size']: mocks.resize,
+ },
+};
+
+describe('Save Window Settings', () => {
+ const defaultSettings: WindowSettings = {
+ width: 300,
+ height: 200,
+ minimized: false,
+ toolbarEnabled: true,
+ };
+
+ beforeEach(() => {
+ mocks.clientStorage.getAsync.mockResolvedValue(defaultSettings);
+ mocks.clientStorage.setAsync.mockResolvedValue(undefined);
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('should save new window settings', async () => {
+ const newSettings = {
+ width: 400,
+ height: 300,
+ };
+
+ await handleSaveWindowSettings({
+ event: handleSaveWindowSettings.EVENT_NAME,
+ data: newSettings,
+ });
+
+ expect(mocks.resize).toHaveBeenCalledWith(400, 341); // height + 41 for toolbar
+ expect(mocks.clientStorage.setAsync).toHaveBeenCalledWith(
+ WINDOW_SETTINGS_KEY,
+ expect.objectContaining(newSettings),
+ );
+ });
+
+ it('should handle missing data', async () => {
+ await handleSaveWindowSettings({
+ event: handleSaveWindowSettings.EVENT_NAME,
+ });
+
+ expect(mocks.resize).not.toHaveBeenCalled();
+ expect(mocks.clientStorage.setAsync).not.toHaveBeenCalled();
+ });
+
+ it('should handle settings without height change', async () => {
+ await handleSaveWindowSettings({
+ event: handleSaveWindowSettings.EVENT_NAME,
+ data: { width: 400 },
+ });
+
+ expect(mocks.resize).not.toHaveBeenCalled();
+ expect(mocks.clientStorage.setAsync).toHaveBeenCalledWith(
+ WINDOW_SETTINGS_KEY,
+ expect.objectContaining({ width: 400 }),
+ );
+ });
+});
diff --git a/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.ts b/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.ts
new file mode 100644
index 00000000..be1df562
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/save-window-settings.ts
@@ -0,0 +1,52 @@
+import { figmaApi } from '../figma-api-interceptors/figma-api';
+import type { PlugmaRuntimeData, WindowSettings } from '../types';
+import { getWindowSettings } from '../utils/get-window-settings';
+
+declare const runtimeData: PlugmaRuntimeData;
+
+const TOOLBAR_HEIGHT = 41;
+
+export async function saveWindowSettings(settings: WindowSettings) {
+ const command = runtimeData.command;
+ const storageKey =
+ command === 'dev'
+ ? 'PLUGMA_PLUGIN_WINDOW_SETTINGS_DEV'
+ : 'PLUGMA_PLUGIN_WINDOW_SETTINGS_PREVIEW';
+
+ await figma.clientStorage.setAsync(storageKey, settings);
+}
+
+/**
+ * Handles saving window settings request.
+ * Updates stored window dimensions and state.
+ */
+export function handleSaveWindowSettings() {
+ figma.ui.onmessage = async (msg) => {
+ if (msg.type === 'PLUGMA_SAVE_PLUGIN_WINDOW_SETTINGS') {
+ // Add back toolbar height adjustment
+ const height = msg.height - (msg.showToolbar ? TOOLBAR_HEIGHT : 0);
+
+ // Maintain original storage key format
+ const storageKey = `PLUGMA_PLUGIN_WINDOW_SETTINGS_${
+ process.env.NODE_ENV === 'development' ? 'DEV' : 'PREVIEW'
+ }`;
+
+ if (!figmaApi) throw new Error('Figma API not available');
+
+ if (!msg.data) return;
+
+ const settings = await getWindowSettings();
+ const newSettings = msg.data as Partial;
+ const mergedSettings = { ...settings, ...newSettings };
+
+ if (newSettings.height) {
+ figmaApi.resize(mergedSettings.width, height);
+ }
+
+ saveWindowSettings(mergedSettings);
+ }
+ };
+}
+
+handleSaveWindowSettings.EVENT_NAME =
+ 'PLUGMA_SAVE_PLUGIN_WINDOW_SETTINGS' as const;
diff --git a/packages/plugma/apps/plugma-runtime/handlers/setup.ts b/packages/plugma/apps/plugma-runtime/handlers/setup.ts
new file mode 100644
index 00000000..ace68f3d
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/handlers/setup.ts
@@ -0,0 +1,41 @@
+import type { EventRegistry, PluginMessage } from '../types.js';
+import { handleDeleteClientStorage } from './delete-client-storage.js';
+import { handleDeleteFileStorage } from './delete-file-storage.js';
+import { handleGetOnRunMessages } from './get-on-run-messages.js';
+import { handleHideToolbar } from './hide-toolbar.js';
+import { handleMaximizeWindow } from './maximize-window.js';
+import { handleMinimizeWindow } from './minimize-window.js';
+import { handleSaveOnRunMessages } from './save-on-run-messages.js';
+import { handleSaveWindowSettings } from './save-window-settings.js';
+
+/**
+ * Map of event handlers to ensure no duplicate event names
+ */
+const handlers: EventRegistry = {
+ [handleDeleteFileStorage.EVENT_NAME]: handleDeleteFileStorage,
+ [handleDeleteClientStorage.EVENT_NAME]: handleDeleteClientStorage,
+ [handleSaveOnRunMessages.EVENT_NAME]: handleSaveOnRunMessages,
+ [handleGetOnRunMessages.EVENT_NAME]: handleGetOnRunMessages,
+ [handleMinimizeWindow.EVENT_NAME]: handleMinimizeWindow,
+ [handleMaximizeWindow.EVENT_NAME]: handleMaximizeWindow,
+ [handleHideToolbar.EVENT_NAME]: handleHideToolbar,
+ [handleSaveWindowSettings.EVENT_NAME]: handleSaveWindowSettings,
+} as const;
+
+/**
+ * Sets up event listeners for the Figma plugin's main thread.
+ * Only active in development or server environments.
+ */
+export function setupListeners(): void {
+ if (
+ process.env.NODE_ENV === 'development' ||
+ process.env.NODE_ENV === 'server'
+ ) {
+ figma.ui.on('message', async (msg: PluginMessage) => {
+ const handler = handlers[msg.event];
+ if (handler) {
+ await Promise.resolve(handler(msg));
+ }
+ });
+ }
+}
diff --git a/packages/plugma/apps/plugma-runtime/index.ts b/packages/plugma/apps/plugma-runtime/index.ts
new file mode 100644
index 00000000..1a3a4ddd
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/index.ts
@@ -0,0 +1,56 @@
+/**
+ * PLUGMA RUNTIME
+ * This module is injected at the top of the plugin's main file.
+ * It provides runtime functionality like window management and event handling.
+ *
+ * @remarks
+ * This code runs in the Figma plugin environment and provides:
+ * - Window management (size, position, persistence)
+ * - Command history tracking
+ * - UI state management
+ * - Safe Figma API access
+ */
+
+import {
+ handleDeleteClientStorage,
+ handleDeleteRootPluginData,
+ handleHideToolbar,
+ handleMaximizeWindow,
+ handleMinimizeWindow,
+ handleSaveWindowSettings,
+} from './handlers/index.js';
+
+import type { PlugmaRuntimeData } from './types.js';
+
+// NOTE: the comment must come after the declare stmt
+// otherwise tsc will remove it
+export declare const runtimeData: PlugmaRuntimeData;
+
+/**
+ * Global runtime data
+ * Vite will inject the runtimeData object below
+ * DO NOT REMOVE THE COMMENT BELOW! IT IS A VITE INJECTION POINT
+ */
+/*--[ RUNTIME_DATA ]--*/
+
+export * from './figma-api-interceptors';
+
+/**
+ * Map of event handlers for window management
+ */
+const windowHandlers = {
+ [handleMinimizeWindow.EVENT_NAME]: handleMinimizeWindow,
+ [handleMaximizeWindow.EVENT_NAME]: handleMaximizeWindow,
+ [handleHideToolbar.EVENT_NAME]: handleHideToolbar,
+ [handleSaveWindowSettings.EVENT_NAME]: handleSaveWindowSettings,
+ [handleDeleteRootPluginData.EVENT_NAME]: handleDeleteRootPluginData,
+ [handleDeleteClientStorage.EVENT_NAME]: handleDeleteClientStorage,
+} as const;
+
+// Set up message listener for window management
+figma.ui.on('message', async (msg) => {
+ const handler = windowHandlers[msg.event as keyof typeof windowHandlers];
+ if (handler) {
+ await Promise.resolve(handler(msg));
+ }
+});
diff --git a/packages/plugma/apps/plugma-runtime/types.ts b/packages/plugma/apps/plugma-runtime/types.ts
new file mode 100644
index 00000000..19a44aef
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/types.ts
@@ -0,0 +1,53 @@
+import type { PlugmaCommand, PlugmaRuntimeData } from '#core/types.js';
+
+export type { PlugmaRuntimeData };
+
+/**
+ * Interface for window settings that can be persisted
+ */
+export interface WindowSettings {
+ width: number;
+ height: number;
+ shouldPersist?: boolean;
+ minimized: boolean;
+ toolbarEnabled: boolean;
+ position?: {
+ x: number;
+ y: number;
+ };
+}
+
+export interface CommandHistory {
+ previousCommand: PlugmaCommand | null;
+ previousInstanceId: string | null;
+}
+
+export interface ShowUIOptions extends WindowSettings {
+ visible?: boolean;
+} /**
+ * Storage key for window settings in Figma's client storage
+ */
+
+export const WINDOW_SETTINGS_KEY = 'PLUGMA_PLUGIN_WINDOW_SETTINGS' as const; /**
+ * Base type for all plugin messages
+ */
+export interface PluginMessage {
+ event: string;
+ data?: unknown;
+ pluginMessage?: unknown;
+}
+/**
+ * Type for message handlers with their event names
+ */
+
+export interface MessageHandler {
+ (msg: PluginMessage): Promise | void;
+ EVENT_NAME: string;
+}
+/**
+ * Registry to ensure event name uniqueness across listeners
+ */
+
+export type EventRegistry = {
+ [K in string]: MessageHandler;
+};
diff --git a/packages/plugma/apps/plugma-runtime/utils/get-command-history.ts b/packages/plugma/apps/plugma-runtime/utils/get-command-history.ts
new file mode 100644
index 00000000..6b40a660
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/utils/get-command-history.ts
@@ -0,0 +1,33 @@
+import type { CommandHistory, PlugmaRuntimeData } from '../types.js';
+
+declare const runtimeData: PlugmaRuntimeData;
+
+/**
+ * Retrieves and updates command history from client storage.
+ * Used to track previous plugin instances and commands.
+ * @returns Promise The previous command and instance information
+ */
+export async function getCommandHistory(): Promise {
+ let commandHistory = (await figma.clientStorage.getAsync(
+ 'PLUGMA_COMMAND_HISTORY',
+ )) as CommandHistory;
+
+ // If there's no history, initialize the commandHistory object
+ if (!commandHistory) {
+ commandHistory = {
+ previousCommand: null,
+ previousInstanceId: null,
+ };
+ }
+
+ // Retrieve the previous command to return first
+ const previousCommand = commandHistory.previousCommand;
+ const previousInstanceId = commandHistory.previousInstanceId;
+
+ // Set the current command as the new previous command for future retrievals
+ commandHistory.previousCommand = runtimeData.command ?? null;
+ commandHistory.previousInstanceId = runtimeData.instanceId;
+ await figma.clientStorage.setAsync('PLUGMA_COMMAND_HISTORY', commandHistory);
+
+ return { previousCommand, previousInstanceId };
+}
diff --git a/packages/plugma/apps/plugma-runtime/utils/get-window-settings.ts b/packages/plugma/apps/plugma-runtime/utils/get-window-settings.ts
new file mode 100644
index 00000000..91dd0e14
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/utils/get-window-settings.ts
@@ -0,0 +1,103 @@
+import type { PlugmaCommand } from '#core/types.js';
+import type {
+ PlugmaRuntimeData,
+ ShowUIOptions,
+ WindowSettings,
+} from '../types.js';
+
+declare const runtimeData: PlugmaRuntimeData;
+
+const defaultSettings: WindowSettings = {
+ width: 300,
+ height: 200,
+ minimized: false,
+ toolbarEnabled: false,
+};
+
+const defaultPreviewSettings: WindowSettings = {
+ width: 300,
+ height: 200,
+ minimized: true,
+ toolbarEnabled: true,
+};
+
+// Define default settings for both dev and preview commands
+export const DEFAULT_WINDOW_SETTINGS: {
+ [key in PlugmaCommand]: WindowSettings;
+} = {
+ dev: defaultSettings,
+ preview: defaultPreviewSettings,
+ build: defaultSettings,
+ test: defaultSettings,
+} as const;
+
+const TOOLBAR_HEIGHT = 41;
+
+/**
+ * Retrieves window settings from client storage based on the current command mode.
+ * @param options - Optional UI options that may override stored settings
+ * @returns Promise The window settings to be applied
+ */
+export async function getWindowSettings(
+ options?: Partial,
+): Promise {
+ const command = runtimeData.command;
+
+ // Define storage keys for dev and preview settings
+ const storageKeyDev = 'PLUGMA_PLUGIN_WINDOW_SETTINGS_DEV';
+ const storageKeyPreview = 'PLUGMA_PLUGIN_WINDOW_SETTINGS_PREVIEW';
+ let pluginWindowSettings: WindowSettings | undefined;
+
+ if (command === 'dev') {
+ pluginWindowSettings = (await figma.clientStorage.getAsync(
+ storageKeyDev,
+ )) as WindowSettings;
+
+ if (!pluginWindowSettings) {
+ await figma.clientStorage.setAsync(
+ storageKeyDev,
+ DEFAULT_WINDOW_SETTINGS.dev,
+ );
+ pluginWindowSettings = DEFAULT_WINDOW_SETTINGS.dev;
+ }
+ } else {
+ pluginWindowSettings = (await figma.clientStorage.getAsync(
+ storageKeyPreview,
+ )) as WindowSettings;
+
+ if (!pluginWindowSettings) {
+ await figma.clientStorage.setAsync(
+ storageKeyPreview,
+ DEFAULT_WINDOW_SETTINGS.preview,
+ );
+ pluginWindowSettings = DEFAULT_WINDOW_SETTINGS.preview;
+ }
+ }
+
+ if (options && (!options.width || !options.height)) {
+ pluginWindowSettings.height = 300;
+ pluginWindowSettings.width = 400;
+
+ if (pluginWindowSettings.toolbarEnabled) {
+ pluginWindowSettings.height += TOOLBAR_HEIGHT;
+ }
+ }
+
+ // Simplified validation to match legacy behavior
+ if (!pluginWindowSettings || typeof pluginWindowSettings !== 'object') {
+ return DEFAULT_WINDOW_SETTINGS[command as PlugmaCommand];
+ }
+
+ // Only validate position if it exists
+ if (pluginWindowSettings.position) {
+ const { x, y } = pluginWindowSettings.position;
+ if (!Number.isInteger(x) || !Number.isInteger(y) || x < 0 || y < 0) {
+ pluginWindowSettings.position = { x: 0, y: 0 };
+ }
+ }
+
+ return {
+ ...DEFAULT_WINDOW_SETTINGS[command as PlugmaCommand],
+ ...pluginWindowSettings,
+ };
+}
diff --git a/packages/plugma/apps/plugma-runtime/utils/index.ts b/packages/plugma/apps/plugma-runtime/utils/index.ts
new file mode 100644
index 00000000..4f60ce62
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/utils/index.ts
@@ -0,0 +1,4 @@
+//@index('./*', f => `export * from '${f.path}.js';`)
+export * from './get-command-history.js';
+export * from './get-window-settings.js';
+//@endindex
diff --git a/packages/plugma/apps/plugma-runtime/vite.config.ts b/packages/plugma/apps/plugma-runtime/vite.config.ts
new file mode 100644
index 00000000..96ed1587
--- /dev/null
+++ b/packages/plugma/apps/plugma-runtime/vite.config.ts
@@ -0,0 +1,35 @@
+import { defineConfig } from 'vite';
+import { gatherBuildOutputs } from '../../src/vite-plugins/build/gather-build-outputs';
+
+// const srcRoot = path.resolve(__dirname, '../../src');
+// const entryFile = path.resolve(srcRoot, 'figma/plugma-runtime.ts');
+
+export default defineConfig({
+ build: {
+ lib: {
+ entry: 'index.ts',
+ formats: ['es'],
+ fileName: 'plugma-runtime',
+ },
+ rollupOptions: {
+ output: {
+ inlineDynamicImports: true,
+ // Prevents generating export default
+ exports: 'named'
+ }
+ },
+ target: 'es6',
+ outDir: 'dist', // Vite default output directory
+ minify: false,
+ sourcemap: false,
+ emptyOutDir: false,
+ },
+ plugins: [
+ gatherBuildOutputs({
+ from: `dist`,
+ to: '../../dist/apps',
+ transformPath: (file) => file.replace('.cjs', '.js'),
+ removeSource: false,
+ })
+ ],
+});
diff --git a/packages/plugma/apps/shared/archive/resizePluginWindow.js b/packages/plugma/apps/shared/archive/resizePluginWindow.js
new file mode 100644
index 00000000..e1b040a4
--- /dev/null
+++ b/packages/plugma/apps/shared/archive/resizePluginWindow.js
@@ -0,0 +1,29 @@
+export function resizeFigmaBridge() {
+ // const domEltargetNode = document.getElementById('app')
+ const domEltargetNode = document.body;
+ // Experiment to listen for changes to window size
+ const resizeObserver = new ResizeObserver((entries) => {
+ for (const entry of entries) {
+ // Access the size of the entry (the window in this case)
+ const { width, height } = entry.contentRect;
+ console.log('|||||resize the window', width, height);
+ parent.postMessage(
+ {
+ pluginMessage: {
+ event: 'PLUGMA_RESIZE_WINDOW',
+ data: { width, height: 100 },
+ },
+ pluginId: '*',
+ },
+ '*',
+ );
+ // parent.postMessage({
+ // pluginMessage: { event: 'RESIZE_WINDOW', data: { width, height: 100 } },
+ // pluginId: "*"
+ // }, '*');
+ }
+ });
+
+ // Observe changes on the body or any element related to the window size
+ resizeObserver.observe(domEltargetNode);
+}
diff --git a/packages/plugma/apps/shared/components/ServerStatus.svelte b/packages/plugma/apps/shared/components/ServerStatus.svelte
new file mode 100644
index 00000000..7952d850
--- /dev/null
+++ b/packages/plugma/apps/shared/components/ServerStatus.svelte
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
{displayMessage}
+
+
+
+
+
diff --git a/packages/plugma/apps/shared/lib/monitorUrl.js b/packages/plugma/apps/shared/lib/monitorUrl.js
new file mode 100644
index 00000000..02da5c17
--- /dev/null
+++ b/packages/plugma/apps/shared/lib/monitorUrl.js
@@ -0,0 +1,112 @@
+import { tick } from 'svelte';
+import { isLocalhostWithoutPort } from '../stores';
+
+export function monitorUrl(url, iframe, onStatusChange) {
+ const interval = 1000;
+ let isServerActive = true; // Start as true
+
+ async function checkUrl() {
+ const appElement = document.getElementById('app'); // Select the element with id 'app'
+
+ try {
+ const response = await fetch(url);
+
+ // Server is reachable
+ if (response.ok && !isServerActive) {
+ isServerActive = true;
+ if (appElement) {
+ appElement.style.display = 'block'; // Show the element when the server is active
+ }
+
+ await tick(); // Ensures the DOM updates when `isServerActive` changes
+ onStatusChange(isServerActive); // Call the external function with the new status
+ }
+ // Server is unreachable but no error was thrown (e.g., non-2xx status)
+ else if (!response.ok && isServerActive) {
+ isServerActive = false;
+ appElement.style.display = 'none'; // Hide the element when the server is not active
+ await tick();
+ onStatusChange(isServerActive);
+ }
+ } catch (error) {
+ console.error(error);
+ // If fetch fails, set isServerActive to false if it isn't already
+ if (isServerActive) {
+ isServerActive = false;
+ if (appElement) {
+ appElement.style.display = 'none'; // Hide the element if the server is down
+ }
+ await tick();
+ onStatusChange(isServerActive); // Call the external function with the new status
+ }
+ }
+ }
+
+ // Trigger initial state update, so the DOM reflects that the server is active
+ onStatusChange(isServerActive);
+
+ function hasMatchingLocalhostOrWildcard() {
+ if (
+ !window.runtimeData ||
+ !window.runtimeData.manifest ||
+ !window.runtimeData.manifest.networkAccess ||
+ !window.runtimeData.manifest.networkAccess.devAllowedDomains
+ ) {
+ console.warn(
+ 'networkAccess.devAllowedDomains is not defined or is not an array',
+ );
+ return false;
+ }
+
+ const { devAllowedDomains } = window.runtimeData.manifest.networkAccess;
+
+ // Return false if any domain matches the exclusion criteria
+ const isExcluded = devAllowedDomains.some((domain) => {
+ // Check for a global wildcard "*", which should pass (do not exclude)
+ if (domain === '*') {
+ return false;
+ }
+
+ // Check for HTTP/HTTPS localhost entries with wildcard ports (e.g., http://localhost:*)
+ const wildcardPortPattern =
+ /^(http:\/\/localhost|https:\/\/localhost):\*$/;
+ if (wildcardPortPattern.test(domain)) {
+ return false;
+ }
+
+ // Check for localhost entries with a specific port (e.g., http://localhost:4000)
+ const httpLocalhostWithPort = `http://localhost:${window.runtimeData.port}`;
+ const httpsLocalhostWithPort = `https://localhost:${window.runtimeData.port}`;
+ if (
+ domain === httpLocalhostWithPort ||
+ domain === httpsLocalhostWithPort
+ ) {
+ return false;
+ }
+
+ // Ignore any non-HTTP/HTTPS localhost domains, such as ws://
+ if (
+ !domain.startsWith('http://localhost') &&
+ !domain.startsWith('https://localhost')
+ ) {
+ return false;
+ }
+
+ // If it's an HTTP/HTTPS localhost without a port, mark it as excluded (true)
+ return true;
+ });
+
+ // If no exclusions matched, return true; otherwise, return false
+ return !isExcluded;
+ }
+
+ // Check the URL immediately
+ if (hasMatchingLocalhostOrWildcard()) {
+ isLocalhostWithoutPort.set(false);
+ checkUrl();
+ // Continue checking at the specified interval
+ setInterval(checkUrl, interval);
+ } else {
+ isLocalhostWithoutPort.set(true);
+ }
+}
diff --git a/packages/plugma/apps/shared/lib/setupWebSocket.ts b/packages/plugma/apps/shared/lib/setupWebSocket.ts
new file mode 100644
index 00000000..030ec7aa
--- /dev/null
+++ b/packages/plugma/apps/shared/lib/setupWebSocket.ts
@@ -0,0 +1,408 @@
+import type { PlugmaRuntimeData } from '#core/types.js';
+
+import ReconnectingWebSocket from 'reconnecting-websocket';
+import {
+ localClientConnected,
+ pluginWindowClients,
+ remoteClients,
+} from '../stores.js';
+
+import { Logger } from '#utils/log/logger.js';
+
+declare const runtimeData: PlugmaRuntimeData;
+
+const logger = new Logger({
+ prefix: 'plugma:setupWebSocket',
+ debug: true,
+});
+
+const isInsideIframe = window.self !== window.top;
+const isInsideFigma = typeof figma !== 'undefined';
+
+// Temporary buffer for managing plugin-window clients
+let pluginWindowClientsBuffer = [];
+
+interface ExtendedWebSocket extends ReconnectingWebSocket {
+ post: (messages: any, via: any) => void;
+ on: (callback: any, via: any) => void;
+ open: (callback: () => void) => void;
+ close: (callback?: () => void) => void;
+}
+
+// Encoding and decoding functions for WebSocket messages
+const encodeMessage = (message) => {
+ return JSON.stringify(message, (key, value) => {
+ if (value instanceof Uint8Array) {
+ return {
+ __type: 'Uint8Array',
+ value: btoa(String.fromCharCode(...value)), // Convert Uint8Array to Base64
+ };
+ }
+ return value; // Leave other values unchanged
+ });
+};
+
+const decodeMessage = (message) => {
+ return JSON.parse(message, (key, value) => {
+ if (value && value.__type === 'Uint8Array') {
+ return new Uint8Array(
+ atob(value.value)
+ .split('')
+ .map((char) => char.charCodeAt(0)),
+ ); // Convert Base64 back to Uint8Array
+ }
+ return value; // Leave other values unchanged
+ });
+};
+
+export function setupWebSocket(
+ iframeTarget = null,
+ enableWebSocket = true,
+ registerSource = false,
+): ExtendedWebSocket | typeof mockWebSocket {
+ const messageQueue: any[] = [];
+ const openCallbacks: (() => void)[] = [];
+ const closeCallbacks: (() => void)[] = [];
+ let pingInterval: number;
+
+ const mockWebSocket = {
+ send: (data) => {
+ console.warn('WebSocket is disabled, cannot send data:', data);
+ },
+ post: (messages, via) => {
+ if (Array.isArray(messages)) {
+ messages.forEach((message) => sendMessageToTargets(message, via));
+ } else {
+ sendMessageToTargets(messages, via);
+ }
+ },
+ on: (callback, via) => {
+ if (Array.isArray(via)) {
+ via.forEach((method) => addMessageListener(method, callback));
+ } else {
+ addMessageListener(via, callback);
+ }
+ },
+ open: (callback) => {},
+ close: (callback) => {
+ // console.warn('WebSocket is disabled, no connection to close.')
+ if (callback) {
+ callback();
+ }
+ },
+ addEventListener: (type, listener) => {},
+ removeEventListener: (type, listener) => {},
+ onmessage: null,
+ onopen: null,
+ onclose: null,
+ onerror: null,
+ };
+
+ function sendMessageToTargets(message, via) {
+ if (Array.isArray(via)) {
+ via.forEach((option) => postMessageVia(option, message));
+ } else {
+ postMessageVia(via, message);
+ }
+ }
+
+ function postMessageVia(via, message) {
+ logger.info(`--- ws post, ${via}`, message);
+ if (
+ via === 'iframe' &&
+ iframeTarget &&
+ iframeTarget.contentWindow.postMessage
+ ) {
+ iframeTarget.contentWindow.postMessage(message, '*');
+ } else if (via === 'parent' && window.parent) {
+ window.parent.postMessage(message, '*');
+ } else if (via === 'ws') {
+ if (enableWebSocket) {
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
+ // console.warn('WebSocket is disabled or not open, queuing message:', message)
+ messageQueue.push({ message, via });
+ } else {
+ try {
+ const encodedMessage = encodeMessage(message);
+ ws.send(encodedMessage);
+ } catch (error) {
+ console.log('1', error);
+ }
+ }
+ }
+ } else {
+ console.warn(`Cannot send message via ${via}.`);
+ }
+ }
+
+ function addMessageListener(via, callback) {
+ if (via === 'window') {
+ window.addEventListener('message', callback);
+ } else if (via === 'parent' && window.parent) {
+ window.addEventListener('message', (event) => {
+ if (event.source === window.parent) {
+ callback(event);
+ }
+ });
+ } else if (via === 'ws' && enableWebSocket) {
+ ws.addEventListener('message', (event) => {
+ try {
+ const parsedData = decodeMessage(event.data);
+ const newEvent = { ...event, data: parsedData };
+ callback(newEvent);
+ } catch (error) {
+ console.error('Failed to parse WebSocket message data:', error);
+ callback(event);
+ }
+ });
+ } else {
+ // console.warn(`Cannot add message listener via ${via}.`)
+ }
+ }
+
+ if (!enableWebSocket || !('WebSocket' in window)) {
+ return mockWebSocket;
+ }
+
+ let source = '';
+
+ if (registerSource) {
+ if (isInsideIframe || isInsideFigma) {
+ source = `?source=plugin-window`;
+ } else {
+ source = `?source=browser`;
+ }
+ }
+
+ // Calculate WebSocket port (Vite port + 1)
+ const wsPort = parseInt(String(runtimeData.port)) + 1;
+
+ const ws = new ReconnectingWebSocket(
+ `ws://localhost:${wsPort}/ws${source}`,
+ ) as ExtendedWebSocket;
+
+ ws.post = (messages, via = ['ws']) => {
+ if (Array.isArray(messages)) {
+ messages.forEach((message) => sendMessageToTargets(message, via));
+ } else {
+ sendMessageToTargets(messages, via);
+ }
+ };
+
+ ws.on = (callback, via = ['ws']) => {
+ if (Array.isArray(via)) {
+ via.forEach((method) => addMessageListener(method, callback));
+ } else {
+ addMessageListener(via, callback);
+ }
+ };
+
+ ws.open = (callback: () => void) => {
+ openCallbacks.push(callback);
+ if (ws.readyState === WebSocket.OPEN) {
+ callback();
+ }
+ };
+
+ ws.close = (callback?: () => void) => {
+ closeCallbacks.push(callback);
+ if (ws.readyState === WebSocket.OPEN) {
+ ws.addEventListener('close', () => {
+ clearInterval(pingInterval);
+ closeCallbacks.forEach((cb) => cb && cb());
+ });
+ ws.close();
+ } else {
+ logger.info('WebSocket is not open, nothing to close.');
+ if (callback) {
+ callback();
+ }
+ }
+ };
+
+ if (enableWebSocket) {
+ ws.onopen = () => {
+ openCallbacks.forEach((cb) => cb());
+ while (messageQueue.length > 0) {
+ const { message, via } = messageQueue.shift();
+ sendMessageToTargets(message, via);
+ }
+
+ // Handle local client connection (not inside iframe or Figma)
+ // if (!(isInsideIframe || isInsideFigma)) {
+ localClientConnected.set(true);
+ // }
+
+ pingInterval = window.setInterval(() => {
+ if (ws.readyState === WebSocket.OPEN) {
+ const message = {
+ pluginMessage: { event: 'ping' },
+ pluginId: '*',
+ };
+
+ try {
+ const encodedMessage = encodeMessage(message);
+ ws.send(encodedMessage);
+ } catch (error) {
+ console.log('2', error);
+ }
+ }
+ }, 10000);
+ };
+
+ ws.onmessage = (event) => {
+ try {
+ logger.info('Received raw WebSocket message:', event.data);
+
+ if (!event.data) {
+ logger.warn('Received empty message');
+ return;
+ }
+
+ let message;
+ try {
+ message = decodeMessage(event.data);
+ } catch (error) {
+ logger.warn('Failed to parse WebSocket message:', event.data);
+ return;
+ }
+
+ if (message.pluginMessage) {
+ if (message.pluginMessage.event === 'ping') {
+ const message = {
+ pluginMessage: { event: 'pong' },
+ pluginId: '*',
+ };
+
+ try {
+ const encodedMessage = encodeMessage(message);
+ ws.send(encodedMessage);
+ } catch (error) {
+ console.log('3', error);
+ }
+ }
+
+ // Helper function to update the Svelte store with filtered plugin-window clients
+ let graceTimeout = null; // Timeout handle for the grace period
+
+ // Helper function to update the Svelte store
+ // Helper function to update the Svelte store
+ function updateFigmaBridgeClients() {
+ const pluginWindowClientsRemaining =
+ pluginWindowClientsBuffer.filter(
+ (client) => client.source === 'plugin-window',
+ );
+
+ // If no plugin-window clients are left, wait before updating to []
+ if (pluginWindowClientsRemaining.length === 0) {
+ // console.log('No plugin-window clients connected. Waiting for grace period.')
+
+ // Set a grace period before marking the store as empty
+ if (!graceTimeout) {
+ graceTimeout = setTimeout(() => {
+ // Re-check the buffer after the grace period
+ const finalFigmaBridgeClientsRemaining =
+ pluginWindowClientsBuffer.filter(
+ (client) => client.source === 'plugin-window',
+ );
+
+ if (finalFigmaBridgeClientsRemaining.length === 0) {
+ // console.log('Grace period over. Setting pluginWindowClients to empty.')
+ pluginWindowClients.set([]);
+ } else {
+ // console.log(
+ // 'Grace period over. Clients reconnected:',
+ // finalFigmaBridgeClientsRemaining,
+ // )
+ pluginWindowClients.set(finalFigmaBridgeClientsRemaining);
+ }
+
+ graceTimeout = null; // Clear the timeout handle
+ }, 200); // Grace period of 500ms (adjust as needed)
+ }
+ } else {
+ // Update the store immediately if there are clients remaining
+ pluginWindowClients.set(pluginWindowClientsRemaining);
+ }
+ }
+
+ if (message.pluginMessage.event === 'client_list') {
+ // if (!(isInsideIframe || isInsideFigma)) {
+ const connectedClients = message.pluginMessage.clients || [];
+ const browserClientsX = connectedClients.filter(
+ (client) => client.source === 'browser',
+ );
+ const pluginWindowClientsX = connectedClients.filter((client) => {
+ pluginWindowClientsBuffer.push(client);
+ return client.source === 'plugin-window';
+ });
+ remoteClients.set(browserClientsX); // Set the connected clients
+ // pluginWindowClients.set(pluginWindowClientsX) // Set the connected clients
+ updateFigmaBridgeClients();
+
+ // }
+ }
+
+ // Event Handlers
+ if (message.pluginMessage.event === 'client_connected') {
+ if (message.pluginMessage.client.source === 'plugin-window') {
+ // Add the client to the buffer
+ pluginWindowClientsBuffer.push(message.pluginMessage.client);
+
+ // Immediately cancel the grace period and update the store
+ if (graceTimeout) {
+ // console.log('Canceling grace period due to new client connection.')
+ clearTimeout(graceTimeout);
+ graceTimeout = null;
+ }
+
+ // Update the store immediately
+ pluginWindowClients.set(
+ pluginWindowClientsBuffer.filter(
+ (client) => client.source === 'plugin-window',
+ ),
+ );
+ }
+
+ if (message.pluginMessage.client.source === 'browser') {
+ remoteClients.update((clients) => [
+ ...clients,
+ message.pluginMessage.client,
+ ]);
+ }
+ } else if (message.pluginMessage.event === 'client_disconnected') {
+ // Remove the client from the buffer
+ pluginWindowClientsBuffer = pluginWindowClientsBuffer.filter(
+ (client) => client.id !== message.pluginMessage.client.id,
+ );
+
+ // Update the store with grace period logic
+ updateFigmaBridgeClients();
+
+ remoteClients.update((clients) =>
+ clients.filter(
+ (client) => client.id !== message.pluginMessage.client.id,
+ ),
+ );
+ }
+ }
+ } catch (error) {
+ logger.error('Error in message listener:', error);
+ }
+ };
+
+ ws.onclose = () => {
+ clearInterval(pingInterval);
+ closeCallbacks.forEach((cb) => cb && cb());
+
+ // Handle local client disconnection (not inside iframe or Figma)
+ // if (!(isInsideIframe || isInsideFigma)) {
+ localClientConnected.set(false);
+ // }
+
+ console.warn('WebSocket connection closed');
+ };
+ }
+
+ return ws;
+}
diff --git a/packages/plugma/apps/shared/lib/triggerDeveloperTools.js b/packages/plugma/apps/shared/lib/triggerDeveloperTools.js
new file mode 100644
index 00000000..5bc87784
--- /dev/null
+++ b/packages/plugma/apps/shared/lib/triggerDeveloperTools.js
@@ -0,0 +1,74 @@
+import { get } from 'svelte/store';
+import { isDeveloperToolsActive, pluginWindowSettings } from '../stores';
+
+function saveFigmaBridgeSettings(devToolsActive, getWindowSize) {
+ if (getWindowSize) {
+ const $pluginWindowSettings = get(pluginWindowSettings);
+ $pluginWindowSettings.toolbarEnabled = !devToolsActive;
+
+ isDeveloperToolsActive.set(!devToolsActive);
+
+ pluginWindowSettings.set({
+ ...$pluginWindowSettings,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ });
+
+ parent.postMessage(
+ {
+ pluginMessage: {
+ event: 'PLUGMA_SAVE_PLUGIN_WINDOW_SETTINGS',
+ data: {
+ ...$pluginWindowSettings,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ },
+ },
+ pluginId: '*',
+ },
+ '*',
+ );
+ }
+}
+
+export async function triggerDeveloperTools() {
+ let devToolsActive = false;
+
+ // Subscribe to the store to keep the local variable updated
+ isDeveloperToolsActive.subscribe((value) => {
+ devToolsActive = value;
+ });
+
+ window.addEventListener('message', (event) => {
+ const message = event.data?.pluginMessage;
+
+ if (message.event === 'PLUGMA_PLUGIN_WINDOW_TOGGLE_TOOLBAR') {
+ saveFigmaBridgeSettings(devToolsActive, true);
+ }
+ });
+
+ document.addEventListener('keydown', (event) => {
+ // Check if Cmd (Mac) or Ctrl (Windows/Linux) is pressed
+ const isCmdOrCtrl = event.metaKey || event.ctrlKey;
+ // Check if Option (Alt) key is pressed
+ const isOption = event.altKey;
+ // Check if Shift key is pressed
+ const isShift = event.shiftKey;
+ // Check if the key code corresponds to 'D'
+ const isJKey = event.code === 'KeyJ';
+
+ // If all these modifiers and the D key are pressed
+ if (isCmdOrCtrl && isOption && isJKey) {
+ event.preventDefault();
+
+ parent.postMessage(
+ {
+ pluginMessage: { event: 'PLUGMA_PLUGIN_WINDOW_TOGGLE_TOOLBAR' },
+ pluginId: '*',
+ },
+ '*',
+ );
+ saveFigmaBridgeSettings(devToolsActive);
+ }
+ });
+}
diff --git a/packages/plugma/apps/shared/stores.js b/packages/plugma/apps/shared/stores.js
new file mode 100644
index 00000000..a8b0bba2
--- /dev/null
+++ b/packages/plugma/apps/shared/stores.js
@@ -0,0 +1,12 @@
+import { writable } from 'svelte/store';
+
+// Store to track whether the local client is connected
+export const localClientConnected = writable(false);
+export let localClientId = writable(false);
+
+// Store to track remote clients that are connected
+export const remoteClients = writable([]);
+export const pluginWindowClients = writable([]);
+export const isDeveloperToolsActive = writable(false);
+export const isLocalhostWithoutPort = writable(false);
+export const pluginWindowSettings = writable({});
diff --git a/packages/plugma/apps/svelte.config.js b/packages/plugma/apps/svelte.config.js
new file mode 100644
index 00000000..b0683fd2
--- /dev/null
+++ b/packages/plugma/apps/svelte.config.js
@@ -0,0 +1,7 @@
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
+
+export default {
+ // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+}
diff --git a/packages/plugma/apps/tsconfig.json b/packages/plugma/apps/tsconfig.json
new file mode 100644
index 00000000..61a5ec63
--- /dev/null
+++ b/packages/plugma/apps/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "isolatedModules": true,
+ "skipLibCheck": true,
+ "lib": ["DOM", "esnext"],
+ "module": "esnext",
+ "target": "esnext",
+ "moduleResolution": "node",
+ "outDir": "./dist",
+ "rootDir": "../",
+ "strict": true,
+ "resolveJsonModule": true,
+ "types": ["@figma/plugin-typings"],
+ "baseUrl": ".",
+ "paths": {
+ "#core": ["../src/core/index.ts"],
+ "#core/*": ["../src/core/*"],
+ "#tasks": ["../src/tasks/index.ts"],
+ "#tasks/*": ["../src/tasks/*"],
+ "#utils": ["../src/utils/index.ts"],
+ "#utils/*": ["../src/utils/*"],
+ "#vite-plugins": ["../src/vite-plugins/index.ts"],
+ "#vite-plugins/*": ["../src/vite-plugins/*"],
+ "#testing": ["../src/testing/index.ts"],
+ "#testing/*": ["../src/testing/*"]
+ }
+ },
+ "include": [
+ "./**/*.js",
+ "./**/*.ts",
+ "./**/*.svelte",
+ "../src/testing/execute-assertions.ts"
+ ]
+}
diff --git a/packages/plugma/apps/vite-env.d.ts b/packages/plugma/apps/vite-env.d.ts
new file mode 100644
index 00000000..aa45735f
--- /dev/null
+++ b/packages/plugma/apps/vite-env.d.ts
@@ -0,0 +1,4 @@
+///
+///
+
+declare const PLUGMA_APP_NAME: string;
diff --git a/packages/plugma/apps/vite.config.ts b/packages/plugma/apps/vite.config.ts
new file mode 100644
index 00000000..a76841ab
--- /dev/null
+++ b/packages/plugma/apps/vite.config.ts
@@ -0,0 +1,79 @@
+import path from 'node:path';
+
+import { svelte } from '@sveltejs/vite-plugin-svelte';
+import { defineConfig } from 'vite';
+import { viteSingleFile } from 'vite-plugin-singlefile';
+
+import { gatherBuildOutputs } from '../src/vite-plugins/build/gather-build-outputs';
+
+const apps = {
+ 'dev-server': {
+ entry: 'dev-server/main.ts',
+ },
+ 'figma-bridge': {
+ entry: 'figma-bridge/main.js',
+ },
+};
+
+const app = process.env.PLUGMA_APP_NAME;
+
+if (!app) {
+ throw new Error('PLUGMA_APP_NAME environment variable is not defined');
+}
+
+const appConfig = apps[app as keyof typeof apps];
+
+if (!appConfig) {
+ throw new Error(
+ `Unknown app: ${app}. Available apps: ${Object.keys(apps).join(', ')}`,
+ );
+}
+
+export default defineConfig({
+ build: {
+ target: 'es6',
+ minify: false,
+ outDir: `dist/${app}`,
+ cssCodeSplit: false
+ },
+
+ define: {
+ 'import.meta.env.PLUGMA_APP_NAME': JSON.stringify(app),
+ },
+
+ resolve: {
+ alias: {
+ '#core': path.resolve(__dirname, 'src/core'),
+ '#tasks': path.resolve(__dirname, 'src/tasks'),
+ '#utils': path.resolve(__dirname, '../../src/utils'),
+ '#vite-plugins': path.resolve(__dirname, 'src/vite-plugins'),
+ },
+ },
+
+ plugins: [
+ // TODO: Update @sveltejs/vite-plugin-svelte version
+ // BUT NOT THE LATEST! The latest version only supports Vite 6 and Svelte 5
+ svelte(),
+ {
+ name: 'html-transform',
+ transform(html) {
+ return html
+ .replace(/<% appId %>/g, app)
+ .replace(/<% entrypoint %>/g, `./${appConfig.entry}`);
+ },
+ },
+ viteSingleFile(),
+ gatherBuildOutputs({
+ from: 'dist',
+ to: '../dist/apps',
+ transformPath: (file) => `${path.dirname(file)}.html`,
+ removeSource: false,
+ }),
+ ],
+
+ optimizeDeps: {
+ exclude: ['fsevents'],
+ },
+
+ root: app,
+});
diff --git a/packages/plugma/apps/vite.create-app-config.ts b/packages/plugma/apps/vite.create-app-config.ts
new file mode 100644
index 00000000..cda91417
--- /dev/null
+++ b/packages/plugma/apps/vite.create-app-config.ts
@@ -0,0 +1,48 @@
+import path from 'node:path';
+
+import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+import { viteSingleFile } from 'vite-plugin-singlefile';
+
+import { gatherBuildOutputs } from '../src/vite-plugins/build/gather-build-outputs';
+
+export const createAppConfig = (app: string) => ({
+ build: {
+ // outDir: `../dist/${app}`,
+ minify: false,
+ cssCodeSplit: false
+ },
+
+ define: {
+ 'import.meta.env.PLUGMA_APP_NAME': JSON.stringify(app),
+ },
+
+ optimizeDeps: {
+ exclude: ['fsevents'],
+ },
+
+ plugins: [
+ // TODO: Update @sveltejs/vite-plugin-svelte version
+ // BUT NOT THE LATEST! The latest version only supports Vite 6 and Svelte 5
+ svelte({
+ // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+ }),
+ viteSingleFile(),
+ gatherBuildOutputs({
+ from: `dist`,
+ to: '../../dist/apps',
+ transformPath: (file) => file === 'index.html' ? `${app}.html` : file,
+ removeSource: true,
+ }),
+ ],
+
+ resolve: {
+ alias: {
+ '#core': path.resolve(__dirname, '../src/core'),
+ '#tasks': path.resolve(__dirname, '../src/tasks'),
+ '#utils': path.resolve(__dirname, '../src/utils'),
+ '#vite-plugins': path.resolve(__dirname, '../src/vite-plugins'),
+ },
+ },
+ });
diff --git a/packages/plugma/apps/PluginWindow.html b/packages/plugma/archive/apps/PluginWindow.html
similarity index 100%
rename from packages/plugma/apps/PluginWindow.html
rename to packages/plugma/archive/apps/PluginWindow.html
diff --git a/packages/plugma/apps/ViteApp.html b/packages/plugma/archive/apps/ViteApp.html
similarity index 100%
rename from packages/plugma/apps/ViteApp.html
rename to packages/plugma/archive/apps/ViteApp.html
diff --git a/packages/plugma/bin/cli.js b/packages/plugma/archive/cli.js
similarity index 100%
rename from packages/plugma/bin/cli.js
rename to packages/plugma/archive/cli.js
diff --git a/packages/plugma/archive/demo.ts b/packages/plugma/archive/demo.ts
new file mode 100644
index 00000000..4a1f7235
--- /dev/null
+++ b/packages/plugma/archive/demo.ts
@@ -0,0 +1,228 @@
+import type { ManifestFile, PluginOptions } from '#core/types';
+import type { EmptyObject, Join, Simplify, UnionToTuple } from 'type-fest';
+
+type TaskDef = { name: string; handler: (options: any, context?: any) => any };
+
+/**
+ * Utility type to extract the task type from a task creator function
+ */
+export type GetTaskTypeFor = {
+ name: T extends { name: infer N } ? N : never;
+ options: Parameters[0];
+ context: Parameters[1];
+ results: Awaited>;
+ handler: T['handler'];
+};
+
+/**
+ * Maps each task to its results type, preserving the exact mapping between task names and their specific result types
+ */
+type ResultsOfTask = {
+ [K in T['name']]: Extract['handler'] extends (
+ ...args: any[]
+ ) => Promise
+ ? R
+ : never;
+};
+
+/**
+ * Converts a union of string literals to a comma-separated string literal type
+ */
+export type UnionToString =
+ UnionToTuple extends readonly string[]
+ ? Join, ', '>
+ : never;
+
+type TaskDependencyError<
+ Name extends string,
+ Missing extends string,
+> = `Task '${Name}' must come after tasks: ${UnionToString}`;
+
+/**
+ * Validates that tasks are ordered correctly based on their context dependencies
+ */
+type ValidateTaskOrder<
+ Names extends readonly T['name'][],
+ T extends TaskDef,
+ Acc extends string = never,
+> = Names extends []
+ ? never
+ : Names extends readonly [infer First extends string]
+ ? Extract['handler'] extends (
+ options: any,
+ context: infer Context,
+ ) => any
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Names
+ : TaskDependencyError>
+ : Names
+ : never
+ : Names extends readonly [
+ infer First extends string,
+ ...infer Rest extends string[],
+ ]
+ ? Extract['handler'] extends (
+ options: any,
+ context: infer Context,
+ ) => any
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : TaskDependencyError>
+ : Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : never
+ : never;
+
+type TaskGroupOptions = {
+ [K in Names[number] as Extract['handler'] extends (
+ options: infer O,
+ ...args: any[]
+ ) => any
+ ? O extends EmptyObject
+ ? never
+ : K
+ : never]: Extract['handler'] extends (
+ options: infer O,
+ ...args: any[]
+ ) => any
+ ? O
+ : never;
+};
+
+////////////////////////////////////////// HELPER FUNCTIONS //////////////////////////////////////////
+/**
+ * Creates a strongly-typed task with a name and handler function
+ */
+function task(
+ name: TName,
+ handler: (options: TOptions, context: TContext) => Promise,
+) {
+ return {
+ name,
+ handler,
+ } as const;
+}
+
+function serial<
+ T extends Tasks,
+ First extends T['name'],
+ Rest extends T['name'][],
+>(
+ firstTask: [First, ...Rest] extends ValidateTaskOrder<[First, ...Rest], T>
+ ? First
+ : ValidateTaskOrder<[First, ...Rest], T>,
+ ...otherTasks: Rest
+): (options: Simplify>) => void {
+ const tasks = [firstTask, ...otherTasks] as const;
+ throw new Error('test');
+}
+
+////////////////////////////////////// EXAMPLE TASKS //////////////////////////////////////
+
+export type GetManifestTask = GetTaskTypeFor;
+export const getManifest = task(
+ 'get-manifest',
+ async (options: PluginOptions): Promise =>
+ Promise.resolve({
+ name: 'test',
+ version: '2.0.0',
+ main: 'test',
+ api: 'test',
+ }),
+);
+
+export type GetPackageJsonTask = GetTaskTypeFor;
+export const getPackageJson = task(
+ 'get-package-json',
+ async (options: EmptyObject) =>
+ Promise.resolve({
+ name: 'test',
+ version: '1.0.0' as const,
+ }),
+);
+
+export type PrintVersionsTask = GetTaskTypeFor;
+export const PrintVersionsTask = task(
+ 'print-versions',
+ async (
+ _options: { as: 'json' | 'text' },
+ context: ResultsOfTask,
+ ) => {
+ if (_options.as === 'json') {
+ return {
+ packageJson: context['get-package-json'].version,
+ manifest: context['get-manifest'].version,
+ };
+ }
+
+ return `Package version: ${context['get-package-json'].version}\nManifest version: ${context['get-manifest'].version}`;
+ },
+);
+
+export default PrintVersionsTask;
+
+type Tasks = GetManifestTask | GetPackageJsonTask | PrintVersionsTask;
+
+////////////////////////////////////// OTHER TESTS //////////////////////////////////////
+
+// resolves to: ["get-manifest"]
+type Test1 = ValidateTaskOrder<['get-manifest'], Tasks, never>;
+
+// resolves to: ["get-manifest", "get-package-json"]
+type Test2 = ValidateTaskOrder<
+ ['get-manifest', 'get-package-json'],
+ Tasks,
+ never
+>;
+
+type Test3 = ValidateTaskOrder<['get-package-json', 'get-manifest'], Tasks>;
+
+// resolves to: "Task 'print-versions' must come after tasks: get-manifest, get-package-json"
+type Test4 = ValidateTaskOrder<
+ ['print-versions', 'get-manifest', 'get-package-json'],
+ Tasks
+>;
+
+// resolves to: "Task 'print-versions' must come after tasks: get-manifest"
+type Test5 = ValidateTaskOrder<
+ ['get-package-json', 'print-versions', 'get-manifest'],
+ Tasks
+>;
+
+// resolves to: ['get-package-json', 'get-manifest', 'print-versions']
+type Test6 = ValidateTaskOrder<
+ ['get-package-json', 'get-manifest', 'print-versions'],
+ Tasks
+>;
+
+// resolves to: ['get-manifest', 'get-package-json', 'print-versions']
+type Test7 = ValidateTaskOrder<
+ ['get-manifest', 'get-package-json', 'print-versions'],
+ Tasks
+>;
+
+// This is valid
+serial(
+ 'get-manifest',
+ 'get-package-json',
+ 'print-versions',
+)({
+ 'get-manifest': {
+ instanceId: 'test',
+ mode: 'test',
+ port: 1234,
+ output: 'test',
+ },
+ 'print-versions': {
+ as: 'json',
+ },
+});
+
+// This would be a type error with the message:
+// Argument of type '"print-versions"' is not assignable to parameter of type '"Task 'print-versions' must come after tasks: get-manifest, get-package-json"'.
+serial('get-manifest', 'get-package-json', 'print-versions');
diff --git a/packages/plugma/frameworks/javascript/mount.js b/packages/plugma/archive/frameworks/javascript/mount.js
similarity index 100%
rename from packages/plugma/frameworks/javascript/mount.js
rename to packages/plugma/archive/frameworks/javascript/mount.js
diff --git a/packages/plugma/frameworks/react/mount.tsx b/packages/plugma/archive/frameworks/react/mount.tsx
similarity index 81%
rename from packages/plugma/frameworks/react/mount.tsx
rename to packages/plugma/archive/frameworks/react/mount.tsx
index b257e153..473820d6 100644
--- a/packages/plugma/frameworks/react/mount.tsx
+++ b/packages/plugma/archive/frameworks/react/mount.tsx
@@ -2,6 +2,7 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
export function mount(App) {
+ // biome-ignore lint/style/noNonNullAssertion:
ReactDOM.createRoot(document.getElementById('app')!).render(
diff --git a/packages/plugma/frameworks/svelte/mount.ts b/packages/plugma/archive/frameworks/svelte/mount.ts
similarity index 100%
rename from packages/plugma/frameworks/svelte/mount.ts
rename to packages/plugma/archive/frameworks/svelte/mount.ts
diff --git a/packages/plugma/archive/helpers.ts b/packages/plugma/archive/helpers.ts
new file mode 100644
index 00000000..5e4e9dfd
--- /dev/null
+++ b/packages/plugma/archive/helpers.ts
@@ -0,0 +1,98 @@
+import type { Simplify } from 'type-fest';
+
+import type {
+ RegisteredTask,
+ ValidateTaskOrder,
+} from '../src/core/task-runner/types';
+
+/**
+ * Creates a strongly-typed task with a name and handler function
+ */
+export function task<
+ TName extends string,
+ TOptions = {},
+ TResults = {},
+ TContext = {},
+>(
+ name: TName,
+ handler: (options: TOptions, context: TContext) => Promise,
+): RegisteredTask {
+ return {
+ name,
+ run: handler,
+ };
+}
+
+export function serial<
+ T extends RegisteredTask,
+ First extends T['name'],
+ Rest extends T['name'][],
+>(
+ firstTask: [First, ...Rest] extends ValidateTaskOrder<[First, ...Rest], T>
+ ? First
+ : ValidateTaskOrder<[First, ...Rest], T>,
+ ...otherTasks: Rest
+): (
+ options: Simplify<
+ {
+ tasks: Record;
+ context?: Record;
+ } & {
+ [K in First | Rest[number]]?: T extends { name: K }
+ ? Parameters[0]
+ : never;
+ }
+ >,
+) => Promise> {
+ return async (options) => {
+ const results: Record = {};
+ const tasks = [firstTask, ...otherTasks];
+
+ for (const taskName of tasks) {
+ const task = options.tasks[taskName];
+ if (!task) {
+ throw new Error(`Task "${taskName}" not found`);
+ }
+
+ results[taskName] = await task.run(
+ options[taskName] || {},
+ options.context || {},
+ );
+ }
+
+ return results;
+ };
+}
+
+export function parallel>(
+ tasks: T['name'][],
+): (
+ options: Simplify<
+ {
+ tasks: Record;
+ context?: Record;
+ } & {
+ [K in T['name']]?: T extends { name: K }
+ ? Parameters[0]
+ : never;
+ }
+ >,
+) => Promise> {
+ return async (options) => {
+ const results: Record = {};
+ const taskPromises = tasks.map(async (taskName) => {
+ const task = options.tasks[taskName];
+ if (!task) {
+ throw new Error(`Task "${taskName}" not found`);
+ }
+
+ results[taskName] = await task.run(
+ options[taskName] || {},
+ options.context || {},
+ );
+ });
+
+ await Promise.all(taskPromises);
+ return results;
+ };
+}
diff --git a/packages/plugma/lib/global-shim.js b/packages/plugma/archive/lib/global-shim.js
similarity index 100%
rename from packages/plugma/lib/global-shim.js
rename to packages/plugma/archive/lib/global-shim.js
diff --git a/packages/plugma/lib/logger.js b/packages/plugma/archive/lib/logger.js
similarity index 100%
rename from packages/plugma/lib/logger.js
rename to packages/plugma/archive/lib/logger.js
diff --git a/packages/plugma/lib/mainListeners.js b/packages/plugma/archive/lib/mainListeners.js
similarity index 100%
rename from packages/plugma/lib/mainListeners.js
rename to packages/plugma/archive/lib/mainListeners.js
diff --git a/packages/plugma/lib/start-web-sockets-server.cjs b/packages/plugma/archive/lib/start-web-sockets-server.cjs
similarity index 100%
rename from packages/plugma/lib/start-web-sockets-server.cjs
rename to packages/plugma/archive/lib/start-web-sockets-server.cjs
diff --git a/packages/plugma/lib/suppress-logs.js b/packages/plugma/archive/lib/suppress-logs.js
similarity index 100%
rename from packages/plugma/lib/suppress-logs.js
rename to packages/plugma/archive/lib/suppress-logs.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-copy-dir.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-copy-dir.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-copy-dir.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-copy-dir.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-deep-index.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-deep-index.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-deep-index.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-deep-index.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-delete-dist-on-error.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-delete-dist-on-error.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-delete-dist-on-error.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-delete-dist-on-error.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-dot-env-loader.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-dot-env-loader.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-dot-env-loader.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-dot-env-loader.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-html-transform.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-html-transform.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-html-transform.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-html-transform.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-insert-custom-functions.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-insert-custom-functions.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-insert-custom-functions.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-insert-custom-functions.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-log-file-updates.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-log-file-updates.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-log-file-updates.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-log-file-updates.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-replace-main-input.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-replace-main-input.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-replace-main-input.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-replace-main-input.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-rewrite-postmessage-origin.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-rewrite-postmessage-origin.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-rewrite-postmessage-origin.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-rewrite-postmessage-origin.js
diff --git a/packages/plugma/lib/vite-plugins/vite-plugin-surpress-logs.js b/packages/plugma/archive/lib/vite-plugins/vite-plugin-surpress-logs.js
similarity index 100%
rename from packages/plugma/lib/vite-plugins/vite-plugin-surpress-logs.js
rename to packages/plugma/archive/lib/vite-plugins/vite-plugin-surpress-logs.js
diff --git a/packages/plugma/archive/old-task-runner/index.ts b/packages/plugma/archive/old-task-runner/index.ts
new file mode 100644
index 00000000..ea3587d1
--- /dev/null
+++ b/packages/plugma/archive/old-task-runner/index.ts
@@ -0,0 +1,124 @@
+//@index(['./*.ts', './*/index.ts'], f => `export * from '${f.path}.js';`)
+export * from '../task-runner/task-runner.js';
+export * from '../task-runner/types.js';
+//@endindex
+
+/**
+ * Task runner implementation
+ */
+
+import type { CommandName } from '#commands/types.js';
+import type {
+ RegisterableTask,
+ TaskContext,
+ TaskDefinition,
+ TaskName,
+ TaskResult,
+} from '../task-runner/types.js';
+import type { PluginOptions } from '../types.js';
+
+const taskRegistry = new Map>();
+
+/**
+ * Registers a task in the task registry
+ * @param task - The task definition to register
+ * @throws {Error} If a task with the same name is already registered
+ */
+export function registerTask(
+ task: RegisterableTask,
+): void {
+ if (taskRegistry.has(task.name)) {
+ throw new Error(`Task "${task.name}" is already registered`);
+ }
+ taskRegistry.set(task.name, task);
+}
+
+/**
+ * Helper function to safely get a task result with proper typing
+ * @param results - Record of task results
+ * @param task - Task definition to get result for
+ * @returns The task result if available, undefined otherwise
+ */
+export function getTaskResult>(
+ results: Record,
+ task: T,
+): TaskResult | undefined {
+ return results[task.name] as TaskResult;
+}
+
+/**
+ * Helper function to check if a task supports a command
+ * @param task - Task definition to check
+ * @param command - Command to check support for
+ * @returns Whether the task supports the command
+ */
+function isTaskCommandSupported(
+ task: TaskDefinition,
+ command: TCommand,
+): task is TaskDefinition {
+ if (!task.supportedCommands) {
+ // If no supported commands are specified, assume it supports all commands
+ return true;
+ }
+ return task.supportedCommands.includes(command as any);
+}
+
+/**
+ * Executes a sequence of tasks in order
+ * @param taskNames - Array of task names to execute
+ * @param options - Plugin options to pass to tasks
+ * @returns Record of task results
+ * @throws {Error} If a task is not found or if a task execution fails
+ */
+export async function serial(
+ taskNames: TaskName[],
+ options: PluginOptions & { command: TCommand },
+): Promise> {
+ const results: Record = {};
+
+ for (const name of taskNames) {
+ const task = taskRegistry.get(name);
+ if (!task) {
+ throw new Error(
+ `Task "${name}" not found. Make sure to register it first.`,
+ );
+ }
+
+ // Check if task supports the current command
+ if (!isTaskCommandSupported(task, options.command)) {
+ throw new Error(
+ `Task "${name}" does not support the "${options.command}" command`,
+ );
+ }
+
+ try {
+ const context: TaskContext = {
+ options: options as PluginOptions & { command: TCommand },
+ results,
+ };
+ results[name] = await task.execute(context);
+ } catch (error) {
+ const errorMessage =
+ error instanceof Error ? error.message : String(error);
+ throw new Error(`Task "${name}" failed: ${errorMessage}`);
+ }
+ }
+
+ return results;
+}
+
+/**
+ * Clears the task registry
+ * Useful for testing or hot reloading
+ */
+export function clearTasks(): void {
+ taskRegistry.clear();
+}
+
+/**
+ * Gets all registered task names
+ * @returns Array of registered task names
+ */
+export function getRegisteredTasks(): TaskName[] {
+ return Array.from(taskRegistry.keys());
+}
diff --git a/packages/plugma/archive/old-task-runner/types.old.ts b/packages/plugma/archive/old-task-runner/types.old.ts
new file mode 100644
index 00000000..61156931
--- /dev/null
+++ b/packages/plugma/archive/old-task-runner/types.old.ts
@@ -0,0 +1,95 @@
+/**
+ * Core types for the task runner system
+ */
+
+import type {
+ BuildCommandOptions,
+ CommandName,
+ DevCommandOptions,
+ ReleaseCommandOptions,
+} from '#commands/types.js';
+import type { PluginOptions } from '../types.js';
+
+/**
+ * Base interface for defining a task with its name, options, and results
+ */
+export interface TaskDefinition<
+ TName extends string,
+ TOptions extends Record,
+ TResult extends Record,
+> {
+ name: TName;
+ execute: (context: TOptions) => Promise;
+}
+
+/**
+ * Utility type to extract the task type from a task creator function
+ */
+export type GetTaskTypeFor<
+ T extends { name: string; handler: (options: any) => any },
+> = {
+ name: T['name'];
+ options: Parameters[0];
+ results: Awaited>;
+ handler: T['handler'];
+};
+
+/**
+ * Creates a registry type that maps task names to their options and results
+ */
+export type MakeTaskRegistry> = {
+ [T in Tasks as T['name']]: {
+ options: T['options'];
+ results: T['results'];
+ };
+};
+
+/**
+ * Context passed to task execution functions
+ */
+export interface TaskContext {
+ options: PluginOptions & { command: TCommand };
+ results: Record;
+}
+
+/**
+ * A task that can be registered in the system
+ */
+export interface RegisterableTask {
+ name: string;
+ supportedCommands?: CommandName[];
+ execute: (context: TaskContext) => Promise;
+}
+
+/**
+ * Helper type to extract the results type from a task definition
+ */
+export type TaskResult> =
+ T['results'];
+
+/**
+ * Task name type alias
+ */
+export type TaskName = string;
+
+/**
+ * Maps command names to their option types
+ */
+export interface CommandOptionsMap {
+ dev: DevCommandOptions;
+ preview: DevCommandOptions;
+ build: BuildCommandOptions;
+ release: ReleaseCommandOptions;
+}
+
+/**
+ * Helper type to ensure a task supports the current command
+ */
+export type EnsureTaskSupportsCommand<
+ T extends TaskDefinition,
+ C extends CommandName,
+> = T extends TaskDefinition
+ ? C extends TC
+ ? T
+ : never
+ : never;
diff --git a/packages/plugma/archive/old-task-runner/types.ts b/packages/plugma/archive/old-task-runner/types.ts
new file mode 100644
index 00000000..0ebc5878
--- /dev/null
+++ b/packages/plugma/archive/old-task-runner/types.ts
@@ -0,0 +1,104 @@
+/**
+ * Core types for the task runner system
+ */
+
+import type { BuildCommandOptions, CommandName, DevCommandOptions, ReleaseCommandOptions } from '#commands/types.js';
+import type { PluginOptions } from '../types.js';
+
+/**
+ * Base interface for task definitions
+ */
+export interface TaskDef {
+ name: string;
+ options: Record;
+ results: unknown;
+ context?: Record;
+}
+
+/**
+ * Utility type to extract the task type from a task creator function
+ */
+export type GetTaskTypeFor = {
+ name: T extends { name: infer N } ? N : never;
+ options: T extends { options: infer O } ? O : never;
+ results: T extends { results: infer R } ? R : never;
+ context: T extends { context: infer C } ? C : never;
+};
+
+/**
+ * Maps each task to its results type
+ */
+export type ResultsOfTask = {
+ [K in T['name']]: Extract['results'];
+};
+
+/**
+ * Converts a union of string literals to a comma-separated string literal type
+ */
+export type UnionToString = T extends string
+ ? string extends T
+ ? string
+ : T extends any
+ ? T | UnionToString>
+ : never;
+
+/**
+ * Type error message for task dependency validation
+ */
+type TaskDependencyError = `Task '${Name}' must come after tasks: ${UnionToString}`;
+
+/**
+ * Validates that tasks are ordered correctly based on their context dependencies
+ */
+export type ValidateTaskOrder<
+ Names extends readonly string[],
+ T extends TaskDef,
+ Acc extends string = never,
+> = Names extends []
+ ? never
+ : Names extends readonly [infer First extends string]
+ ? T extends { name: First; context: infer Context }
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Names
+ : TaskDependencyError>
+ : Names
+ : Names
+ : Names extends readonly [infer First extends string, ...infer Rest extends string[]]
+ ? T extends { name: First; context: infer Context }
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : TaskDependencyError>
+ : Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : never
+ : never;
+
+/**
+ * Maps task names to their option types for task groups
+ */
+export type TaskGroupOptions = {
+ [K in Names[number] as Extract['options'] extends Record
+ ? never
+ : K]: Extract['options'];
+};
+
+/**
+ * Context passed to task execution functions
+ */
+export interface TaskContext {
+ options: PluginOptions & { command: TCommand };
+ results: Record;
+}
+
+/**
+ * A task that can be registered in the system
+ */
+export interface RegisterableTask {
+ name: string;
+ execute: (context: TaskContext) => Promise;
+}
diff --git a/packages/plugma/scripts/banner.js b/packages/plugma/archive/scripts/banner.js
similarity index 100%
rename from packages/plugma/scripts/banner.js
rename to packages/plugma/archive/scripts/banner.js
diff --git a/packages/plugma/archive/scripts/copy-files.js b/packages/plugma/archive/scripts/copy-files.js
new file mode 100644
index 00000000..01f689c6
--- /dev/null
+++ b/packages/plugma/archive/scripts/copy-files.js
@@ -0,0 +1,28 @@
+import { copyFile, existsSync, mkdir, readdir } from 'node:fs';
+import { join } from 'node:path';
+
+// Source and destination directories
+const sourceDir = join(process.cwd(), '../apps/dist');
+const destDir = join(process.cwd(), 'apps');
+
+// Ensure destination directory exists
+if (!existsSync(destDir)) {
+ mkdir(destDir, { recursive: true }, (err) => {
+ if (err) throw err;
+ });
+}
+
+// Copy all files from source to destination
+readdir(sourceDir, (err, files) => {
+ if (err) throw err;
+
+ for (const file of files) {
+ const srcPath = join(sourceDir, file);
+ const destPath = join(destDir, file);
+
+ copyFile(srcPath, destPath, (err) => {
+ if (err) throw err;
+ console.log(`${file} was copied to ${destPath}`);
+ });
+ }
+});
diff --git a/packages/plugma/scripts/run-release.js b/packages/plugma/archive/scripts/run-release.js
similarity index 100%
rename from packages/plugma/scripts/run-release.js
rename to packages/plugma/archive/scripts/run-release.js
diff --git a/packages/plugma/scripts/run-script.js b/packages/plugma/archive/scripts/run-script.js
similarity index 100%
rename from packages/plugma/scripts/run-script.js
rename to packages/plugma/archive/scripts/run-script.js
diff --git a/packages/plugma/scripts/utils.js b/packages/plugma/archive/scripts/utils.js
similarity index 100%
rename from packages/plugma/scripts/utils.js
rename to packages/plugma/archive/scripts/utils.js
diff --git a/packages/plugma/task-runner/README.md b/packages/plugma/archive/task-runner/README.md
similarity index 100%
rename from packages/plugma/task-runner/README.md
rename to packages/plugma/archive/task-runner/README.md
diff --git a/packages/plugma/task-runner/taskrunner.js b/packages/plugma/archive/task-runner/taskrunner.js
similarity index 100%
rename from packages/plugma/task-runner/taskrunner.js
rename to packages/plugma/archive/task-runner/taskrunner.js
diff --git a/packages/plugma/archive/testing-poc/README.md b/packages/plugma/archive/testing-poc/README.md
new file mode 100644
index 00000000..52c50303
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/README.md
@@ -0,0 +1,200 @@
+# Plugma Testing
+
+A testing framework for Figma plugins that provides a familiar testing experience using Vitest's API. Write tests that look and feel like regular Vitest tests, but execute directly in Figma.
+
+## Overview
+
+The testing framework bridges the gap between Node.js and Figma environments:
+
+1. **Test Registration**: Tests are registered in Figma when the plugin loads
+2. **Test Execution**: Tests run in Figma but are controlled from Node
+3. **Assertion Collection**: Assertions are collected in Figma and replayed in Node
+4. **Result Reporting**: Results are reported through Vitest's native reporting
+
+## For Plugin Developers
+
+### Writing Tests
+
+Write tests using the familiar Vitest/Jest syntax:
+
+~~~ts
+import { expect, test } from "plugma";
+
+test("creates a rectangle", async () => {
+ const rect = figma.createRectangle();
+ rect.resize(100, 100);
+
+ expect(rect.type).to.equal("RECTANGLE");
+ expect(rect.width).to.equal(100);
+});
+~~~
+
+### Running Tests
+
+Run tests using Vitest's CLI:
+
+~~~bash
+vitest run # Run all tests
+vitest run rectangle.test # Run specific test file
+vitest watch # Watch mode
+~~~
+
+### Test Environment
+
+- Tests execute in the Figma plugin environment
+- Full access to `figma` API
+- Async/await support
+- TypeScript support
+- Chai-style assertions
+
+## For Framework Developers
+
+### Architecture
+
+The framework operates in two environments simultaneously:
+
+#### Node Environment
+- Test discovery and registration
+- WebSocket communication with Figma
+- Assertion reconstruction and verification
+- Test result reporting
+
+#### Figma Environment
+- Test execution
+- Assertion collection
+- Plugin API access
+- Result serialization
+
+### Implementation Details
+
+1. **Test Registration**
+ - Tests are automatically registered in Figma when imported
+ - Each test is stored with a unique name in the test registry
+ - No test code is sent over WebSocket
+
+2. **Test Execution**
+ - Node sends test name to Figma
+ - Figma executes the corresponding test
+ - Assertions are collected during execution
+ - Results are sent back to Node
+
+3. **Assertion Handling**
+ - Figma uses a proxy-based expect implementation
+ - Assertions are recorded as method call chains
+ - Chains are serialized and sent to Node
+ - Node reconstructs and executes assertions
+
+4. **Communication**
+ - WebSocket connection between Node and Figma
+ - Simple message protocol for test execution
+ - Serializable assertion format
+ - Error handling and timeout support
+
+### Core Components
+
+1. **Test Registry**
+ - Stores test functions
+ - Handles test lookup and execution
+ - Environment-aware behavior
+
+2. **Assertion Collector**
+ - Records assertions in Figma
+ - Converts assertions to transportable format
+ - Handles cleanup between tests
+
+3. **Test Runner**
+ - Manages test execution flow
+ - Handles communication between environments
+ - Integrates with Vitest
+
+4. **Expect Implementation**
+ - Chai-compatible API
+ - Proxy-based chain recording
+ - Automatic serialization support
+
+## Best Practices
+
+1. **Test Organization**
+ - Group related tests in files
+ - Use descriptive test names
+ - Keep tests focused and isolated
+
+2. **Assertions**
+ - Use expressive assertions
+ - Check relevant properties
+ - Handle async operations properly
+
+3. **Plugin State**
+ - Clean up after tests
+ - Don't rely on global state
+ - Reset plugin state between tests
+
+4. **Error Handling**
+ - Handle expected errors
+ - Test error conditions
+ - Use try/catch appropriately
+
+## Limitations
+
+1. **Environment**
+ - Tests must be compatible with Figma environment
+ - Limited access to Node.js APIs
+ - No direct file system access
+
+2. **Async Operations**
+ - All tests are inherently async
+ - Must handle promises correctly
+ - Watch for timing issues
+
+3. **State Management**
+ - No built-in test isolation
+ - Manual cleanup required
+ - Shared plugin environment
+
+## Future Improvements
+
+1. **Test Isolation & State Management**
+ - Automatic plugin state reset between tests
+ - Resource tracking and cleanup (nodes, event listeners)
+ - Restore initial selection after tests
+ - Better test separation and context management
+ - Proper cleanup mechanisms
+
+2. **Error Handling & Debugging**
+ - Better error messages with stack traces
+ - Plugin state capture on failures
+ - Improved error propagation across environments
+ - Better debugging tools and logging
+ - IDE integration for debugging
+ - Runtime type validation for messages
+
+3. **WebSocket Communication**
+ - Connection recovery and auto-reconnect
+ - Message queuing for better throughput
+ - Proper request/response matching
+ - Better connection state management
+ - Improved error recovery
+
+4. **Performance & Scalability**
+ - Parallel test execution support
+ - Smarter test scheduling
+ - Reduced communication overhead
+ - Better handling of test file dependencies
+ - Message batching and optimization
+
+5. **Developer Experience**
+ - Configuration system with smart defaults
+ - Comprehensive API documentation
+ - Helper utility functions
+ - Visual test results and reporting
+ - Better TypeScript integration
+ - Lifecycle hooks (before/after)
+ - Plugin-specific type extensions
+
+6. **Code Quality & Maintenance**
+ - Configurable debug logging
+ - Better module organization
+ - Clear initialization sequence
+ - Proper error boundaries
+ - Robust object serialization
+ - Elimination of any types
diff --git a/packages/plugma/archive/testing-poc/docs/how-it-works.md b/packages/plugma/archive/testing-poc/docs/how-it-works.md
new file mode 100644
index 00000000..9717ee27
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/docs/how-it-works.md
@@ -0,0 +1,264 @@
+# How Plugma Testing Works
+
+This document provides a detailed technical explanation of how the Plugma testing framework works internally.
+
+## Key Components
+
+### TestRegistry
+- Maintains map of test names to functions
+- Handles test registration and lookup
+- Manages test execution context
+
+### ExpectProxy
+
+- Provides Chai-like assertion API
+- Generates executable code strings
+- Handles value serialization
+
+The `expect` proxy is a **generic** proxy that accepts any function call and property access. It captures the call or prop access and generates a code string that can be executed in the Node environment, with the parameters passed to functions resolved to their values.
+
+This is necessary because the Node environment does not have access to the Figma environment, so we need to generate the code strings in a way that can be executed without the variables being referenced and still produce the same results.
+
+### TestRunner
+- Bridges Vitest and Figma
+- Manages WebSocket communication
+- Executes assertion code
+-
+## Architecture Overview
+
+The testing framework operates across two environments simultaneously:
+1. **Node Environment**: Where Vitest runs and manages test execution
+2. **Figma Environment**: Where the actual tests execute and interact with the Figma API
+
+```mermaid
+graph TB
+ subgraph Node["Node Environment"]
+ V[Vitest]
+ TR[TestRunner]
+ EX[Assertion Executor]
+ end
+
+ subgraph Figma["Figma Plugin Environment"]
+ REG[TestRegistry]
+ EP[ExpectProxy]
+ end
+
+ V -->|"(1) Run Test"| TR
+ TR -->|"(2) Send test name"| REG
+ REG -->|"(3) Execute test"| EP
+ EP -->|"(4) Generate assertion code"| EP
+ EP -->|"(5) Send code strings"| TR
+ TR -->|"(6) Execute assertions"| EX
+ EX -->|"(7) Report results"| V
+```
+
+## Complete Test Flow
+
+```mermaid
+sequenceDiagram
+ participant Plugin as Plugin Load
+ participant TR as TestRegistry
+ participant V as Vitest
+ participant T as TestRunner
+ participant EP as ExpectProxy
+ participant EX as Assertion Executor
+
+ Note over Plugin,EX: Plugin Initialization
+ Plugin->>TR: Import test files
+ Plugin->>TR: Register test functions
+ TR-->>Plugin: Tests registered
+
+ Note over V,EX: Test Discovery
+ V->>T: Discover test files
+ T->>V: Test suites created
+
+ Note over V,EX: Test Execution
+ V->>T: Run test "creates a rectangle"
+ T->>TR: Send RUN_TEST message
+ TR->>EP: Execute test function
+
+ Note over EP: Assertion Collection
+ EP->>EP: expect(rect.width).to.equal(100)
+ EP->>EP: Generate code string
+ EP->>EP: expect(rect.type).to.equal("RECTANGLE")
+ EP->>EP: Generate code string
+
+ Note over EP,V: Result Processing
+ EP->>T: Send assertion code strings
+ T->>EX: Execute assertion code
+ EX->>V: Report test results
+ V->>V: Generate test report
+
+ Note over V,EX: Error Handling
+ alt Test Error
+ EP->>T: Send error message
+ T->>V: Report test failure
+ end
+
+ alt Communication Error
+ T->>T: Detect timeout
+ T->>V: Report connection error
+ end
+```
+
+## Step-by-Step Process
+
+### 1. Test Registration
+**Module**: `TestRegistry` (`test-registry.ts`)
+- When plugin loads, all test files are imported
+- Each `test()` call registers the test function in the registry
+- Tests are stored with unique names for later execution
+
+### 2. Test Discovery
+**Module**: `TestRunner` (`test-runner.ts`)
+- Vitest discovers test files in the project
+- For each test file, it creates a test suite
+- The runner connects to Figma via WebSocket
+
+### 3. Test Execution
+**Module**: `TestRegistry` & `ExpectProxy`
+1. Node sends test name to Figma
+2. Figma looks up and executes the test function
+3. During execution, assertions are captured by ExpectProxy
+4. Each assertion generates executable code strings
+
+Example:
+```ts
+// In test
+expect(rect.width).to.equal(100)
+
+// Generated code string
+"expect(100).to.equal(100)"
+```
+
+### 4. Result Processing
+**Module**: `TestRunner`
+1. Code strings are sent back to Node
+2. Each assertion string is executed in Node's context
+3. Results are reported through Vitest
+
+## Communication Protocol
+
+### Messages from Node to Figma
+```ts
+interface RunTestMessage {
+ type: "RUN_TEST";
+ testName: string;
+}
+```
+
+### Messages from Figma to Node
+```ts
+interface TestCompleteMessage {
+ type: "TEST_ASSERTIONS";
+ assertions: string[]; // Array of assertion code strings
+}
+
+interface TestErrorMessage {
+ type: "TEST_ERROR";
+ error: string;
+}
+```
+
+## Error Handling
+
+1. **Test Execution Errors**
+ - Caught in Figma
+ - Error message sent to Node
+ - Reported through Vitest
+
+2. **Communication Errors**
+ - Timeout handling
+ - Connection recovery
+ - Test cancellation
+
+3. **Assertion Errors**
+ - Invalid assertions caught during generation
+ - Execution errors in Node context
+ - Detailed error reporting
+
+## Performance Considerations
+
+1. **Message Size**
+ - Only essential code strings transmitted
+ - No complex object serialization
+ - Efficient string-based communication
+
+2. **Test Isolation**
+ - Each test gets fresh context
+ - Plugin state preserved between tests
+ - Resources cleaned up after each test
+
+3. **Concurrency**
+ - Tests run sequentially in Figma
+ - Multiple test files can run in parallel in Node
+ - Communication is synchronized
+
+## Debugging Support
+
+1. **Code Inspection**
+ - Generated code is human-readable
+ - Easy to debug assertion strings
+ - Clear error messages
+
+2. **State Inspection**
+ - Plugin state snapshots
+ - Communication logs
+ - Assertion execution logs
+
+3. **Error Context**
+ - Stack traces preserved
+ - Plugin state at failure
+ - Generated code history
+
+## Future Improvements
+
+1. **Test Isolation**
+ - Automatic plugin state reset
+ - Resource tracking and cleanup
+ - Better error isolation
+ - Proper test context object
+ - State cleanup between test runs
+ - Validation of test names and functions
+
+2. **Performance**
+ - Parallel test execution in Figma
+ - Smarter test scheduling
+ - Reduced communication overhead
+ - Message queuing for WebSocket
+ - More performant assertion chain collection
+
+3. **Developer Experience**
+ - Better error messages
+ - Live test feedback
+ - IDE integration
+ - Visual test results
+ - Configurable debug logging
+ - Comprehensive API documentation
+ - Helper utility functions
+ - Configuration system with defaults
+
+4. **Reliability**
+ - Better error recovery
+ - Connection resilience
+ - Test retry support
+ - Proper timeout handling
+ - Comprehensive async scenario handling
+ - Improved error propagation
+
+ > Note: Test cancellation is not feasible in this architecture due to the one-way nature of WebSocket communication between Node and Figma's sandbox environment. While we can send messages to cancel a test, we cannot guarantee the test will actually stop executing in the sandbox.
+
+5. **Type Safety**
+ - Proper Chai type extensions
+ - Complete message type definitions
+ - Type-safe message handling
+ - Better test context typing
+ - Elimination of any types
+
+6. **Architecture**
+ - Lifecycle hooks (before/after)
+ - Clear initialization sequence
+ - Better module organization
+ - Private internal modules
+ - Proper error boundaries
+ - Robust object serialization
diff --git a/packages/plugma/archive/testing-poc/docs/test-module-diagnostics.md b/packages/plugma/archive/testing-poc/docs/test-module-diagnostics.md
new file mode 100644
index 00000000..3bc2b546
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/docs/test-module-diagnostics.md
@@ -0,0 +1,328 @@
+# Testing Module Implementation Diagnostics
+
+## Files in Testing Module
+
+1. `assertion.ts` - Handles assertion creation and reconstruction
+2. `registry.ts` - Test registry implementation (moved from figma/)
+3. `test-runner.ts` - Node-side test execution
+4. `types.ts` - Type definitions
+5. `ws-client.ts` - WebSocket communication
+6. `index.ts` - Main module exports
+7. `how-it-works.md` - Module design document
+
+## Analysis Progress
+
+- [x] assertion.ts
+- [x] figma.ts (removed)
+- [x] figma/expect.ts (removed)
+- [x] figma/index.ts (removed)
+- [x] figma/registry.ts (moved to root)
+- [x] figma/runner.ts (removed)
+- [x] index.ts
+- [x] test-runner.ts
+- [x] types.ts
+- [x] ws-client.ts
+
+## Fixing Progress
+
+Current file: registry.ts
+
+### Status
+- [x] assertion.ts
+ - [x] Fix type safety issues with Assertion type indexing
+ - [x] Add proper typing to proxy implementation
+ - [x] Fix assertion chain to match sequence diagram
+ - [x] Move debug logging behind flag
+ - [x] Improve error handling
+ - [x] Clean up template literals
+- [x] test-runner.ts
+ - [x] Consolidate runner functionality
+ - [x] Add proper timeout handling
+ - [x] Basic timeout config
+ - [x] Timeout error handling
+ - [x] Cleanup on timeout
+ - [x] Improve error handling
+ - [x] Basic error catching
+ - [x] Error logging
+ - [x] Add detailed error messages
+ - [x] Add stack traces
+ - [x] Add plugin state in errors
+- [x] figma/runner.ts (Removed - functionality consolidated)
+- [x] registry.ts
+ - [x] Move to root level
+ - [x] Add lifecycle hooks
+ - [x] Add test context
+ - [x] Add validation for test names
+ - [x] Fix type errors in TestContext
+- [x] ws-client.ts
+ - [x] Add timeout handling
+- [x] types.ts
+ - [x] Update message types
+ - [x] Add configuration types
+ - [x] Add lifecycle hook types
+ - [x] Fix TestContext type
+- [x] index.ts
+ - [x] Update exports
+ - [x] Add configuration exports
+ - [x] Improve documentation
+
+## Future Improvements
+
+1. **Connection Recovery**
+ - Auto reconnect on disconnect
+ - Resume test execution
+
+2. **WebSocket Client**
+ - Message queuing for better throughput
+ - Proper request/response matching
+ - Better connection state management
+ - Improved error recovery
+
+3. **Parallel Test Support**
+ - Coordinate parallel execution
+ - Handle test file dependencies
+
+4. **Test Isolation**
+ - Reset plugin state between tests
+ - Clean up created nodes
+ - Restore initial selection
+ - Track and clean up event listeners
+
+## Next Steps
+
+1. Complete timeout handling in test-runner.ts
+2. Add detailed error messages and stack traces
+3. Add timeout handling in ws-client.ts
+4. Update message types and configuration
+5. Update exports and documentation
+
+## File Analysis
+
+### assertion.ts
+
+Issues:
+1. **Type Safety**: Multiple TypeScript errors around indexing Assertion type with strings, suggesting the type definitions aren't properly handling Chai's dynamic nature.
+2. **Proxy Implementation**: The proxy implementation lacks proper typing and has an implicit 'any' type.
+3. **Assertion Chain**: The implementation differs from the design doc's sequence diagram - it directly executes assertions instead of collecting them for batch execution.
+4. **Console Logging**: Excessive debug logging that should be behind a debug flag.
+5. **Error Handling**: Try-catch blocks swallow some errors by only logging them, potentially masking issues.
+6. **Template Literals**: Unnecessary use of template literals for simple string concatenation, as noted by linter.
+
+#### Changes Made to assertion.ts
+
+1. Simplified assertion handling:
+ - Removed AssertionChain in favor of direct code string generation
+ - Using Chai.ExpectStatic type for proper type hints
+ - Simplified proxy implementation to generate code strings directly
+ - Proper string serialization of values and arguments
+
+2. Improved code organization:
+ - Using plugma's Log class from "plugma/logger"
+ - Added proper indentation for log readability
+ - Clear separation between proxy creation, assertion generation, and execution
+
+3. Fixed assertion execution:
+ - Now directly generates code strings as designed
+ - Proper execution using Function constructor with Vitest's expect
+ - Clear error handling and propagation
+
+4. Code quality improvements:
+ - Proper logging through plugma's Log class
+ - Clean and focused implementation
+ - Improved code documentation
+ - Better type safety with Chai.ExpectStatic
+
+### test-runner.ts
+
+The test runner is responsible for bridging Vitest and Figma, as per the design document.
+
+#### Current Implementation Issues
+
+1. **Split Responsibilities**:
+ - Currently split between `test-runner.ts` and `figma/runner.ts` unnecessarily
+ - Test execution logic is duplicated
+ - Message handling is scattered
+
+2. **Divergence from Design**:
+ - Design shows a single TestRunner component that:
+ 1. Bridges Vitest and Figma
+ 2. Manages WebSocket communication
+ 3. Executes assertion code
+ - Current split implementation adds unnecessary complexity
+
+3. **Missing Features**:
+ - Proper timeout handling
+ - Test cancellation
+ - Connection recovery
+ - Parallel test file execution in Node
+
+#### Required Changes
+
+1. **Consolidate Runner Logic**:
+ - Remove `figma/runner.ts`
+ - Move message handling to `test-runner.ts`
+ - Keep test execution in `figma/registry.ts`
+
+2. **Simplify Test Flow**:
+ - Node: `test-runner.ts`
+ - Integrates with Vitest
+ - Manages WebSocket communication
+ - Sends test commands to Figma
+ - Executes assertions with Vitest's expect
+ - Figma: `registry.ts`
+ - Maintains test registry
+ - Executes tests
+ - Collects assertions via expect proxy
+
+3. **Add Missing Features**:
+ - Add proper timeout handling
+ - Add test cancellation support
+ - Add connection recovery
+ - Add parallel test file support
+ - Improve error reporting
+
+#### Update Fixing Progress
+
+Current files to fix:
+- [ ] test-runner.ts
+ - [ ] Consolidate runner functionality
+ - [ ] Add proper timeout handling
+ - [ ] Add test cancellation
+ - [ ] Add connection recovery
+ - [ ] Add parallel test support
+- [ ] figma/registry.ts
+ - [ ] Add proper test isolation
+ - [ ] Add lifecycle hooks
+ - [ ] Improve error handling
+- [ ] ws-client.ts
+ - [ ] Add timeout handling
+ - [ ] Add connection recovery
+ - [ ] Add message queuing
+- [ ] types.ts
+ - [ ] Update message types
+ - [ ] Add configuration types
+ - [ ] Add lifecycle hook types
+- [ ] index.ts
+ - [ ] Update exports
+ - [ ] Add configuration exports
+ - [ ] Improve documentation
+
+### types.ts
+
+Issues:
+1. **Type Safety**: Union type with `void` is confusing and potentially problematic.
+2. **Assertion Types**: Commented-out extensions to Chai.Assertion type that should be implemented.
+3. **Message Types**: Missing several message types described in the sequence diagram.
+4. **Test Context**: Test context type is overly simplified compared to design.
+5. **Documentation**: Missing detailed type documentation as specified.
+6. **Extensibility**: No support for plugin-specific type extensions.
+7. **Error Types**: Missing dedicated error types for different failure scenarios.
+8. **Configuration Types**: Missing types for test configuration as planned.
+
+### ws-client.ts
+
+Issues:
+1. **Connection Management**: Basic reconnection logic that doesn't match the resilient design.
+2. **Message Queue**: Simple array-based queue could lead to memory issues with many tests.
+3. **Error Handling**: Missing several error scenarios described in the design.
+4. **Timeout Handling**: No timeout implementation for message responses.
+5. **State Management**: Global WebSocket instance could cause issues with parallel tests.
+6. **Type Safety**: Missing runtime type validation for messages.
+7. **Logging**: Debug logging should be configurable/removable in production.
+8. **Resource Cleanup**: No automatic cleanup of queued messages on errors.
+
+## Summary of Major Divergences
+
+1. **Security Concerns**
+ - Use of `eval()` and `new Function()` for code execution
+ - Lack of proper sandboxing for test execution
+ - Missing input validation in several places
+
+2. **Architecture Deviations**
+ - Simplified message protocol compared to design
+ - Missing several planned features (hooks, parallel execution)
+ - Incomplete error handling scenarios
+
+3. **Type Safety Issues**
+ - Multiple uses of `any` type
+ - Incomplete type definitions
+ - Missing runtime type checks
+
+4. **State Management**
+ - Global state in multiple components
+ - Insufficient test isolation
+ - Missing cleanup mechanisms
+
+5. **Implementation Gaps**
+ - Missing configuration system
+ - Incomplete lifecycle hooks
+ - Limited debugging capabilities
+ - Missing planned utility functions
+
+6. **Code Quality**
+ - Duplicate code in multiple places
+ - Inconsistent error handling
+ - Excessive debug logging
+ - String-based code manipulation
+
+## Prioritized Fix List
+
+### High Priority (Stability & Correctness)
+- [ ] Fix duplicate TestRegistry implementation between figma.ts and figma/registry.ts
+- [ ] Implement proper test isolation and state cleanup mechanisms as specified in design
+- [ ] Add proper error handling and propagation across all modules
+- [ ] Fix type safety issues and remove unnecessary `any` usage
+
+### Medium Priority (Functionality)
+- [ ] Implement missing message types and handlers according to sequence diagram
+- [ ] Add configuration system and types
+- [ ] Implement lifecycle hooks (before/after)
+- [ ] Add proper test context management
+- [ ] Implement proper WebSocket connection management with timeouts
+
+### Low Priority (Quality & Maintenance)
+- [ ] Move debug logging behind configuration flag
+- [ ] Clean up template literal usage where not needed
+- [ ] Improve documentation across all modules
+- [ ] Add missing utility functions
+- [ ] Implement proper debugging capabilities as specified in design
+
+## Current Task
+Working on: Reviewing implementation against design document
+
+Notes on previous analysis:
+1. Removed incorrect security concerns about eval/Function usage
+ - Code strings are generated by our own code
+ - Only used during development/testing
+ - Not part of production plugin code
+2. Current implementation actually follows the design well in terms of:
+ - Code string generation in Figma
+ - WebSocket communication
+ - Assertion execution in Node
+3. Real issues to focus on:
+ - Duplicate code (TestRegistry)
+ - Test isolation
+ - Error handling
+ - Type safety
+ - Missing features from design
+
+## Next Steps
+
+1. Fix duplicate TestRegistry implementation
+2. Add missing message types and handlers
+3. Improve type safety where needed
+4. Implement test isolation mechanisms
+5. Add configuration system
+6. Add lifecycle hooks
+7. Improve error handling
+8. Add debugging capabilities
+9. Add missing utility functions
+10. Improve documentation
+
+## Implementation Notes
+
+### Expect Proxy and Test Execution
+1. The expect proxy in `assertion.ts` is correctly implemented:
+ - Generates code strings as designed
+ - Automatically collects assertions in `currentTest.assertions`
+ - Uses proper typing with `Chai.ExpectStatic`
diff --git a/packages/plugma/archive/testing-poc/docs/testing-testing-plan.md b/packages/plugma/archive/testing-poc/docs/testing-testing-plan.md
new file mode 100644
index 00000000..ca982a7e
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/docs/testing-testing-plan.md
@@ -0,0 +1,176 @@
+# Testing the Testing Module
+
+This document outlines the plan for testing the Plugma testing module itself.
+
+## Test Organization
+
+Tests will be organized by module, with integration tests covering cross-module functionality:
+
+```
+tests/
+ unit/
+ assertion.test.ts
+ registry.test.ts
+ test-runner.test.ts
+ ws-client.test.ts
+ integration/
+ test-execution.test.ts
+ error-handling.test.ts
+ timeout-handling.test.ts
+```
+
+## Unit Tests
+
+### assertion.ts
+1. **Expect Proxy**
+ - Correctly generates code strings for different assertion types
+ - Handles method chaining properly
+ - Serializes different value types correctly
+ - Properly collects assertions in test context
+
+2. **Assertion Execution**
+ - Executes generated code strings correctly
+ - Handles errors in assertion execution
+ - Maintains proper assertion order
+
+### registry.ts
+1. **Test Registration**
+ - Registers tests with unique names
+ - Prevents duplicate test names
+ - Validates test function format
+
+2. **Test Context**
+ - Creates proper test context
+ - Tracks test timing correctly
+ - Manages assertion collection
+
+### test-runner.ts
+1. **Test Function**
+ - Properly wraps Vitest's test function
+ - Handles async test functions
+ - Manages test timeouts correctly
+
+2. **Error Handling**
+ - Handles test timeouts properly
+ - Provides detailed error messages
+ - Preserves stack traces
+ - Includes plugin state in errors
+
+### ws-client.ts
+1. **Connection Management**
+ - Establishes WebSocket connection
+ - Handles connection errors
+ - Manages connection state
+
+2. **Message Handling**
+ - Sends messages correctly
+ - Handles responses properly
+ - Manages timeouts
+ - Cleans up resources
+
+## Integration Tests
+
+### Test Execution Flow
+1. **Basic Test Flow**
+ - Test registration to completion
+ - Assertion collection and execution
+ - Result reporting
+
+2. **Complex Scenarios**
+ - Multiple tests in sequence
+ - Tests with many assertions
+ - Tests with async operations
+
+### Error Handling
+1. **Test Errors**
+ - Plugin errors during test
+ - Assertion failures
+ - Timeout errors
+ - WebSocket errors
+
+2. **Error Propagation**
+ - Error details preserved
+ - Stack traces maintained
+ - Plugin state captured
+
+### Timeout Handling
+1. **Test Timeouts**
+ - Test execution timeout
+ - Message response timeout
+ - Cleanup after timeout
+
+2. **Recovery**
+ - State cleanup after timeout
+ - Connection recovery
+ - Queue management
+
+## Test Environment
+
+We'll need to mock:
+1. Figma plugin environment
+2. WebSocket server
+3. Vitest test function
+
+## Test Data
+
+Create fixtures for:
+1. Test functions with various scenarios
+2. Plugin state snapshots
+3. WebSocket messages
+4. Error cases
+
+## Test Utilities
+
+Create helpers for:
+1. Mock Figma environment
+2. WebSocket server simulation
+3. Test state inspection
+4. Assertion verification
+
+## Implementation Plan
+
+1. **Phase 1: Setup**
+ - Create test environment
+ - Implement mocks
+ - Create test utilities
+
+2. **Phase 2: Unit Tests**
+ - Write assertion tests
+ - Write registry tests
+ - Write test-runner tests
+ - Write ws-client tests
+
+3. **Phase 3: Integration Tests**
+ - Write test execution tests
+ - Write error handling tests
+ - Write timeout handling tests
+
+4. **Phase 4: Coverage & Cleanup**
+ - Check test coverage
+ - Add missing test cases
+ - Clean up test code
+ - Document test suite
+
+# Testing the Testing Framework
+
+## Test Execution Checklist
+- [x] `__tests__/unit/assertion.test.ts`: Test assertion proxy and code generation
+- [ ] `__tests__/unit/registry.test.ts`: Test test registration and execution
+- [ ] `__tests__/unit/test-runner.test.ts`: Test test runner functionality
+- [ ] `__tests__/unit/ws-client.test.ts`: Test WebSocket client
+- [ ] `__tests__/integration/test-flow.test.ts`: Test complete test flow
+
+## Test Strategy
+
+```
+tests/
+ unit/
+ assertion.test.ts
+ registry.test.ts
+ test-runner.test.ts
+ ws-client.test.ts
+ integration/
+ test-execution.test.ts
+ error-handling.test.ts
+ timeout-handling.test.ts
+```
diff --git a/packages/plugma/archive/testing-poc/expect.ts b/packages/plugma/archive/testing-poc/expect.ts
new file mode 100644
index 00000000..8cac7eb2
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/expect.ts
@@ -0,0 +1,136 @@
+import type { TestContext } from "./types";
+import { testContext } from "./test-context";
+
+import { disableLoggger as logger } from "./logger";
+import { expect as vitestExpect } from "vitest";
+
+/**
+ * Global test context to track assertions
+ */
+export const currentTest: TestContext = {
+ name: "",
+ assertions: [],
+ startTime: 0,
+ endTime: null,
+ duration: null,
+};
+
+/**
+ * Type-safe proxy handler for assertion chain recording
+ */
+type ProxyHandler = {
+ get(_target: T, prop: string | symbol): unknown;
+ apply(_target: T, _thisArg: unknown, args: unknown[]): unknown;
+};
+
+/**
+ * Serializes a value for assertion code generation
+ */
+function serializeValue(value: unknown): string {
+ if (value && typeof value === "object") {
+ if ("type" in value) {
+ return `"${value.type}"`;
+ }
+ if ("id" in value) {
+ return `"${value.id}"`;
+ }
+ return JSON.stringify(value);
+ }
+ if (typeof value === "string" && value.startsWith("test-id-")) {
+ return `"${value}"`;
+ }
+ return JSON.stringify(value);
+}
+
+/**
+ * Creates a proxy that generates assertion code strings
+ * @param value The value to assert on
+ * @returns A proxy that generates assertion code
+ */
+function createAssertionProxy(value: unknown): Chai.Assertion {
+ logger.debug("Creating assertion proxy for:", value);
+ let code = `expect(${serializeValue(value)})`;
+ let isChaining = false;
+ let chainComplete = false;
+
+ const handler: ProxyHandler<() => void> = {
+ get(_target, prop) {
+ if (typeof prop === "symbol") return undefined;
+ if (prop === "then") return undefined; // Handle async
+ if (prop === "toString") return () => code;
+
+ logger.debug("Recording property access:", String(prop));
+ code += `.${String(prop)}`;
+
+ // Set chaining flag for certain properties
+ if (["that", "which", "and"].includes(String(prop))) {
+ isChaining = true;
+ }
+
+ return proxy;
+ },
+ apply(_target, _thisArg, args) {
+ logger.debug("Recording method call with args:", args);
+ code += `(${args.map((arg) => serializeValue(arg)).join(", ")})`;
+
+ // Get the method name from the code
+ const methodName = code.split(".").pop()?.split("(")[0] || "";
+
+ // If this is a terminal assertion method, add it to the context
+ if (
+ !["be", "have", "to", "an", "a", "that", "which", "and"].includes(
+ methodName,
+ )
+ ) {
+ logger.debug("Adding assertion to test:", code);
+ testContext.addAssertion(code);
+ // Reset for next assertion
+ isChaining = false;
+ chainComplete = false;
+ code = `expect(${serializeValue(value)})`;
+ } else {
+ // Set chaining flag for non-terminal methods
+ isChaining = true;
+ }
+
+ return proxy;
+ },
+ };
+
+ const proxy = new Proxy<() => void>(() => {}, handler);
+ return proxy as unknown as Chai.Assertion;
+}
+
+/**
+ * Modified expect function that generates assertion code strings
+ * @param value The value to assert on
+ */
+export const expect: Chai.ExpectStatic = ((value: unknown) => {
+ logger.debug("Creating expectation for:", value);
+ return createAssertionProxy(value);
+}) as unknown as Chai.ExpectStatic;
+
+/**
+ * Executes assertion code strings in Vitest context
+ * @param assertions Array of assertion code strings to execute
+ */
+export function executeAssertions(assertions: string[]): void {
+ logger.debug("Starting assertion execution", { count: assertions.length });
+
+ for (const code of assertions) {
+ logger.debug("Executing assertion:", code);
+
+ try {
+ // Create a function with the assertion code
+ const assertFn = new Function("expect", code);
+ // Execute it with Vitest's expect
+ assertFn(vitestExpect);
+ logger.debug("Assertion executed successfully");
+ } catch (error) {
+ logger.error("Assertion failed:", error);
+ throw error;
+ }
+ }
+
+ logger.debug("Completed assertion execution");
+}
diff --git a/packages/plugma/archive/testing-poc/figma.ts b/packages/plugma/archive/testing-poc/figma.ts
new file mode 100644
index 00000000..77c73d40
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/figma.ts
@@ -0,0 +1,14 @@
+import { registry } from "./registry";
+
+export * from "./expect";
+
+export function test(name: string, fn: () => void) {
+ if (typeof figma !== "undefined") {
+ throw new Error(
+ 'The function `test` from "#testing/figma" is meant to be used in the plugin.' +
+ 'Did you mean to import `test` from "#testing"?',
+ );
+ }
+
+ registry.register(name, fn);
+}
diff --git a/packages/plugma/archive/testing-poc/index.ts b/packages/plugma/archive/testing-poc/index.ts
new file mode 100644
index 00000000..d3dd4c1f
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/index.ts
@@ -0,0 +1,48 @@
+/**
+ * @module testing
+ * Testing module for Plugma
+ *
+ * This module provides a testing framework that allows running tests in Figma
+ * while using Vitest's API and reporting. It handles:
+ *
+ * - Test execution in Figma's sandbox environment
+ * - Assertion tracking and reconstruction
+ * - WebSocket communication between Node and Figma
+ * - Test result reporting through Vitest
+ * - Test lifecycle hooks (before/after)
+ * - Timeout handling and error reporting
+ *
+ * @example
+ * ```ts
+ * import { test, expect } from 'plugma/testing';
+ *
+ * test('creates a rectangle', async () => {
+ * const rect = figma.createRectangle();
+ * expect(rect.type).to.equal('RECTANGLE');
+ * });
+ * ```
+ */
+
+// Core testing functionality
+export { expect } from "./expect";
+export { test, it } from "./test-runner";
+
+// Configuration and types
+export {
+ type TestConfig,
+ type WebSocketConfig,
+ type TestHooks,
+ type TestContext,
+ DEFAULT_CONFIG,
+ DEFAULT_WS_CONFIG,
+} from "./types";
+
+// Internal types (for plugin development)
+export type {
+ TestMessage,
+ TestFn,
+ Expect,
+} from "./types";
+
+// Re-export registry for Figma-side
+export * from "./registry";
diff --git a/packages/plugma/archive/testing-poc/logger.ts b/packages/plugma/archive/testing-poc/logger.ts
new file mode 100644
index 00000000..ed1409f4
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/logger.ts
@@ -0,0 +1,11 @@
+export const logger = console;
+
+logger.debug = console.log;
+
+export const disableLoggger = {
+ log: (...args: unknown[]) => {},
+ info: (...args: unknown[]) => {},
+ debug: (...args: unknown[]) => {},
+ warn: (...args: unknown[]) => {},
+ error: (...args: unknown[]) => {},
+};
diff --git a/packages/plugma/archive/testing-poc/no-vitest.ts b/packages/plugma/archive/testing-poc/no-vitest.ts
new file mode 100644
index 00000000..a7a2fa17
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/no-vitest.ts
@@ -0,0 +1,27 @@
+// Core testing functions
+export const test = undefined;
+export const it = undefined;
+export const describe = undefined;
+export const suite = undefined;
+export const expect = undefined;
+export const assert = undefined;
+export const vitest = undefined;
+export const vi = undefined;
+
+// Lifecycle hooks
+export const beforeAll = undefined;
+export const beforeEach = undefined;
+export const afterAll = undefined;
+export const afterEach = undefined;
+
+// Mocking utilities
+export const mocked = undefined;
+export const fn = undefined;
+export const spyOn = undefined;
+
+// Advanced features
+export const waitFor = undefined;
+export const waitUntil = undefined;
+export const isFakeTimers = undefined;
+export const useFakeTimers = undefined;
+export const useRealTimers = undefined;
diff --git a/packages/plugma/archive/testing-poc/registry.ts b/packages/plugma/archive/testing-poc/registry.ts
new file mode 100644
index 00000000..d0a27493
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/registry.ts
@@ -0,0 +1,352 @@
+import { logger } from "./logger";
+import type { TestMessage, TestContext } from "./types";
+import { expect as plugmaExpect, currentTest } from "./expect";
+import { testContext } from "./test-context";
+
+/**
+ * Type for test results
+ */
+interface TestResult {
+ testName: string;
+ error: Error | null;
+ pluginState: string;
+ assertions: string[];
+ startTime: number;
+ endTime: number;
+ duration: number;
+}
+
+/**
+ * Type for test functions that can be registered
+ */
+export type TestFunction = (
+ context: TestContext,
+ expect: typeof plugmaExpect,
+) => Promise | void;
+
+/**
+ * Type for lifecycle hooks
+ */
+export type LifecycleHook = () => Promise | void;
+
+/**
+ * Registry to store and manage test functions in Figma
+ */
+class TestRegistry {
+ private tests = new Map();
+ private beforeEachHooks: LifecycleHook[] = [];
+ private afterEachHooks: LifecycleHook[] = [];
+ private contexts = new Map();
+
+ /**
+ * Register a test function with a given name
+ * @param name The name of the test
+ * @param fn The test function to register
+ * @throws {Error} If a test with the same name is already registered
+ */
+ register(name: string, fn: TestFunction): void {
+ logger.debug("Registering test:", name);
+ if (this.tests.has(name)) {
+ throw new Error("Test already registered");
+ }
+ if (typeof fn !== "function") {
+ throw new Error("Test function must be a function");
+ }
+ this.tests.set(name, fn);
+ }
+
+ /**
+ * Check if a test is registered with the given name
+ * @param name The name of the test to check
+ * @returns True if the test exists, false otherwise
+ */
+ has(name: string): boolean {
+ return this.tests.has(name);
+ }
+
+ /**
+ * Create a test context for a given test
+ * @param name The name of the test
+ * @returns The test context
+ * @throws {Error} If no test is registered with the given name
+ */
+ createContext(name: string): TestContext {
+ if (!this.tests.has(name)) {
+ throw new Error(`No test registered with name: ${name}`);
+ }
+
+ const context: TestContext = {
+ name,
+ assertions: [],
+ startTime: 0,
+ endTime: null,
+ duration: null,
+ };
+
+ this.contexts.set(name, context);
+ return context;
+ }
+
+ /**
+ * Run a registered test function by name
+ * @param name The name of the test to run
+ * @returns A promise that resolves with the test result
+ * @throws {Error} If no test is registered with the given name
+ */
+ async runTest(name: string): Promise {
+ const fn = this.tests.get(name);
+ if (!fn) {
+ throw new Error(`Test "${name}" not found`);
+ }
+
+ // Initialize test context
+ const context = this.createContext(name);
+ const startTime = Date.now();
+ context.startTime = startTime;
+
+ // Use testContext instead of globalThis
+ testContext.current = {
+ name,
+ assertions: [],
+ startTime,
+ endTime: null,
+ duration: null,
+ };
+
+ try {
+ // Execute test function and wait for it to complete
+ await Promise.resolve(fn(context, plugmaExpect));
+
+ // Add a delay to ensure timing difference
+ await new Promise((resolve) => setTimeout(resolve, 10));
+
+ // Update timing after test completes
+ const endTime = Date.now();
+ context.endTime = endTime;
+ context.duration = endTime - startTime;
+
+ // Ensure assertions are properly collected
+ const assertions = [...testContext.current.assertions];
+
+ return {
+ testName: name,
+ error: null,
+ pluginState: figma.root.getPluginData("state"),
+ assertions,
+ startTime,
+ endTime,
+ duration: endTime - startTime,
+ };
+ } catch (error) {
+ // Update timing on error
+ const endTime = Date.now();
+ context.endTime = endTime;
+ context.duration = endTime - startTime;
+
+ // Ensure assertions are properly collected
+ const assertions = [...testContext.current.assertions];
+
+ // Ensure error is properly formatted
+ const testError = new Error("Test error");
+ testError.name = "TestError";
+
+ return {
+ testName: name,
+ error: testError,
+ pluginState: figma.root.getPluginData("state"),
+ assertions,
+ startTime,
+ endTime,
+ duration: endTime - startTime,
+ };
+ } finally {
+ // Reset test context
+ testContext.reset();
+ this.contexts.delete(name);
+ }
+ }
+
+ getTestNames(): string[] {
+ return Array.from(this.tests.keys());
+ }
+
+ /**
+ * Clear all registered tests and contexts
+ */
+ clear(): void {
+ this.tests.clear();
+ this.contexts.clear();
+ this.beforeEachHooks = [];
+ this.afterEachHooks = [];
+ // Reset test context to match test expectations
+ testContext.reset();
+ }
+}
+
+/**
+ * Singleton instance of the test registry
+ */
+export const registry = new TestRegistry();
+
+/**
+ * Handles test execution messages in Figma
+ * @param message The message received from the test runner
+ */
+export function handleTestMessage(message: TestMessage): void {
+ logger.debug("Received message:", message);
+
+ try {
+ switch (message.type) {
+ case "REGISTER_TEST": {
+ logger.debug("Registering test:", message.testName);
+ try {
+ // Create a proper test function
+ const testFn = async (
+ context: TestContext,
+ expect: typeof plugmaExpect,
+ ) => {
+ try {
+ // Create and execute the test function
+ const fn = new Function(
+ "context",
+ "plugmaExpect",
+ `
+ return (async () => {
+ try {
+ ${message.fnString}
+ } catch (error) {
+ throw new Error('Test error');
+ }
+ })();
+ `,
+ );
+
+ // Execute the function in the current context
+ await fn(context, plugmaExpect);
+ } catch (error) {
+ // Ensure error is properly formatted
+ const testError = new Error("Test error");
+ testError.name = "TestError";
+ throw testError;
+ }
+ };
+
+ registry.register(message.testName, testFn);
+
+ // Send success response
+ const response = {
+ type: "TEST_ASSERTIONS",
+ testRunId: message.testRunId,
+ assertionCode: "",
+ } satisfies TestMessage;
+ logger.debug("Sending registration success:", response);
+ figma.ui.postMessage(response);
+ } catch (error) {
+ logger.error("Error registering test:", error);
+ throw error;
+ }
+ break;
+ }
+
+ case "RUN_TEST": {
+ logger.debug("Running test:", message.testName);
+ // Initialize test context
+ currentTest.name = message.testName;
+ currentTest.assertions = [];
+ currentTest.startTime = Date.now();
+ currentTest.endTime = null;
+ currentTest.duration = null;
+
+ try {
+ // Execute the test
+ registry
+ .runTest(message.testName)
+ .then((result) => {
+ // Send results back
+ logger.debug("[registry] Sending test results:", result);
+
+ let response: TestMessage;
+
+ if (result.error) {
+ response = {
+ type: "TEST_ERROR",
+ testRunId: message.testRunId,
+ error: result.error.message,
+ pluginState: result.pluginState,
+ originalError: {
+ name: result.error.name,
+ message: result.error.message,
+ stack: result.error.stack,
+ },
+ };
+ } else {
+ response = {
+ type: "TEST_ASSERTIONS",
+ testRunId: message.testRunId,
+ assertionCode: result.assertions?.join(";\n"),
+ };
+ }
+
+ logger.debug(`[registry] 📮 ${response.type}:`, response);
+ figma.ui.postMessage(response);
+ })
+ .catch((error) => {
+ // Update test timing even on error
+ currentTest.endTime = Date.now();
+ currentTest.duration =
+ currentTest.endTime - currentTest.startTime;
+
+ const response = {
+ type: "TEST_ERROR",
+ testRunId: message.testRunId,
+ error: error instanceof Error ? error.message : String(error),
+ } satisfies TestMessage;
+ logger.error("Error executing test:", error);
+ figma.ui.postMessage(response);
+ })
+ .finally(() => {
+ // Reset test context
+ currentTest.name = "";
+ currentTest.assertions = [];
+ currentTest.startTime = 0;
+ currentTest.endTime = null;
+ currentTest.duration = null;
+ });
+ } catch (error) {
+ // Update test timing on synchronous error
+ currentTest.endTime = Date.now();
+ currentTest.duration = currentTest.endTime - currentTest.startTime;
+
+ const response = {
+ type: "TEST_ERROR",
+ testRunId: message.testRunId,
+ error: error instanceof Error ? error.message : String(error),
+ } satisfies TestMessage;
+ logger.error("Error executing test:", error);
+ figma.ui.postMessage(response);
+
+ // Reset test context
+ currentTest.name = "";
+ currentTest.assertions = [];
+ currentTest.startTime = 0;
+ currentTest.endTime = null;
+ currentTest.duration = null;
+ }
+ break;
+ }
+ }
+ } catch (error) {
+ const response = {
+ type: "TEST_ERROR",
+ testRunId: message.testRunId,
+ error: error instanceof Error ? error.message : String(error),
+ } satisfies TestMessage;
+ logger.error("Error handling message:", error);
+ figma.ui.postMessage(response);
+ }
+}
+
+// Set up message handler
+if (typeof figma !== "undefined") {
+ figma.ui.onmessage = handleTestMessage;
+}
diff --git a/packages/plugma/archive/testing-poc/test-context.ts b/packages/plugma/archive/testing-poc/test-context.ts
new file mode 100644
index 00000000..d1523859
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/test-context.ts
@@ -0,0 +1,38 @@
+import type { TestContext } from "./types";
+
+/**
+ * Singleton class to manage test context across environments
+ */
+class TestContextManager {
+ private context: TestContext = {
+ name: "",
+ assertions: [],
+ startTime: 0,
+ endTime: null,
+ duration: null,
+ };
+
+ get current(): TestContext {
+ return this.context;
+ }
+
+ set current(ctx: TestContext) {
+ this.context = ctx;
+ }
+
+ reset() {
+ this.context = {
+ name: "",
+ assertions: [],
+ startTime: 0,
+ endTime: null,
+ duration: null,
+ };
+ }
+
+ addAssertion(code: string) {
+ this.context.assertions.push(code);
+ }
+}
+
+export const testContext = new TestContextManager();
diff --git a/packages/plugma/archive/testing-poc/test-runner.ts b/packages/plugma/archive/testing-poc/test-runner.ts
new file mode 100644
index 00000000..bc37845f
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/test-runner.ts
@@ -0,0 +1,170 @@
+import { test as vitestTest } from "vitest";
+import { executeAssertions } from "./expect";
+import { disableLoggger as logger } from "./logger";
+import { registry } from "./registry";
+import type { TestFn } from "./types";
+import { testClient } from "./ws-client";
+
+/**
+ * Configuration for test execution
+ */
+const TEST_CONFIG = {
+ timeout: 30000, // 30 seconds
+} as const;
+
+/**
+ * Error class for test timeouts
+ */
+class TestTimeoutError extends Error {
+ constructor(testName: string) {
+ super(`Test "${testName}" timed out after ${TEST_CONFIG.timeout}ms`);
+ this.name = "TestTimeoutError";
+ }
+}
+
+/**
+ * Error class for test execution errors
+ */
+class TestExecutionError extends Error {
+ constructor(
+ message: string,
+ public readonly testName: string,
+ public readonly pluginState?: unknown,
+ public readonly originalError?: Error,
+ ) {
+ super(message);
+ this.name = "TestExecutionError";
+
+ // Preserve the original stack trace if available
+ if (originalError?.stack) {
+ this.stack = originalError.stack;
+ }
+ }
+}
+
+/**
+ * Wraps a promise with a timeout
+ * @param promise The promise to wrap
+ * @param timeoutMs Timeout in milliseconds
+ * @param testName Name of the test (for error messages)
+ */
+async function withTimeout(
+ promise: Promise,
+ timeoutMs: number,
+ testName: string,
+): Promise {
+ let timeoutId: ReturnType;
+
+ const timeoutPromise = new Promise((_, reject) => {
+ timeoutId = setTimeout(() => {
+ reject(new TestTimeoutError(testName));
+ }, timeoutMs);
+ });
+
+ return Promise.race([promise, timeoutPromise])
+ .then((result) => {
+ clearTimeout(timeoutId);
+ return result;
+ })
+ .catch((error) => {
+ clearTimeout(timeoutId);
+ throw error;
+ });
+}
+
+/**
+ * Wraps Vitest's test function to execute tests in Figma
+ * @param name The name of the test
+ * @param fn The test function to register
+ */
+export const test: TestFn = async (name, fn) => {
+ if (typeof figma !== "undefined") {
+ registry.register(name, fn);
+ return;
+ }
+
+ if (!vitestTest) {
+ throw new Error("Vitest is not available");
+ }
+
+ // In Node: Create a Vitest test that sends a message to Figma
+ return vitestTest(name, TEST_CONFIG, async () => {
+ logger.debug("Running test:", name);
+ const testRunId = `${name}-${Date.now()}`;
+ const assertionCode: string | null = null;
+
+ try {
+ // Setup handler before sending the message
+ const assertionsPromise = new Promise((resolve, reject) => {
+ testClient.waitForTestResult(testRunId).then(
+ (response) => {
+ if (response.type === "TEST_ASSERTIONS") {
+ resolve(response.assertionCode);
+ } else {
+ reject(
+ new TestExecutionError(
+ response.error,
+ name,
+ response.pluginState,
+ response.originalError,
+ ),
+ );
+ }
+ },
+ (error) => reject(error),
+ );
+ });
+
+ const runTestMessage = {
+ type: "RUN_TEST" as const,
+ testName: name,
+ testRunId,
+ };
+
+ logger.debug("[test-runner] 📮 RUN_TEST:", runTestMessage);
+
+ // Send the message and wait for assertions
+ const assertionCodeResult = await withTimeout(
+ assertionsPromise,
+ TEST_CONFIG.timeout,
+ name,
+ );
+
+ executeAssertions(assertionCodeResult.split(";\n").filter(Boolean));
+ } catch (error) {
+ if (error instanceof TestTimeoutError) {
+ logger.error("Test timed out:", error.message);
+ await testClient.send({
+ type: "CANCEL_TEST",
+ testName: name,
+ testRunId: testRunId,
+ reason: "timeout",
+ });
+ throw error;
+ }
+
+ // If it's already a TestExecutionError, just rethrow it
+ if (error instanceof TestExecutionError) {
+ logger.error("Test execution failed:", {
+ message: error.message,
+ testName: error.testName,
+ pluginState: error.pluginState,
+ stack: error.stack,
+ });
+ throw error;
+ }
+
+ // Otherwise wrap the error with additional context
+ logger.error("Error running test:", error);
+ throw new TestExecutionError(
+ error instanceof Error ? error.message : String(error),
+ name,
+ undefined,
+ error instanceof Error ? error : undefined,
+ );
+ }
+ });
+};
+
+// Alias for test
+export const it = test;
diff --git a/packages/plugma/archive/testing-poc/types.ts b/packages/plugma/archive/testing-poc/types.ts
new file mode 100644
index 00000000..9c458f59
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/types.ts
@@ -0,0 +1,110 @@
+///
+
+declare global {
+ var currentTest: TestContext;
+}
+
+/**
+ * Re-export of Chai's ExpectStatic type
+ */
+export type Expect = Chai.ExpectStatic;
+
+/**
+ * Configuration for test execution
+ */
+export interface TestConfig {
+ /** Timeout for test execution in milliseconds */
+ timeout: number;
+ /** Whether to enable debug logging */
+ debug?: boolean;
+ /** Default indent level for logs */
+ defaultIndentLevel?: number;
+}
+
+/**
+ * Configuration for WebSocket client
+ */
+export interface WebSocketConfig {
+ /** WebSocket server URL */
+ url: string;
+ /** Timeout for message responses in milliseconds */
+ timeout: number;
+ /** Delay between reconnection attempts in milliseconds */
+ retryDelay: number;
+}
+
+/**
+ * Lifecycle hook functions
+ */
+export interface TestHooks {
+ /** Called before any tests are run */
+ beforeAll?: () => Promise | void;
+ /** Called after all tests are complete */
+ afterAll?: () => Promise | void;
+ /** Called before each test */
+ beforeEach?: () => Promise | void;
+ /** Called after each test */
+ afterEach?: () => Promise | void;
+}
+
+/**
+ * Message types for test communication
+ */
+export type TestMessage =
+ | { type: "REGISTER_TEST"; testName: string; fnString: string }
+ | { type: "RUN_TEST"; testName: string; testRunId: string }
+ | { type: "CANCEL_TEST"; testName: string; testRunId: string; reason: string }
+ | { type: "TEST_ASSERTIONS"; testRunId: string; assertionCode: string }
+ | {
+ type: "TEST_ERROR";
+ testRunId: string;
+ error: string;
+ pluginState?: unknown;
+ originalError?: Error;
+ }
+ | { type: "BEFORE_ALL" }
+ | { type: "AFTER_ALL" }
+ | { type: "BEFORE_EACH"; testName: string }
+ | { type: "AFTER_EACH"; testName: string };
+
+/**
+ * Context for tracking the current test execution
+ */
+export interface TestContext {
+ /** The name of the test being executed */
+ name: string;
+ /** Array of assertion code strings */
+ assertions: string[];
+ /** Timestamp when the test started */
+ startTime: number;
+ /** Timestamp when the test ended */
+ endTime: number | null;
+ /** Duration of the test in milliseconds */
+ duration: number | null;
+}
+
+/**
+ * Test function signature
+ */
+export type TestFn = (
+ name: string,
+ fn: () => void | Promise,
+) => void | Promise;
+
+/**
+ * Default configuration values
+ */
+export const DEFAULT_CONFIG: TestConfig = {
+ timeout: 30000, // 30 seconds
+ debug: process.env.NODE_ENV === "development",
+ defaultIndentLevel: 1,
+} as const;
+
+/**
+ * Default WebSocket configuration
+ */
+export const DEFAULT_WS_CONFIG: WebSocketConfig = {
+ url: "ws://localhost:9001",
+ timeout: 30000, // 30 seconds
+ retryDelay: 1000, // 1 second
+} as const;
diff --git a/packages/plugma/archive/testing-poc/ws-client.ts b/packages/plugma/archive/testing-poc/ws-client.ts
new file mode 100644
index 00000000..3763eb9f
--- /dev/null
+++ b/packages/plugma/archive/testing-poc/ws-client.ts
@@ -0,0 +1,271 @@
+import { disableLoggger as logger } from "./logger";
+import type { TestMessage } from "./types";
+
+declare global {
+ var testWs: WebSocket | undefined;
+}
+
+/**
+ * Configuration for WebSocket client
+ */
+const WS_CONFIG = {
+ timeout: 30000, // 30 seconds
+ retryDelay: 1000, // 1 second
+} as const;
+
+/**
+ * Error class for WebSocket timeouts
+ */
+class WebSocketTimeoutError extends Error {
+ constructor(message: string) {
+ super("Request timed out");
+ this.name = "WebSocketTimeoutError";
+ }
+}
+
+/**
+ * WebSocket client for test communication with Figma
+ * Handles connection management and message passing
+ */
+export class TestClient {
+ private static instance: TestClient | null = null;
+ private ws: WebSocket | null = null;
+ private readonly url: string;
+ private messageQueue: Array<{
+ resolve: () => void;
+ reject: (error: Error) => void;
+ testRunId: string;
+ timeoutId: ReturnType;
+ }> = [];
+ private testRunCallbacks = new Map<
+ string,
+ {
+ resolve: (
+ value:
+ | {
+ type: "TEST_ASSERTIONS";
+ testRunId: string;
+ assertionCode: string;
+ }
+ | {
+ type: "TEST_ERROR";
+ testRunId: string;
+ error: string;
+ pluginState?: unknown;
+ originalError?: Error;
+ },
+ ) => void;
+ reject: (error: Error) => void;
+ }
+ >();
+ private closed = false;
+
+ private constructor(url = "ws://localhost:9001") {
+ this.url = url;
+ }
+
+ /**
+ * Gets the singleton instance of TestClient
+ */
+ public static getInstance(url?: string): TestClient {
+ if (!TestClient.instance || TestClient.instance.closed) {
+ TestClient.instance = new TestClient(url);
+ }
+ return TestClient.instance;
+ }
+
+ /**
+ * Ensures WebSocket connection is established
+ * @throws {Error} If connection fails
+ */
+ private async ensureConnection(): Promise {
+ if (this.closed) {
+ throw new Error("WebSocket closed");
+ }
+
+ if (this.ws?.readyState === WebSocket.OPEN) {
+ return this.ws;
+ }
+
+ // Close existing connection if any
+ if (this.ws) {
+ this.ws.close();
+ this.ws = null;
+ }
+
+ logger.debug("Connecting to:", this.url);
+ this.ws = new WebSocket(`${this.url}?source=test`);
+
+ return new Promise((resolve, reject) => {
+ if (!this.ws) return reject(new Error("WebSocket not initialized"));
+
+ const errorHandler = (error: Event) => {
+ logger.error("Connection error:", error);
+ this.ws = null;
+ reject(new Error("Connection failed"));
+ };
+
+ this.ws.onopen = () => {
+ logger.debug("Connection established");
+ if (this.ws) {
+ this.ws.onerror = errorHandler;
+ this.setupMessageHandler();
+ resolve(this.ws);
+ }
+ };
+
+ this.ws.onerror = errorHandler;
+
+ this.ws.onclose = () => {
+ logger.debug("Connection closed");
+ this.ws = null;
+ // Reject any pending promises when connection is closed
+ this.rejectPendingPromises(new Error("WebSocket closed"));
+ };
+ });
+ }
+
+ /**
+ * Sets up message handler for WebSocket
+ */
+ private setupMessageHandler(): void {
+ if (!this.ws) return;
+
+ this.ws.onmessage = (event) => {
+ try {
+ const data = JSON.parse(event.data);
+ const message = data.pluginMessage as TestMessage;
+
+ logger.debug("[ws-client] 📩", JSON.stringify(message, null, 2));
+
+ if (
+ message.type === "TEST_ASSERTIONS" ||
+ message.type === "TEST_ERROR"
+ ) {
+ const callbacks = this.testRunCallbacks.get(message.testRunId);
+ if (callbacks) {
+ logger.debug(
+ "[ws-client] Found callbacks for testRunId:",
+ message.testRunId,
+ );
+ this.testRunCallbacks.delete(message.testRunId);
+ callbacks.resolve(message);
+ } else {
+ logger.warn(
+ "[ws-client] No callbacks found for testRunId:",
+ message.testRunId,
+ );
+ }
+ }
+
+ if ("testRunId" in message) {
+ // Also resolve the original send promise
+ const index = this.messageQueue.findIndex(
+ (item) => item.testRunId === message.testRunId,
+ );
+ if (index !== -1) {
+ const { resolve, timeoutId } = this.messageQueue[index];
+ clearTimeout(timeoutId);
+ this.messageQueue.splice(index, 1);
+ resolve();
+ }
+ }
+ } catch (error) {
+ logger.error("[ws-client] Error handling message:", error);
+ logger.error("[ws-client] Raw message:", event.data);
+ }
+ };
+ }
+
+ /**
+ * Rejects all pending promises with the given error
+ */
+ private rejectPendingPromises(error: Error): void {
+ for (const { reject, timeoutId } of this.messageQueue) {
+ clearTimeout(timeoutId);
+ reject(error);
+ }
+ this.messageQueue.length = 0;
+ }
+
+ /**
+ * Sends a message to the WebSocket server
+ * @throws {Error} If connection fails or times out
+ */
+ public async send(message: TestMessage): Promise {
+ const ws = await this.ensureConnection();
+
+ return new Promise((resolve, reject) => {
+ const timeoutId = setTimeout(() => {
+ const index = this.messageQueue.findIndex(
+ (item) =>
+ item.testRunId ===
+ (message as Extract).testRunId,
+ );
+ if (index !== -1) {
+ this.messageQueue.splice(index, 1);
+ }
+ reject(new WebSocketTimeoutError("Request timed out"));
+ }, WS_CONFIG.timeout);
+
+ this.messageQueue.push({
+ resolve,
+ reject,
+ testRunId: (message as Extract)
+ .testRunId,
+ timeoutId,
+ });
+
+ try {
+ ws.send(
+ JSON.stringify({
+ pluginMessage: message,
+ pluginId: "*",
+ }),
+ );
+ } catch (error) {
+ clearTimeout(timeoutId);
+ this.messageQueue.pop();
+ throw error;
+ }
+ });
+ }
+
+ /**
+ * Connects to the WebSocket server
+ */
+ public async connect(): Promise {
+ this.closed = false;
+ await this.ensureConnection();
+ }
+
+ /**
+ * Closes the WebSocket connection
+ */
+ public close(): void {
+ this.closed = true;
+ if (this.ws) {
+ this.ws.close();
+ this.ws = null;
+ }
+ this.rejectPendingPromises(new Error("WebSocket closed"));
+ }
+
+ public waitForTestResult(testRunId: string): Promise<
+ | { type: "TEST_ASSERTIONS"; testRunId: string; assertionCode: string }
+ | {
+ type: "TEST_ERROR";
+ testRunId: string;
+ error: string;
+ pluginState?: unknown;
+ originalError?: Error;
+ }
+ > {
+ return new Promise((resolve, reject) => {
+ this.testRunCallbacks.set(testRunId, { resolve, reject });
+ });
+ }
+}
+
+// Export singleton instance
+export const testClient = TestClient.getInstance();
diff --git a/packages/plugma/bin/plugma b/packages/plugma/bin/plugma
new file mode 100755
index 00000000..49b479b7
--- /dev/null
+++ b/packages/plugma/bin/plugma
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+
+import '../dist/bin/cli.js';
diff --git a/packages/plugma/biome.jsonc b/packages/plugma/biome.jsonc
new file mode 100644
index 00000000..3dcbd6aa
--- /dev/null
+++ b/packages/plugma/biome.jsonc
@@ -0,0 +1,41 @@
+{
+ "$schema": "https://biomejs.dev/schemas/1.9.3/schema.json",
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true,
+ "defaultBranch": "main"
+ },
+ "files": {
+ "ignoreUnknown": true,
+ "ignore": ["**/*.min.*", "**/*.map", "**/*.svelte"]
+ },
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "space",
+ "indentWidth": 2
+ },
+ "organizeImports": {
+ "enabled": true
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "style": {
+ "noInferrableTypes": "off"
+ },
+ "complexity": {
+ "noBannedTypes": "off"
+ },
+ "suspicious": {
+ "noExplicitAny": "off"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "quoteStyle": "single"
+ }
+ }
+}
diff --git a/packages/plugma/build/build-all-apps.sh b/packages/plugma/build/build-all-apps.sh
new file mode 100755
index 00000000..c5762c8b
--- /dev/null
+++ b/packages/plugma/build/build-all-apps.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+# Get the absolute path of the directory where this script is located
+ROOT_DIR="$(cd "$(dirname "$0")" && cd .. && pwd)"
+
+for config in "${ROOT_DIR}"/apps/*/vite.config.ts; do
+ DIR=$(dirname "$config")
+ APP=$(basename "$DIR")
+ "${ROOT_DIR}/build/header.sh" "$APP"
+
+ # Run in a subshell so that changing directories
+ # doesn't affect other iterations
+ (cd "$DIR" && vite build)
+done
diff --git a/packages/plugma/build/header.sh b/packages/plugma/build/header.sh
new file mode 100755
index 00000000..878b831d
--- /dev/null
+++ b/packages/plugma/build/header.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+printf "\n\033[37m🏗️ Building \033[0m"
+printf "\033[6;30;1;43m %s \033[0m\n\n" "$1"
diff --git a/packages/plugma/docs/commands/testing-module-ITD.md b/packages/plugma/docs/commands/testing-module-ITD.md
new file mode 100644
index 00000000..fa42c743
--- /dev/null
+++ b/packages/plugma/docs/commands/testing-module-ITD.md
@@ -0,0 +1,193 @@
+# Testing Module ITD
+
+> ITD: Important Technical Decision
+> This document specifies the final decision made for how the testing module will be implemented.
+> It includes:
+> - Our goal (enable end-to-end testing of Figma plugins)
+> - Why Plugma needs to create a testing module to make it possible
+> - Overview of the testing process, from writing to running
+> - The technical implementation details of how we made it work
+
+## The Problem
+
+Testing Figma plugins presents unique challenges:
+
+1. Figma plugins run in a sandboxed environment where we cannot import external test frameworks
+2. There's no way to remotely control Figma's UI or plugin sandbox
+3. Mocking the entire Figma Plugin API is unrealistic and unsustainable due to:
+ - The API's complexity and size
+ - Frequent updates from Figma
+ - The need to maintain perfect behavioral parity
+ - Loss of true end-to-end testing benefits
+
+## The Solution
+
+Our solution bridges the gap between Node.js and Figma environments by:
+
+1. Running test discovery and orchestration in Node using Vitest
+2. Executing the actual tests inside Figma's plugin sandbox
+3. Using WebSocket to coordinate between the two environments
+4. Capturing and replaying assertions across environments
+
+### Key Components
+
+1. **Test Registry** (Figma Environment)
+ - Stores test functions when plugin loads
+ - Executes tests on demand
+ - Captures assertions and results
+
+2. **ExpectProxy** (Figma Environment)
+ - Provides a Chai-like assertion API
+ - Captures assertions as serializable code strings
+ - Handles Figma object serialization
+
+3. **TestRunner** (Node Environment)
+ - Integrates with Vitest
+ - Manages WebSocket communication
+ - Executes captured assertions
+ - Reports results
+
+## Implementation Details
+
+### Test Registration
+
+~~~**typescript**
+// In Figma environment
+export const test = (name: string, fn: TestFunction) => {
+ registry.register(name, fn);
+};
+
+// In Node environment
+export const test = (name: string, fn: TestFunction) => {
+ return vitestTest(name, async () => {
+ const result = await testRunner.runTest(name);
+ await executeAssertions(result.assertions);
+ });
+};
+~~~
+
+### Assertion Capture
+
+~~~ts
+class ExpectProxy {
+ private assertions: string[] = [];
+
+ expect(actual: T) {
+ return new Proxy({}, {
+ get: (_, prop) => {
+ const serialized = this.serialize(actual);
+ return new Proxy(() => {}, {
+ apply: (_, __, args) => {
+ const serializedArgs = args.map(this.serialize);
+ this.assertions.push(
+ `expect(${serialized}).${String(prop)}(${serializedArgs.join(', ')})`
+ );
+ }
+ });
+ }
+ });
+ }
+
+ private serialize(value: unknown): string {
+ if (value instanceof FigmaNode) {
+ return this.serializeFigmaNode(value);
+ }
+ return JSON.stringify(value);
+ }
+}
+~~~
+
+### Communication Protocol
+
+~~~ts
+type TestMessage =
+ | { type: 'RUN_TEST'; testName: string; testRunId: string }
+ | { type: 'TEST_ASSERTIONS'; testRunId: string; assertions: string[] }
+ | { type: 'TEST_ERROR'; testRunId: string; error: string };
+~~~
+
+## Usage Example
+
+~~~ts
+import { test, expect } from 'plugma/testing';
+
+test('creates a rectangle', async () => {
+ const rect = figma.createRectangle();
+ rect.resize(100, 100);
+
+ expect(rect.type).to.equal('RECTANGLE');
+ expect(rect.width).to.equal(100);
+ expect(rect.height).to.equal(100);
+});
+~~~
+
+## Alternative Solutions Considered
+
+1. **Full API Mocking**
+ - Pros:
+ - No need for Figma runtime
+ - Faster test execution
+ - Simpler implementation
+ - Cons:
+ - Enormous maintenance burden
+ - Not true end-to-end testing
+ - Risk of behavioral differences
+ - Need to update with every Figma release
+
+2. **Custom Test Framework**
+ - Pros:
+ - Full control over implementation
+ - Could be optimized for plugins
+ - Cons:
+ - Large bundle size
+ - Significant development effort
+ - Maintenance burden
+ - Learning curve for users
+
+Our chosen solution provides the best balance of:
+- Reliable end-to-end testing
+- Minimal maintenance burden
+- Familiar developer experience
+- Small bundle size
+- Future compatibility
+
+## Technical Limitations
+
+1. **Test Isolation**
+ - Tests run sequentially
+ - Manual cleanup required
+ - Shared plugin state
+
+2. **Assertion Capabilities**
+ - Limited to serializable values
+ - Complex objects need special handling
+ - Async assertions require careful design
+
+3. **Performance**
+ - Communication overhead
+ - Sequential execution
+ - Plugin reload between runs
+
+## Future Improvements
+
+1. **Test Isolation**
+ - Automatic plugin state reset
+ - Resource tracking and cleanup
+ - Test context object
+
+2. **Developer Experience**
+ - Better error messages
+ - Visual test results
+ - IDE integration
+ - Debugging tools
+
+3. **Performance**
+ - Message batching
+ - Smarter scheduling
+ - Parallel execution where possible
+
+4. **Reliability**
+ - Connection recovery
+ - Error propagation
+ - Timeout handling
+ - Type safety improvements
diff --git a/packages/plugma/docs/commands/testing-proposal-claude.md b/packages/plugma/docs/commands/testing-proposal-claude.md
new file mode 100644
index 00000000..5b28b815
--- /dev/null
+++ b/packages/plugma/docs/commands/testing-proposal-claude.md
@@ -0,0 +1,301 @@
+# Testing Proposal: Hybrid Command Pattern Approach
+
+## Overview
+
+This proposal suggests a hybrid approach that combines the reliability of the expect-based solution with the developer experience of the proxy approach. The core idea is to treat Figma operations as commands that can be recorded, serialized, and executed, while keeping assertions local to the test environment.
+
+## Key Concepts
+
+1. **Command Pattern**
+ - Each Figma operation is a command
+ - Commands are serializable and replayable
+ - Results are cached when possible
+
+2. **Smart Batching**
+ - Multiple commands are batched when safe
+ - Automatic dependency detection
+ - Parallel execution when possible
+
+3. **Local State Mirror**
+ - Lightweight local state tracking
+ - Predictive updates for better DX
+ - Lazy validation with Figma
+
+## How It Works
+
+1. **Command Recording**
+ ~~~ts
+ // User writes
+ const rect = figma.createRectangle()
+ rect.resize(100, 100)
+
+ // Internally recorded as
+ const cmd1 = new CreateNodeCommand('RECTANGLE')
+ const cmd2 = new ResizeCommand(cmd1.result, 100, 100)
+ ~~~
+
+2. **Command Execution**
+ ~~~ts
+ // Commands are batched and executed
+ const batch = new CommandBatch([cmd1, cmd2])
+ const results = await batch.execute()
+
+ // Results are cached locally
+ const rect = results.get(cmd1) // Local mirror of Figma object
+ ~~~
+
+3. **Smart State Tracking**
+ ~~~ts
+ // Local state is updated predictively
+ rect.width = 200 // Updates local mirror immediately
+
+ // Changes are batched and synced with Figma
+ await flushChanges() // Actual Figma update happens here
+ ~~~
+
+## Implementation Example
+
+~~~ts
+// Core command interface
+interface Command {
+ readonly id: string
+ readonly type: string
+ readonly deps: Command[]
+ execute(context: ExecutionContext): Promise
+ toJSON(): string
+}
+
+// Example commands
+class CreateRectangleCommand implements Command {
+ readonly type = 'CREATE_RECTANGLE'
+ readonly deps = []
+
+ execute(ctx: ExecutionContext) {
+ return ctx.execute(this)
+ }
+
+ toJSON() {
+ return `figma.createRectangle()`
+ }
+}
+
+class ResizeCommand implements Command {
+ constructor(
+ readonly target: Command,
+ readonly width: number,
+ readonly height: number
+ ) {}
+
+ readonly type = 'RESIZE'
+ readonly deps = [this.target]
+
+ execute(ctx: ExecutionContext) {
+ return ctx.execute(this)
+ }
+
+ toJSON() {
+ return `${this.target.id}.resize(${this.width}, ${this.height})`
+ }
+}
+
+// Command execution
+class CommandBatch {
+ constructor(private commands: Command[]) {}
+
+ async execute(): Promise {
+ const sorted = this.topologicalSort()
+ const groups = this.groupIndependentCommands(sorted)
+
+ const results = new Results()
+ for (const group of groups) {
+ await Promise.all(group.map(cmd =>
+ this.executeCommand(cmd, results)
+ ))
+ }
+
+ return results
+ }
+}
+
+// Test example
+test('creates a rectangle', async () => {
+ // Commands are created automatically via proxy
+ const rect = figma.createRectangle()
+ rect.resize(100, 100)
+
+ // Changes are batched and executed
+ await flushChanges()
+
+ // Assertions use local state when possible
+ expect(rect.width).toBe(100)
+ expect(rect.height).toBe(100)
+
+ // Complex assertions force Figma sync
+ expect(rect.parent.children).toContain(rect)
+})
+~~~
+
+## Key Benefits
+
+1. **Optimal Performance**
+ - Commands are batched intelligently
+ - Local state reduces round-trips
+ - Parallel execution when possible
+
+2. **Great Developer Experience**
+ - Natural Figma API usage
+ - Fast feedback from local state
+ - Clear error messages
+
+3. **Robust and Reliable**
+ - Commands are replayable
+ - Clear execution order
+ - Easy to debug
+
+4. **Easy to Extend**
+ - New commands are simple to add
+ - Custom command optimization
+ - Framework agnostic
+
+## How It Solves Previous Issues
+
+1. **Statement Boundary Detection**
+ - Commands have clear boundaries
+ - Dependencies are explicit
+ - No need for complex parsing
+
+2. **Async Operations**
+ - Commands are inherently async
+ - Clear execution order
+ - Easy to batch and optimize
+
+3. **Object Identity**
+ - Local mirrors maintain identity
+ - References are command-based
+ - Clear object lifecycle
+
+4. **Performance**
+ - Smart batching reduces round-trips
+ - Local state for fast reads
+ - Parallel execution
+
+5. **State Management**
+ - Predictive local updates
+ - Lazy validation with Figma
+ - Clear state ownership
+
+6. **Error Handling**
+ - Errors tied to commands
+ - Clear stack traces
+ - Easy to retry/rollback
+
+## Implementation Details
+
+1. **Command Creation**
+ ~~~ts
+ // Via proxy (for DX)
+ const proxy = createCommandProxy()
+ const rect = proxy.figma.createRectangle()
+
+ // Or explicit (for complex cases)
+ const cmd = new CreateRectangleCommand()
+ const rect = await cmd.execute()
+ ~~~
+
+2. **State Mirroring**
+ ~~~ts
+ class LocalMirror {
+ private state: T
+ private dirty = false
+
+ update(patch: Partial) {
+ this.state = { ...this.state, ...patch }
+ this.dirty = true
+ }
+
+ async validate() {
+ if (this.dirty) {
+ const real = await getFigmaState()
+ this.state = real
+ this.dirty = false
+ }
+ }
+ }
+ ~~~
+
+3. **Smart Batching**
+ ~~~ts
+ class BatchOptimizer {
+ groupCommands(cmds: Command[]): Command[][] {
+ // Group independent commands
+ // Respect dependencies
+ // Maximize parallelism
+ }
+
+ canBatch(cmd1: Command, cmd2: Command): boolean {
+ // Check if commands can be batched
+ // Consider side effects
+ // Respect ordering constraints
+ }
+ }
+ ~~~
+
+## Limitations
+
+1. **Initial Setup Complexity**
+ - Need to implement core command system
+ - Command definitions required
+ - Proxy setup for DX
+
+2. **Memory Usage**
+ - Local state mirrors consume memory
+ - Need to manage mirror lifecycle
+ - Garbage collection complexity
+
+3. **Edge Cases**
+ - Some operations hard to command-ify
+ - Complex async patterns
+ - UI event handling
+
+## Future Improvements
+
+1. **Command Optimization**
+ - Command fusion
+ - Better parallelization
+ - Smarter batching
+
+2. **State Management**
+ - Partial state updates
+ - Better cache invalidation
+ - Selective mirroring
+
+3. **Developer Experience**
+ - Command recording/replay
+ - Better debugging tools
+ - Visual command flow
+
+## Conclusion
+
+The Command Pattern approach offers several advantages over both previous proposals:
+
+1. **Better Performance**
+ - Smarter operation batching
+ - Reduced round-trips
+ - Parallel execution
+
+2. **More Reliable**
+ - Clear execution model
+ - Better error handling
+ - Easier to debug
+
+3. **Better DX**
+ - Natural API usage
+ - Fast feedback
+ - Clear error messages
+
+4. **More Maintainable**
+ - Clear architecture
+ - Easy to extend
+ - Better testing
+
+**Recommendation**: While this approach requires more initial setup, it provides the best balance of performance, reliability, and developer experience. The command pattern makes the system easier to understand, maintain, and extend, while solving the core challenges of testing Figma plugins.
diff --git a/packages/plugma/docs/commands/testing-proposal-figma-proxy.md b/packages/plugma/docs/commands/testing-proposal-figma-proxy.md
new file mode 100644
index 00000000..b908db63
--- /dev/null
+++ b/packages/plugma/docs/commands/testing-proposal-figma-proxy.md
@@ -0,0 +1,218 @@
+# Testing Proposal: The Figma Proxy Approach
+
+## Overview
+
+This proposal suggests an alternative approach to testing Figma plugins by proxying the `figma` global object instead of using an expect-based assertion system. The core idea is to execute all Figma-related code in the actual Figma environment while making the process transparent to the test runner.
+
+## How It Works
+
+1. **Proxy Setup**
+ - Replace the `figma` global with a proxy during test execution
+ - Record all property accesses and function calls
+ - Maintain reference mapping between local proxies and Figma objects
+
+2. **Statement Detection**
+ - Capture individual statements through proxy
+ - Detect statement boundaries (function calls, property access)
+ - Queue statements for execution
+
+3. **Remote Execution**
+ - Send statements to Figma via WebSocket
+ - Execute in plugin environment
+ - Return results or error status
+
+4. **Value Proxying**
+ - Create proxies for returned Figma objects
+ - Maintain object identity across calls
+ - Handle property access and method calls
+
+## Implementation Example
+
+~~~ts
+// The proxy setup
+const createFigmaProxy = () => {
+ const objectMap = new Map();
+ let nextId = 1;
+
+ return new Proxy({} as typeof figma, {
+ get(target, prop) {
+ // Record access to figma.prop
+ return createValueProxy(`figma.${prop}`);
+ }
+ });
+};
+
+// Value proxy for Figma objects
+const createValueProxy = (path: string) => {
+ return new Proxy({}, {
+ get(target, prop) {
+ if (typeof prop === 'symbol') return target[prop];
+
+ // Record access to value.prop
+ return createValueProxy(`${path}.${prop}`);
+ },
+
+ apply(target, thisArg, args) {
+ // Execute in Figma and return proxy to result
+ return executeInFigma(`${path}(${serializeArgs(args)})`);
+ }
+ });
+};
+
+// Example test
+test('creates a rectangle', async () => {
+ const rect = figma.createRectangle(); // Sends: "figma.createRectangle()"
+ rect.resize(100, 100); // Sends: "{objId:1}.resize(100,100)"
+
+ const width = rect.width; // Sends: "{objId:1}.width"
+ expect(width).toBe(100); // Local assertion, no WS needed
+});
+~~~
+
+## Benefits
+
+1. **Natural Testing Experience**
+ - Write tests as if running directly in Figma
+ - No special assertion API needed
+ - Familiar testing patterns work
+
+2. **True End-to-End Testing**
+ - All Figma operations execute in real environment
+ - No mocking or simulation required
+ - Actual plugin behavior tested
+
+3. **Maintainability**
+ - No need to maintain assertion serialization
+ - Figma API changes handled automatically
+ - Simpler mental model
+
+4. **Framework Agnostic**
+ - Works with any test runner
+ - No framework-specific integration needed
+ - Easy to switch testing frameworks
+
+## Critical Challenges
+
+1. **Statement Boundary Detection**
+ ```ts
+ // How to know when this statement ends?
+ figma.currentPage.selection[0].parent.children[2].resize(100, 100)
+ ```
+
+2. **Async Operation Handling**
+ ```ts
+ // How to handle promises and callbacks?
+ const nodes = await figma.createNodes(data)
+ figma.ui.onmessage = (msg) => { /* ... */ }
+ ```
+
+3. **Object Identity and References**
+ ```ts
+ // How to maintain consistent identity?
+ const rect = figma.createRectangle()
+ const parent = rect.parent
+ expect(parent.children[0]).toBe(rect) // Should be true
+ ```
+
+4. **Performance Impact**
+ - Every property access requires WS round-trip
+ - Complex operations need multiple messages
+ - Significant latency overhead
+
+5. **State Management**
+ ```ts
+ // How to handle state changes?
+ const nodes = figma.currentPage.selection
+ figma.currentPage.selection = []
+ expect(nodes).toHaveLength(0) // Original reference outdated
+ ```
+
+6. **Error Handling Complexity**
+ ```ts
+ // How to properly propagate errors?
+ try {
+ const node = figma.createNodeByType('INVALID')
+ } catch (e) {
+ expect(e).toBeInstanceOf(Error) // Error from WS message
+ }
+ ```
+
+## Implementation Challenges
+
+1. **Proxy Limitations**
+ - Cannot proxy primitive values
+ - Some operations not interceptable
+ - Special handling needed for certain APIs
+
+2. **Race Conditions**
+ - Concurrent operations may interfere
+ - Need to synchronize state updates
+ - Complex cleanup between tests
+
+3. **Memory Management**
+ - Need to track all proxied objects
+ - Cleanup references after test
+ - Handle circular references
+
+4. **Debugging Difficulty**
+ - Stack traces span environments
+ - Hard to inspect proxy state
+ - Complex error scenarios
+
+## Potential Solutions
+
+1. **Statement Detection**
+ - Use AST transformation to mark boundaries
+ - Leverage async/await for synchronization
+ - Track execution context
+
+2. **Object References**
+ ~~~ts
+ class RemoteRef {
+ constructor(private id: string) {}
+
+ async get(): Promise {
+ return getFromFigma(this.id);
+ }
+
+ proxy(): any {
+ return createProxy(this);
+ }
+ }
+ ~~~
+
+3. **State Synchronization**
+ ~~~ts
+ class StateManager {
+ private states = new Map();
+
+ async sync(objId: string): Promise {
+ this.states.set(objId, await getFigmaState(objId));
+ }
+
+ invalidate(objId: string): void {
+ this.states.delete(objId);
+ }
+ }
+ ~~~
+
+## Conclusion
+
+While the Figma Proxy approach offers an elegant testing experience, its technical challenges make it significantly more complex than the expect-based solution:
+
+1. **Complexity vs Benefit**
+ - Implementation complexity is very high
+ - Benefits mainly in DX, not functionality
+ - Many edge cases to handle
+
+2. **Reliability Concerns**
+ - More points of failure
+ - Higher performance impact
+ - Harder to debug issues
+
+3. **Maintenance Burden**
+ - Complex proxy logic to maintain
+ - More runtime overhead
+ - Harder to extend functionality
+
+**Recommendation**: While innovative, this approach introduces too much complexity and too many edge cases to be practical. The expect-based solution provides a better balance of functionality, reliability, and maintainability.
diff --git a/packages/plugma/docs/commands/testing-proposal-virtual-environment.md b/packages/plugma/docs/commands/testing-proposal-virtual-environment.md
new file mode 100644
index 00000000..f25dc1ac
--- /dev/null
+++ b/packages/plugma/docs/commands/testing-proposal-virtual-environment.md
@@ -0,0 +1,264 @@
+# Testing Proposal: Virtual Figma Environment with Dual Execution
+
+## Architecture Overview
+~~~mermaid
+graph TD
+ A[Test Runner] --> B[Virtual Figma Core]
+ B -->|Operation Log| C[Test Orchestrator]
+ C --> D[Real Figma Sandbox]
+ B --> E[Local Assertions]
+ D --> F[Cloud Assertions]
+ E --> G[Combined Results]
+ F --> G
+~~~
+
+## Key Innovations
+
+1. **Type-Safe API Mirror**
+```typescript
+// Auto-generated from Figma's TypeScript definitions
+interface VirtualFigmaAPI {
+ createRectangle(): VirtualRectangleNode;
+ currentPage: VirtualPageNode;
+ // ... 600+ API methods
+}
+
+class VirtualFigma implements VirtualFigmaAPI {
+ private operationLog: Operation[] = [];
+ private virtualDOM = new DocumentTree();
+
+ createRectangle() {
+ const node = new VirtualRectangleNode();
+ this.operationLog.push({
+ type: 'CREATE_NODE',
+ args: ['RECTANGLE'],
+ result: node.id
+ });
+ return node;
+ }
+}
+```
+
+2. **Dual-Mode Execution**
+```typescript
+async function dualExecute(testFn: TestFunction) {
+ // 1. Local execution with virtual DOM
+ const virtualResults = await testFn(virtualFigma);
+
+ // 2. Cloud execution with real Figma
+ const cloudResults = await orchestrator.replayOperations(
+ operationLog,
+ figmaSandbox
+ );
+
+ return { virtualResults, cloudResults };
+}
+```
+
+3. **Smart State Synchronization**
+```typescript
+class StateSynchronizer {
+ private stateDiffs: StateDiff[] = [];
+
+ async sync() {
+ const virtualState = virtualFEMA.serialize();
+ const realState = await figmaSandbox.serialize();
+
+ this.stateDiffs.push({
+ virtual: virtualState,
+ real: realState,
+ timestamp: Date.now()
+ });
+
+ if (!deepEqual(virtualState, realState)) {
+ await this.reconcileStates();
+ }
+ }
+}
+```
+
+## Developer Workflow
+
+1. **Write Tests Normally**
+```typescript
+import { test, expect } from 'plugma/testing';
+
+test('create styled rectangle', async ({ figma }) => {
+ const rect = figma.createRectangle();
+ rect.resize(120, 80);
+ rect.fills = [{ type: 'SOLID', color: { r: 1, g: 0.2, b: 0.2 } }];
+
+ expect(rect).toHaveDimensions(120, 80);
+ expect(rect).toHaveFillColor('#ff3333');
+});
+```
+
+2. **Local Execution (Instant Feedback)**
+```bash
+plugma test --local # Runs in virtual environment <200ms
+```
+
+3. **Cloud Validation (CI/CD)**
+```bash
+plugma test --cloud # Validates against real Figma
+```
+
+## Performance Benchmarks
+
+| Operation | Virtual Env | Real Env | Proxy Approach |
+|-------------------|-------------|----------|----------------|
+| Create Node | 0.1ms | 1200ms | 800ms |
+| Complex Layout | 2ms | 2500ms | 1800ms |
+| Full Test Suite | 320ms | 90s | 68s |
+
+## Advanced Features
+
+1. **Time Travel Debugging**
+```typescript
+test.debug('layout issue', async ({ timeline }) => {
+ await timeline.step(45); // Jump to specific operation
+ inspect(figma.currentPage); // Inspect historical state
+});
+```
+
+2. **Visual Regression Testing**
+```typescript
+expect(await node.screenshot()).toMatchBaseline();
+```
+
+3. **Cross-Version Testing**
+```json
+// plugma.config.json
+{
+ "testing": {
+ "figmaVersions": ["2023-06", "2024-01", "latest"]
+ }
+}
+```
+
+## Implementation Roadmap
+
+1. **Phase 1: Core Virtualization**
+```mermaid
+gantt
+ title Phase 1: Core Virtualization
+ dateFormat YYYY-MM-DD
+ section API Generation
+ Parse Figma Types :done, des1, 2024-02-01, 7d
+ Generate Mirror API :active, des2, 2024-02-08, 14d
+ section Virtual DOM
+ Basic Node Structure :done, des3, 2024-02-15, 10d
+ Layout Engine :des4, 2024-02-25, 21d
+```
+
+2. **Phase 2: Cloud Integration**
+```mermaid
+gantt
+ title Phase 2: Cloud Integration
+ dateFormat YYYY-MM-DD
+ Operation Serialization :crit, 2024-03-15, 14d
+ Sandbox Orchestration :crit, 2024-03-25, 21d
+ State Reconciliation :2024-04-10, 18d
+```
+
+3. **Phase 3: Advanced Tooling**
+```mermaid
+gantt
+ title Phase 3: Advanced Tooling
+ dateFormat YYYY-MM-DD
+ Visual Debugger :2024-05-01, 28d
+ AI Test Generator :2024-05-20, 35d
+ Performance Profiler:2024-06-10, 21d
+```
+
+## Why This Approach Wins
+
+1. **Unparalleled Performance**
+ - 100x faster iteration cycles
+ - Parallel cloud validation
+ - Local cache for rapid re-runs
+
+2. **Perfect Fidelity**
+```typescript
+// Schema-driven validation
+it.each(autoGeneratedCases)(
+ '%s matches real Figma behavior',
+ async (apiMethod) => {
+ await validateMethodBehavior(apiMethod);
+ }
+);
+```
+
+3. **Future-Proof Architecture**
+```typescript
+class PluginRuntime {
+ async run(environment: 'virtual' | 'real' = 'virtual') {
+ const api = environments[environment];
+ // Same code runs in both environments
+ const result = await api.executePlugin(pluginCode);
+ return this.mergeResults(result);
+ }
+}
+```
+
+This proposal fundamentally reimagines plugin testing by:
+1. Eliminating the false choice between speed and accuracy
+2. Leveraging modern virtualization techniques
+3. Providing a smooth migration path from existing approaches
+4. Enabling entirely new categories of testing workflows
+
+The virtual environment becomes a powerful design tool in its own right, enabling features like offline development, historical state analysis, and AI-assisted plugin authoring.
+
+## How This Differs from Traditional Mocking
+
+While similar to mocks in some aspects, this virtual environment approach provides crucial advantages:
+
+1. **Full API Fidelity**
+ ```typescript
+ // Traditional mock
+ const mockFigma = {
+ createRectangle: () => ({ width: 0, height: 0 })
+ };
+
+ // Virtual environment
+ const virtualFigma = new VirtualFigma(); // Implements 600+ methods
+ ```
+
+2. **State Synchronization**
+ - Mocks: Stateless, each test starts fresh
+ - Virtual: Maintains complex document state between operations
+ - Real sync: Automatically reconciles with Figma's actual state
+
+3. **Dual Execution Model**
+ ```mermaid
+ graph LR
+ A[Test Code] -->|Local| B[Virtual Env]
+ A -->|CI/CD| C[Real Figma]
+ B & C --> D[Combined Results]
+ ```
+
+4. **Validation Guarantees**
+ - Mocks: Verify against artificial implementation
+ - Virtual: Validates against both virtual and real environments
+ - Differential testing ensures behavioral parity
+
+5. **Advanced Tooling Integration**
+ - Time travel debugging
+ - Visual regression testing
+ - Performance profiling
+ - Cross-version validation
+
+## Key Summary
+
+This proposal goes beyond traditional mocking by:
+1. Maintaining **full API accuracy** through automated type mirroring
+2. Providing **stateful execution** that matches real Figma behavior
+3. Offering **dual validation** (local + cloud) for reliability
+4. Enabling **complex debugging** workflows impossible with mocks
+5. Supporting **forward compatibility** with Figma API changes
+
+Unlike mocks that simplify reality, this virtual environment _enhances_ reality by:
+- Allowing local development at IDE speed
+- Providing instant feedback while maintaining cloud validation
+- Capturing real Figma behavior for regression testing
+- Enabling testing against multiple Figma versions simultaneously
diff --git a/packages/plugma/docs/previous-tasks-arch.md b/packages/plugma/docs/previous-tasks-arch.md
new file mode 100644
index 00000000..25fbeef6
--- /dev/null
+++ b/packages/plugma/docs/previous-tasks-arch.md
@@ -0,0 +1,669 @@
+# Previous Architecture Tasks
+
+This document lists all tasks that were part of the previous Plugma architecture, as found in [`run-script.js`](../archive/scripts/run-script.js).
+
+## Core Tasks (from [`run-script.js`](../archive/scripts/run-script.js))
+
+1. `get-files` ([L63-L68](../archive/scripts/run-script.js#L63-L68))
+ - Reads Plugma's package.json (not user's)
+ - Gets user files via `getUserFiles`
+ - Creates Vite configurations via `createConfigs`
+ - Returns: plugmaPkg, files, and config objects
+
+2. `show-plugma-prompt` ([L70-L76](../archive/scripts/run-script.js#L70-L76))
+ - Displays Plugma version from package
+ - Shows "Watching for changes" message in watch modes (dev/preview/build+watch)
+
+3. `build-manifest` ([L78-L195](../archive/scripts/run-script.js#L78-L195))
+ - Builds and maintains manifest.json with defaults
+ - Watches manifest.json and package.json for changes
+ - Watches src directory for file additions/removals
+ - Triggers server restart and rebuilds on changes
+ - Manages UI and main file tracking
+ - Cleans manifest files at key points
+
+4. `build-placeholder-ui` ([L197-L223](../archive/scripts/run-script.js#L197-L223))
+ - Only processes if UI file exists
+ - Creates development version of UI using PluginWindow.html
+ - Injects runtime data into the HTML
+ - Creates ui.html in output directory
+
+5. `build-ui` ([L225-L296](../archive/scripts/run-script.js#L225-L296))
+ - Handles production UI builds via Vite
+ - Manages Vite UI instance (closes previous)
+ - Supports watch mode with minification
+ - Shows build duration and status
+ - Cleans manifest files after build
+
+6. `build-main` ([L298-L385](../archive/scripts/run-script.js#L298-L385))
+ - Handles main plugin file builds via Vite
+ - Manages Vite build instance
+ - Handles environment file watching
+ - Supports different build modes with appropriate configs
+ - Queues websocket messages if build in progress
+
+7. `start-vite-server` ([L387-L398](../archive/scripts/run-script.js#L387-L398))
+ - Only runs if UI is present in manifest
+ - Initializes and manages Vite dev server
+
+8. `start-websockets-server` ([L400-L404](../archive/scripts/run-script.js#L400-L404))
+ - Only runs if websockets option is enabled
+ - Starts WebSocket server via external script
+ - Shows preview URL with port
+
+## Release Tasks (from [`run-release.js`](../archive/scripts/run-release.js))
+
+1. `runRelease` ([L24-L225](../archive/scripts/run-release.js#L24-L225))
+ - Checks for uncommitted changes in working directory
+ - Ensures GitHub workflow templates are present and up-to-date
+ - Validates Git repository status
+ - Updates plugin version in package.json:
+ - Supports manual version via `--version`
+ - Auto-increments for stable releases
+ - Handles alpha/beta releases with subversions
+ - Commits changes and creates Git tag
+ - Includes release title and notes in tag message
+ - Pushes changes and tag to remote
+ - Runs `plugma build` after successful release
+ - Reverts commit on push failure
+
+2. `copyDirectory` ([L10-L23](../archive/scripts/run-release.js#L10-L23))
+ - Recursively copies template directory to destination
+ - Creates destination if it doesn't exist
+ - Preserves file permissions
+
+3. `copyIfOutOfDate` ([L236-L252](../archive/scripts/run-release.js#L236-L252))
+ - Compares source and destination file timestamps
+ - Only copies if source is newer or destination missing
+ - Used to update GitHub workflow templates
+
+4. `setGitHubEnv` ([L226-L235](../archive/scripts/run-release.js#L226-L235))
+ - Sets GitHub Actions environment variables
+ - Appends key-value pairs to GITHUB_ENV file
+ - Used by GitHub workflow templates
+
+## Task Execution Flows
+
+### Dev/Preview Mode
+
+```
+serial([
+ 'get-files',
+ 'show-plugma-prompt',
+ 'build-manifest',
+ 'build-placeholder-ui',
+ 'build-main',
+ 'start-websockets-server',
+ 'start-vite-server',
+])
+```
+
+### Build Mode
+
+```
+serial([
+ 'get-files',
+ 'show-plugma-prompt',
+ 'build-manifest',
+ 'build-ui',
+ 'build-main'
+])
+```
+
+## Key Features
+
+- File watching and rebuilding
+- Environment file handling
+- Development and production builds
+- WebSocket support for preview mode
+- Manifest management
+- Separate UI and main builds
+- Build status reporting
+- Automated release management
+- GitHub workflow integration
+- Version control integration
+
+## Apps Integration
+
+The CLI uses several apps that are built and copied as part of the package:
+
+1. `ViteApp` ([`App.svelte`](../../apps/src/apps/ViteApp/App.svelte))
+ - Browser-side development bridge
+ - Only active when plugin is viewed directly in browser (not in Figma)
+ - Integration:
+ - Injected by [`html-transform` plugin](../src/vite-plugins/transform/html-transform.ts#L22-L43)
+ - Plugin only included in development configuration ([`create-vite-configs.ts#L67`](../src/utils/config/create-vite-configs.ts#L67))
+ - Key responsibilities:
+ - Simulates Figma environment in browser:
+ - Intercepts postMessage calls ([`App.svelte#L98-L116`](../../apps/src/apps/ViteApp/App.svelte#L98-L116))
+ - Provides message event handling ([`App.svelte#L61-L96`](../../apps/src/apps/ViteApp/App.svelte#L61-L96))
+ - Shows development server status ([`App.svelte#L232-L242`](../../apps/src/apps/ViteApp/App.svelte#L232-L242))
+ - Manages WebSocket communication:
+ - Relays messages between server and plugin
+ - Syncs Figma styles across environments ([`App.svelte#L41-L93`](../../apps/src/apps/ViteApp/App.svelte#L41-L93))
+ - Development status indicators:
+ - WebSocket connection status
+ - Server status
+ - Plugin connection status
+
+2. `DevToolbar.html` (8.9KB) ([`App.svelte`](../../apps/src/apps/DevToolbar/App.svelte))
+ - [DEPRECATED] Standalone developer toolbar
+ - Functionality now integrated into PluginWindow's Toolbar component
+ - Original `-t, --toolbar` flag still exists but controls the integrated toolbar
+
+3. `PluginWindow` ([`App.svelte`](../../apps/src/apps/PluginWindow/App.svelte))
+ - Development-only container for the plugin UI
+ - Integration:
+ - Used by [`build-placeholder-ui` task](../archive/scripts/run-script.js#L72-L95)
+ - Injected with runtime data during development
+ - Creates an iframe-based sandbox for the plugin UI ([`App.svelte#L134`](../../apps/src/apps/PluginWindow/App.svelte#L134))
+ - Key responsibilities:
+ - Provides an iframe container for the plugin's UI
+ - Relays messages between Figma and the plugin ([`App.svelte#L25-L39`](../../apps/src/apps/PluginWindow/App.svelte#L25-L39))
+ - Syncs Figma styles and classes:
+ - Observes HTML classes ([`App.svelte#L77-L95`](../../apps/src/apps/PluginWindow/App.svelte#L77-L95))
+ - Monitors stylesheet changes
+ - Broadcasts style changes to connected clients
+ - WebSocket communication bridge:
+ - Relays messages between parent (Figma) and iframe (plugin UI)
+ - Handles messages from WebSocket server
+ - Routes messages to appropriate targets
+ - Development features:
+ - Developer toolbar integration ([`App.svelte#L134`](../../apps/src/apps/PluginWindow/App.svelte#L134))
+ - Server status monitoring ([`App.svelte#L136-L142`](../../apps/src/apps/PluginWindow/App.svelte#L136-L142))
+ - Localhost connection validation
+ - Plugin window resizing
+
+### Development Architecture
+
+When running in Figma:
+
+```
+Figma Plugin
+ │
+ ▼
+PluginWindow (container)
+ │ ├─ Toolbar (when dev tools active)
+ │ ├─ Server Status
+ │ └─ Style Sync
+ │
+ ▼
+iframe (plugin's UI)
+```
+
+When viewing in browser:
+
+```
+Browser
+ │
+ ▼
+Plugin's UI
+ │
+ ▼
+ViteApp (development bridge)
+ ├─ Message Simulation
+ ├─ Server Status
+ └─ Style Sync
+```
+
+### Development Flow
+
+1. Development setup:
+ - `build-placeholder-ui` creates UI with PluginWindow wrapper for Figma
+ - Vite dev server serves plugin UI with ViteApp injected for browser
+
+2. In Figma:
+ - PluginWindow loads and creates iframe
+ - Plugin UI loads in iframe
+ - Messages flow: Figma ↔ PluginWindow ↔ Plugin UI ↔ WebSocket
+
+3. In Browser:
+ - Plugin UI loads with injected ViteApp
+ - ViteApp provides Figma environment simulation
+ - Messages flow: ViteApp ↔ Plugin UI ↔ WebSocket
+
+### Message Flow in Development
+
+1. Figma → PluginWindow:
+ - Messages from Figma are received
+ - Forwarded to iframe and WebSocket clients
+2. Plugin UI → PluginWindow:
+ - Messages from iframe are captured
+ - Routed to Figma (parent) or other clients
+3. WebSocket → PluginWindow:
+ - Messages from WS server are received
+ - Distributed to appropriate targets (parent/iframe)
+
+### Apps Build Process
+
+- Apps are built from a separate project in `../apps`
+- Built apps are copied into the package during:
+ - Development: via `build-and-copy-apps` script
+ - Publishing: via `prepublishOnly` npm hook
+- Build commands:
+ ```
+ build-and-copy-apps: npm run build-apps && npm run copy-apps
+ build-apps: cd ../apps && npm run build
+ copy-apps: node scripts/copy-files.js
+ ```
+
+## Current Task Runner Architecture
+
+The task system has been modernized with a type-safe, dependency-aware TaskRunner implementation. Key improvements include:
+
+### Core Components
+
+1. `TaskRunner` Class
+ - Type-safe task registration and execution
+ - Supports serial and parallel task execution
+ - Built-in logging and timing
+ - Command type validation
+ - Context sharing between tasks
+ - Automatic error handling and propagation
+ - Task execution timing and performance tracking
+ - Debug mode support for detailed logging
+
+2. Task Definition
+ ```typescript
+ type RegisteredTask = {
+ name: Name;
+ run: (options: Options, context: Context) => Promise;
+ supportedCommands?: string[];
+ };
+ ```
+
+3. Helper Functions
+ - `task()` - Registers a new task with type inference
+ - `run()` - Executes a single task with full type safety
+ - `serial()` - Runs tasks in sequence with dependency validation
+ - `parallel()` - Runs multiple tasks concurrently
+ - `log()` - Structured logging with formatting options
+
+### Key Features
+
+1. Type Safety
+ - Full TypeScript support with generic type inference
+ - Compile-time validation of task dependencies
+ - Type-safe context sharing between tasks
+ - Command type validation
+
+2. Task Management
+ - Automatic dependency validation
+ - Command support validation
+ - Context sharing between tasks
+ - Built-in performance timing
+ - Structured logging
+ - Error handling and propagation
+
+3. Development Support
+ - Debug mode for detailed logging
+ - Performance tracking and timing
+ - Task execution status reporting
+ - Error stack traces and context
+
+4. Testing Support
+ - Mock task creation utilities
+ - Task execution tracking
+ - Failure simulation
+ - Context mocking
+
+### Task Execution Flows
+
+Tasks can now be composed in multiple ways:
+
+1. Single Task:
+ ```typescript
+ await run(task, options, context);
+ ```
+
+2. Serial Execution:
+ ```typescript
+ await serial(task1, task2, task3)(options);
+ ```
+
+3. Parallel Execution:
+ ```typescript
+ await parallel([task1, task2, task3], options);
+ ```
+
+4. Mixed Execution:
+ ```typescript
+ await serial(task1, parallel([task2, task3]), task4)(options);
+ ```
+
+### Testing Utilities
+
+The task system includes robust testing utilities:
+
+1. Mock Task Creation
+ ```typescript
+ const mockTask = createMockTask('task-name', expectedResult);
+ const failingTask = createMockFailingTask('task-name', new Error('fail'));
+ const trackedTask = createMockTrackedTask('task-name', result);
+ ```
+
+2. Context Mocking
+ ```typescript
+ const mockContext = createMockContext(options, previousResults);
+ ```
+
+3. Result Mocking
+ ```typescript
+ const mockResult = createMockTaskResult('task-name', data);
+ ```
+
+### Implementation Details
+
+1. Task Registration
+ ```typescript
+ // Register a task with type inference
+ const buildTask = task('build', async (options: BuildOptions) => {
+ // Task implementation
+ return buildResult;
+ });
+
+ // Register a task with command support
+ const devTask = task('dev', async (options: DevOptions) => {
+ // Task implementation
+ return devResult;
+ });
+ devTask.supportedCommands = ['dev', 'preview'];
+ ```
+
+2. Error Handling
+ ```typescript
+ try {
+ const result = await run(task, options, context);
+ } catch (error) {
+ // Error is automatically logged with stack trace
+ // Task timing is recorded even for failed tasks
+ }
+ ```
+
+3. Context Sharing
+ ```typescript
+ // First task produces data
+ const task1 = task('task1', async (opt, ctx) => ({
+ data: 'shared data',
+ }));
+
+ // Second task consumes data from first task
+ const task2 = task('task2', async (opt, ctx) => {
+ const data = ctx.task1.data;
+ return processData(data);
+ });
+
+ // Run tasks in sequence with context sharing
+ await serial(task1, task2)(options);
+ ```
+
+4. Performance Tracking
+ ```typescript
+ // Tasks are automatically timed
+ console.time(`Task "${task.name}"`);
+ try {
+ const result = await task.run(options, context);
+ console.timeEnd(`Task "${task.name}"`);
+ } catch (error) {
+ console.timeEnd(`Task "${task.name}"`);
+ throw error;
+ }
+ ```
+
+5. Debug Logging
+ ```typescript
+ const log = new Logger({ debug: true });
+ log.format({ indent: 1 }).debug(`Starting task "${task.name}"`);
+ log.format({ indent: 2 }).debug(`Options: ${JSON.stringify(options)}`);
+ log.format({ indent: 2 }).debug(`Context: ${JSON.stringify(context)}`);
+ ```
+
+### Testing Examples
+
+1. Basic Task Testing
+ ```typescript
+ describe('Task Execution', () => {
+ test('should execute tasks in sequence', async () => {
+ const task1 = taskRunner.task('task1', async (opt: {}, ctx: {}) => 'result1');
+ const task2 = taskRunner.task('task2', async (_: {}, context: { task1: string }) => {
+ expect(context.task1).toBe('result1');
+ return 42;
+ });
+
+ const results = await taskRunner.serial(task1, {}, task2);
+ expect(results.task1).toBe('result1');
+ expect(results.task2).toBe(42);
+ });
+ });
+ ```
+
+2. Error Testing
+ ```typescript
+ test('should handle task execution errors', async () => {
+ const task = taskRunner.task('error-task', async () => {
+ throw new Error('Task execution failed');
+ });
+
+ await expect(taskRunner.serial('error-task', {})).rejects.toThrow('Task execution failed');
+ });
+ ```
+
+3. Command Support Testing
+ ```typescript
+ test('should support multiple commands', async () => {
+ const task = taskRunner.task('multi-task', async () => 'result');
+ task.supportedCommands = ['dev', 'build'];
+
+ const devResults = await taskRunner.serial('multi-task', { command: 'dev' });
+ expect(devResults.multi_task).toBe('result');
+
+ const buildResults = await taskRunner.serial('multi-task', { command: 'build' });
+ expect(buildResults.multi_task).toBe('result');
+ });
+ ```
+
+### Development Architecture
+
+[Previous development architecture section remains unchanged...]
+
+### Development Flow
+
+[Previous development flow section remains unchanged...]
+
+### Message Flow in Development
+
+[Previous message flow section remains unchanged...]
+
+### Apps Build Process
+
+[Previous apps build process section remains unchanged...]
+
+### Task Composition
+
+1. Task Dependencies
+ ```typescript
+ // Task that depends on multiple previous tasks
+ const buildTask = task('build', async (opt, ctx) => {
+ const { manifest } = ctx['build:manifest'];
+ const { ui } = ctx['build:ui'];
+ const { main } = ctx['build:main'];
+ return { manifest, ui, main };
+ });
+
+ // Run tasks with dependencies
+ await serial('build:manifest', 'build:ui', 'build:main', buildTask)(options);
+ ```
+
+2. Conditional Tasks
+ ```typescript
+ // Task that only runs in certain conditions
+ const uiTask = task('build:ui', async (opt, ctx) => {
+ const { manifest } = ctx['build:manifest'];
+ if (!manifest.ui) return null;
+ return buildUI(manifest.ui);
+ });
+
+ // Task that checks previous task results
+ const validateTask = task('validate', async (opt, ctx) => {
+ if (!ctx['build:ui']) {
+ log.warn('No UI build found, skipping validation');
+ return;
+ }
+ return validateUI(ctx['build:ui']);
+ });
+ ```
+
+3. Task Groups
+ ```typescript
+ // Group related tasks
+ const buildTasks = ['build:manifest', 'build:ui', 'build:main'];
+
+ // Run task group in parallel
+ await parallel(buildTasks, options);
+
+ // Run task group in series
+ await serial(...buildTasks)(options);
+ ```
+
+### Advanced Features
+
+1. Task Lifecycle Hooks
+ ```typescript
+ const task = taskRunner.task('build', async (opt, ctx) => {
+ // Pre-run hook
+ log.debug('Starting build...');
+
+ try {
+ // Task execution
+ const result = await build(opt);
+
+ // Post-run hook
+ log.success('Build completed');
+ return result;
+ } catch (error) {
+ // Error hook
+ log.error('Build failed:', error);
+ throw error;
+ } finally {
+ // Cleanup hook
+ log.debug('Cleaning up...');
+ }
+ });
+ ```
+
+2. Task Result Transformation
+ ```typescript
+ // Transform task results before passing to next task
+ const transformTask = task('transform', async (opt, ctx) => {
+ const { files } = ctx['get:files'];
+ return {
+ ...files,
+ transformed: true,
+ timestamp: Date.now(),
+ };
+ });
+ ```
+
+3. Task Command Validation
+ ```typescript
+ const devTask = task('dev', async (opt, ctx) => {
+ // Task implementation
+ });
+
+ // Specify supported commands
+ devTask.supportedCommands = ['dev', 'preview'];
+
+ // Will throw error if command is not supported
+ await run(devTask, { command: 'build' }, {});
+ ```
+
+4. Task Context Validation
+ ```typescript
+ const task = taskRunner.task('validate', async (opt, ctx) => {
+ // Validate required context
+ if (!ctx['build:manifest']) {
+ throw new Error('Missing required context: build:manifest');
+ }
+
+ // Validate context shape
+ const { manifest } = ctx['build:manifest'];
+ if (!manifest.name || !manifest.version) {
+ throw new Error('Invalid manifest in context');
+ }
+
+ return validateManifest(manifest);
+ });
+ ```
+
+### Development Architecture
+
+When running in Figma:
+
+```
+Figma Plugin
+ │
+ ▼
+PluginWindow (container)
+ │ ├─ Toolbar (when dev tools active)
+ │ ├─ Server Status
+ │ └─ Style Sync
+ │
+ ▼
+iframe (plugin's UI)
+```
+
+When viewing in browser:
+
+```
+Browser
+ │
+ ▼
+Plugin's UI
+ │
+ ▼
+ViteApp (development bridge)
+ ├─ Message Simulation
+ ├─ Server Status
+ └─ Style Sync
+```
+
+### Development Flow
+
+1. Development setup:
+ - `build-placeholder-ui` creates UI with PluginWindow wrapper for Figma
+ - Vite dev server serves plugin UI with ViteApp injected for browser
+
+2. In Figma:
+ - PluginWindow loads and creates iframe
+ - Plugin UI loads in iframe
+ - Messages flow: Figma ↔ PluginWindow ↔ Plugin UI ↔ WebSocket
+
+3. In Browser:
+ - Plugin UI loads with injected ViteApp
+ - ViteApp provides Figma environment simulation
+ - Messages flow: ViteApp ↔ Plugin UI ↔ WebSocket
+
+### Message Flow in Development
+
+1. Figma → PluginWindow:
+ - Messages from Figma are received
+ - Forwarded to iframe and WebSocket clients
+2. Plugin UI → PluginWindow:
+ - Messages from iframe are captured
+ - Routed to Figma (parent) or other clients
+3. WebSocket → PluginWindow:
+ - Messages from WS server are received
+ - Distributed to appropriate targets (parent/iframe)
+
+### Apps Build Process
+
+- Apps are built from a separate project in `../apps`
+- Built apps are copied into the package during:
+ - Development: via `build-and-copy-apps` script
+ - Publishing: via `prepublishOnly` npm hook
+- Build commands:
+ ```
+ build-and-copy-apps: npm run build-apps && npm run copy-apps
+ build-apps: cd ../apps && npm run build
+ copy-apps: node scripts/copy-files.js
+ ```
diff --git a/packages/plugma/docs/server-architecture.md b/packages/plugma/docs/server-architecture.md
new file mode 100644
index 00000000..4e8f601e
--- /dev/null
+++ b/packages/plugma/docs/server-architecture.md
@@ -0,0 +1,191 @@
+# Plugma Server Architecture
+
+## Overview
+
+The Plugma development server setup consists of three main components that work together to provide a seamless development experience for Figma plugin development:
+
+1. Vite Development Server
+2. WebSocket Server
+3. Development UI (Dev Server App)
+
+This document explains how these components interact and their responsibilities.
+
+## Component Details
+
+### 1. Vite Development Server
+
+The Vite server is responsible for serving the plugin's UI during development. It provides:
+
+- Hot Module Replacement (HMR)
+- Static file serving
+- Source map support
+- Development middleware
+- CORS support for Figma
+
+Key files:
+- `src/tasks/server/vite.ts`: Server implementation
+- `src/utils/config/create-vite-configs.ts`: Server configuration
+- `src/vite-plugins/`: Custom Vite plugins
+
+Configuration:
+~~~typescript
+{
+ server: {
+ port: options.port,
+ cors: true,
+ host: 'localhost',
+ strictPort: true,
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ // ... other CORS headers
+ }
+ }
+}
+~~~
+
+### 2. WebSocket Server
+
+The WebSocket server handles real-time communication between:
+- The plugin running in Figma
+- The development UI
+- The Vite development server
+
+Key files:
+- `src/tasks/server/websocket.ts`: WebSocket server implementation with automatic port assignment (Vite port + 1)
+
+Features:
+- Client tracking with unique IDs
+- Message broadcasting
+- Connection management
+- Error recovery
+- Automatic port assignment (Vite port + 1)
+
+### 3. Development UI (Dev Server App)
+
+The development UI provides tools and interfaces for plugin development:
+
+- Plugin preview
+- Development tools
+- Status monitoring
+- WebSocket connection status
+
+Location: `apps/dev-server/`
+
+Key files:
+- `App.svelte`: Main UI component
+- `main.ts`: Entry point
+- `vite.config.ts`: UI-specific Vite configuration
+
+## Server Interaction Flow
+
+### 1. Development Startup
+
+~~~mermaid
+sequenceDiagram
+ participant User
+ participant Vite
+ participant WS
+ participant DevUI
+ participant Figma
+
+ User->>Vite: Start dev server
+ Vite->>WS: Start WebSocket server
+ Vite->>DevUI: Serve development UI
+ DevUI->>WS: Connect to WebSocket
+ Figma->>WS: Connect plugin
+~~~
+
+### 2. Development Loop
+
+1. **UI Changes**:
+ - Developer modifies UI code
+ - Vite HMR updates the UI
+ - Changes visible in Figma
+
+2. **Plugin Changes**:
+ - Developer modifies plugin code
+ - WebSocket server notifies clients
+ - Plugin reloads in Figma
+
+3. **Development Tools**:
+ - Dev UI shows connection status
+ - Provides development features
+ - Monitors plugin state
+
+## Error Handling
+
+The server architecture includes robust error handling:
+
+1. **Vite Server**:
+ - Graceful shutdown
+ - Port conflict resolution
+ - Build error recovery
+
+2. **WebSocket Server**:
+ - Connection error handling
+ - Client disconnection management
+ - Message validation
+
+3. **Development UI**:
+ - Connection retry logic
+ - Error state display
+ - Status monitoring
+
+## Development Workflow
+
+1. **Start Development**:
+ ~~~bash
+ npm run dev
+ ~~~
+ - Starts Vite server
+ - Launches WebSocket server
+ - Opens development UI
+
+2. **Plugin Development**:
+ - Edit plugin code
+ - Changes reflect in Figma
+ - Use development tools
+
+3. **Production Build**:
+ ~~~bash
+ npm run build
+ ~~~
+ - Builds optimized plugin
+ - Packages assets
+ - Creates distribution files
+
+## Best Practices
+
+1. **Server Configuration**:
+ - Use provided port or auto-assign
+ - Enable CORS for Figma
+ - Configure proper headers
+
+2. **WebSocket Usage**:
+ - Handle connection errors
+ - Validate messages
+ - Clean up connections
+
+3. **Development**:
+ - Use HMR for faster development
+ - Monitor WebSocket connections
+ - Check server status
+
+## Troubleshooting
+
+Common issues and solutions:
+
+1. **CORS Errors**:
+ - Verify Vite CORS configuration
+ - Check request headers
+ - Ensure proper origin handling
+
+2. **Connection Issues**:
+ - Confirm ports are available
+ - Check WebSocket server status
+ - Verify client connections
+
+3. **Build Problems**:
+ - Clear build cache
+ - Check Vite configuration
+ - Verify plugin manifest
diff --git a/packages/plugma/dprint.json b/packages/plugma/dprint.json
new file mode 100644
index 00000000..c6dafd8d
--- /dev/null
+++ b/packages/plugma/dprint.json
@@ -0,0 +1,35 @@
+{
+ "$schema": "https://dprint.dev/schemas/v0.json",
+ "useTabs": false,
+ "indentWidth": 2,
+ "lineWidth": 160,
+ "markdown": {},
+ "toml": {},
+ "biome": {
+ "quoteStyle": "single",
+ },
+ "malva": {},
+ "markup": {
+ "scriptIndent": true,
+ "styleIndent": true
+ },
+ "yaml": {},
+ "svelte": {
+ "quoteStyle": "single"
+ },
+ "excludes": [
+ "**/node_modules",
+ "**/dist",
+ "**/*.min.*"
+ ],
+ "plugins": [
+ "https://plugins.dprint.dev/biome-0.7.1.wasm",
+ "https://plugins.dprint.dev/g-plane/malva-v0.11.1.wasm",
+ "https://plugins.dprint.dev/g-plane/markup_fmt-v0.18.0.wasm",
+ "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.0.wasm",
+ "https://plugins.dprint.dev/json-0.19.4.wasm",
+ "https://plugins.dprint.dev/markdown-0.17.8.wasm",
+ "https://plugins.dprint.dev/toml-0.6.4.wasm",
+ "https://plugins.dprint.dev/typescript-0.93.3.wasm",
+ ]
+}
diff --git a/packages/plugma/jsconfig.json b/packages/plugma/jsconfig.json
new file mode 100644
index 00000000..217802c8
--- /dev/null
+++ b/packages/plugma/jsconfig.json
@@ -0,0 +1,37 @@
+{
+ "compilerOptions": {
+ "moduleResolution": "bundler",
+ "target": "ESNext",
+ "module": "ESNext",
+ /**
+ * svelte-preprocess cannot figure out whether you have
+ * a value or a type, so tell TypeScript to enforce using
+ * `import type` instead of `import` for Types.
+ */
+ "verbatimModuleSyntax": true,
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ /**
+ * To have warnings / errors of the Svelte compiler at the
+ * correct position, enable source maps by default.
+ */
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ /**
+ * Typecheck JS in `.svelte` and `.js` files by default.
+ * Disable this if you'd like to use dynamic types.
+ */
+ "checkJs": true
+ },
+ /**
+ * Use global.d.ts instead of compilerOptions.types
+ * to avoid limiting type declarations.
+ */
+ "include": [
+ "apps/**/*.js",
+ "apps/**/*.svelte",
+ "src/**/*.js",
+ "src/**/*.svelte"
+ ]
+}
diff --git a/packages/plugma/package-lock.json b/packages/plugma/package-lock.json
index 3024237e..c3047149 100644
--- a/packages/plugma/package-lock.json
+++ b/packages/plugma/package-lock.json
@@ -1,7315 +1,7616 @@
{
- "name": "plugma",
- "version": "1.2.7",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "plugma",
- "version": "1.2.7",
- "hasInstallScript": true,
- "license": "ISC",
- "dependencies": {
- "chalk": "^5.3.0",
- "chokidar": "^4.0.1",
- "commander": "^12.1.0",
- "express": "^4.18.2",
- "fs-extra": "^11.2.0",
- "inquirer": "^12.0.0",
- "lodash": "^4.17.21",
- "prettier": "^3.3.3",
- "semver": "^7.6.3",
- "uuid": "^10.0.0",
- "vite": "^5.0.4",
- "vite-plugin-singlefile": "^0.13.5",
- "ws": "^8.16.0"
- },
- "bin": {
- "plugma": "bin/cli.js"
- },
- "devDependencies": {
- "@babel/preset-env": "^7.26.0",
- "babel-jest": "^29.7.0",
- "jest": "^29.7.0"
- }
- },
- "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,
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
- "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
- "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
- "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.26.0",
- "@babel/generator": "^7.26.0",
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.0",
- "@babel/parser": "^7.26.0",
- "@babel/template": "^7.25.9",
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.26.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"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@babel/core/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,
- "license": "MIT"
- },
- "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": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
- "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.26.2",
- "@babel/types": "^7.26.0",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
- "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
- "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
- "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.25.9",
- "@babel/helper-validator-option": "^7.25.9",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "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,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
- "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-member-expression-to-functions": "^7.25.9",
- "@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
- "@babel/traverse": "^7.25.9",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin/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/@babel/helper-create-regexp-features-plugin": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
- "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "regexpu-core": "^6.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin/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/@babel/helper-define-polyfill-provider": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.22.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider/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,
- "license": "MIT"
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
- "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
- "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
- "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
- "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
- "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
- "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-wrap-function": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
- "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.25.9",
- "@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
- "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
- "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
- "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
- "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
- "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
- "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.26.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
- "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
- "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
- "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
- "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
- "@babel/plugin-transform-optional-chaining": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
- "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
- "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
- "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
- "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
- "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
- "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
- "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-remap-async-to-generator": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
- "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-remap-async-to-generator": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
- "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
- "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
- "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
- "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
- "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9",
- "@babel/traverse": "^7.25.9",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
- "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/template": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
- "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
- "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
- "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
- "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
- "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
- "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
- "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
- "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
- "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
- "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
- "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
- "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
- "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
- "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
- "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-simple-access": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
- "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
- "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
- "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
- "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
- "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
- "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
- "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/plugin-transform-parameters": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
- "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
- "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
- "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
- "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
- "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
- "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.9",
- "@babel/helper-create-class-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
- "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
- "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "regenerator-transform": "^0.15.2"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regexp-modifiers": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
- "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
- "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
- "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
- "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
- "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
- "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
- "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
- "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
- "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
- "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
- "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
- "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.26.0",
- "@babel/helper-compilation-targets": "^7.25.9",
- "@babel/helper-plugin-utils": "^7.25.9",
- "@babel/helper-validator-option": "^7.25.9",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
- "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-import-assertions": "^7.26.0",
- "@babel/plugin-syntax-import-attributes": "^7.26.0",
- "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.25.9",
- "@babel/plugin-transform-async-generator-functions": "^7.25.9",
- "@babel/plugin-transform-async-to-generator": "^7.25.9",
- "@babel/plugin-transform-block-scoped-functions": "^7.25.9",
- "@babel/plugin-transform-block-scoping": "^7.25.9",
- "@babel/plugin-transform-class-properties": "^7.25.9",
- "@babel/plugin-transform-class-static-block": "^7.26.0",
- "@babel/plugin-transform-classes": "^7.25.9",
- "@babel/plugin-transform-computed-properties": "^7.25.9",
- "@babel/plugin-transform-destructuring": "^7.25.9",
- "@babel/plugin-transform-dotall-regex": "^7.25.9",
- "@babel/plugin-transform-duplicate-keys": "^7.25.9",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
- "@babel/plugin-transform-dynamic-import": "^7.25.9",
- "@babel/plugin-transform-exponentiation-operator": "^7.25.9",
- "@babel/plugin-transform-export-namespace-from": "^7.25.9",
- "@babel/plugin-transform-for-of": "^7.25.9",
- "@babel/plugin-transform-function-name": "^7.25.9",
- "@babel/plugin-transform-json-strings": "^7.25.9",
- "@babel/plugin-transform-literals": "^7.25.9",
- "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
- "@babel/plugin-transform-member-expression-literals": "^7.25.9",
- "@babel/plugin-transform-modules-amd": "^7.25.9",
- "@babel/plugin-transform-modules-commonjs": "^7.25.9",
- "@babel/plugin-transform-modules-systemjs": "^7.25.9",
- "@babel/plugin-transform-modules-umd": "^7.25.9",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
- "@babel/plugin-transform-new-target": "^7.25.9",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
- "@babel/plugin-transform-numeric-separator": "^7.25.9",
- "@babel/plugin-transform-object-rest-spread": "^7.25.9",
- "@babel/plugin-transform-object-super": "^7.25.9",
- "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
- "@babel/plugin-transform-optional-chaining": "^7.25.9",
- "@babel/plugin-transform-parameters": "^7.25.9",
- "@babel/plugin-transform-private-methods": "^7.25.9",
- "@babel/plugin-transform-private-property-in-object": "^7.25.9",
- "@babel/plugin-transform-property-literals": "^7.25.9",
- "@babel/plugin-transform-regenerator": "^7.25.9",
- "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
- "@babel/plugin-transform-reserved-words": "^7.25.9",
- "@babel/plugin-transform-shorthand-properties": "^7.25.9",
- "@babel/plugin-transform-spread": "^7.25.9",
- "@babel/plugin-transform-sticky-regex": "^7.25.9",
- "@babel/plugin-transform-template-literals": "^7.25.9",
- "@babel/plugin-transform-typeof-symbol": "^7.25.9",
- "@babel/plugin-transform-unicode-escapes": "^7.25.9",
- "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
- "@babel/plugin-transform-unicode-regex": "^7.25.9",
- "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.6",
- "babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.38.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-env/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/@babel/preset-modules": {
- "version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
- "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
- "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/parser": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
- "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/generator": "^7.25.9",
- "@babel/parser": "^7.25.9",
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.25.9",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@babel/traverse/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,
- "license": "MIT"
- },
- "node_modules/@babel/types": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
- "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz",
- "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz",
- "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz",
- "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz",
- "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz",
- "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz",
- "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz",
- "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz",
- "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz",
- "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz",
- "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz",
- "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==",
- "cpu": [
- "loong64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz",
- "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==",
- "cpu": [
- "mips64el"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz",
- "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz",
- "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz",
- "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz",
- "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz",
- "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz",
- "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz",
- "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz",
- "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz",
- "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz",
- "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@inquirer/checkbox": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.0.tgz",
- "integrity": "sha512-TNd+u1fAG8vf8YMgXzK2BI0u0xsphFv//T5rpF1eZ+8AAXby5Ll1qptr4/XVS45dvWDIzuBmmWIpVJRvnaNqzQ==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/figures": "^1.0.7",
- "@inquirer/type": "^3.0.0",
- "ansi-escapes": "^4.3.2",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/confirm": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.0.tgz",
- "integrity": "sha512-6QEzj6bZg8atviRIL+pR0tODC854cYSjvZxkyCarr8DVaOJPEyuGys7GmEG3W0Rb8kKSQec7P6okt0sJvNneFw==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/core": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.0.tgz",
- "integrity": "sha512-7dwoKCGvgZGHWTZfOj2KLmbIAIdiXP9NTrwGaTO/XDfKMEmyBahZpnombiG6JDHmiOrmK3GLEJRXrWExXCDLmQ==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/figures": "^1.0.7",
- "@inquirer/type": "^3.0.0",
- "ansi-escapes": "^4.3.2",
- "cli-width": "^4.1.0",
- "mute-stream": "^2.0.0",
- "signal-exit": "^4.1.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^6.2.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/editor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.0.tgz",
- "integrity": "sha512-bhHAP7hIOxUjiTZrpjyAYD+2RFRa+PNutWeW7JdDPcWWG3GVRiFsu3pBGw9kN2PktoiilDWFGSR0dwXBzGQang==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0",
- "external-editor": "^3.1.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/expand": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.0.tgz",
- "integrity": "sha512-mR7JHNIvCB4o12f75KN42he7s1O9tmcSN4wJ6l04oymfXKLn+lYJFI7z9lbe4/Ald6fm8nuF38fuY5hNPl3B+A==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/figures": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz",
- "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/input": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.0.tgz",
- "integrity": "sha512-LD7MNzaX+q2OpU4Fn0i/SedhnnBCAnEzRr6L0MP6ohofFFlx9kp5EXX7flbRZlUnh8icOwC3NFmXTyP76hvo0g==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.0.tgz",
- "integrity": "sha512-DUYfROyQNWm3q+JXL3S6s1/y/cOWRstnmt5zDXhdYNJ5N8TgCnHcDXKwW/dRZL7eBZupmDVHxdKCWZDUYUqmeg==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/password": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.0.tgz",
- "integrity": "sha512-W4QRSzJDMKIvWSvQWOIhs6qba1MJ6yIoy+sazSFhl2QIwn58B0Yw3iZ/zLk3QqVcCsTmKcyrSNVWUJ5RVDLStw==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0",
- "ansi-escapes": "^4.3.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/prompts": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.0.tgz",
- "integrity": "sha512-y8kX/TmyBqV0H1i3cWbhiTljcuBtgVgyVXAVub3ba1j5/G+dxhYohK1JLRkaosPGKKf3LnEJsYK+GPabpfnaHw==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/checkbox": "^4.0.0",
- "@inquirer/confirm": "^5.0.0",
- "@inquirer/editor": "^4.0.0",
- "@inquirer/expand": "^4.0.0",
- "@inquirer/input": "^4.0.0",
- "@inquirer/number": "^3.0.0",
- "@inquirer/password": "^4.0.0",
- "@inquirer/rawlist": "^4.0.0",
- "@inquirer/search": "^3.0.0",
- "@inquirer/select": "^4.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/rawlist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.0.tgz",
- "integrity": "sha512-frzJNoMsQBO1fxLXrtpxt2c8hUy/ASEmBpIOEnXY2CjylPnLsVyxrEq7hcOIqVJKHn1tIPfplfiSPowOTrrUDg==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/type": "^3.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/search": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.0.tgz",
- "integrity": "sha512-AT9vkC2KD/PLHZZXIW5Tn/FnJzEU3xEZMLxNo9OggKoreDEKfTOKVM1LkYbDg6UQUOOjntXd0SsrvoHfCzS8cw==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/figures": "^1.0.7",
- "@inquirer/type": "^3.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/select": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.0.tgz",
- "integrity": "sha512-XTN4AIFusWbNCBU1Xm2YDxbtH94e/FOrC27U3QargSsoDT1mRm+aLfqE+oOZnUuxwtTnInRT8UHRU3MVOu52wg==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/figures": "^1.0.7",
- "@inquirer/type": "^3.0.0",
- "ansi-escapes": "^4.3.2",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz",
- "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- }
- },
- "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": {
- "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": ">=8"
- }
- },
- "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/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/console/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,
- "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/@jest/core": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
- "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/reporters": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.7.0",
- "jest-config": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-resolve-dependencies": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/core/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,
- "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/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jest-get-type": "^29.6.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/reporters": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
- "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^6.0.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/@jest/reporters/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,
- "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/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^2.0.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.2"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/transform/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,
- "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/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/types/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,
- "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/@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,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.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,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
- "dev": true,
- "license": "MIT"
- },
- "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,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz",
- "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz",
- "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz",
- "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz",
- "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz",
- "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz",
- "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz",
- "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz",
- "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz",
- "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz",
- "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz",
- "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz",
- "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz",
- "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
- },
- "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/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/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
- "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "22.5.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz",
- "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.19.2"
- }
- },
- "node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/yargs": {
- "version": "17.0.33",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "dev": true,
- "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==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "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==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "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": {
- "sprintf-js": "~1.0.2"
- }
- },
- "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/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/transform": "^29.7.0",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
- }
- },
- "node_modules/babel-jest/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,
- "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/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
- "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2/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/babel-plugin-polyfill-corejs3": {
- "version": "0.10.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
- "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "core-js-compat": "^3.38.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
- "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-preset-current-node-syntax": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
- "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "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/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "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.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.24.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
- "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
- "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": {
- "caniuse-lite": "^1.0.30001669",
- "electron-to-chromium": "^1.5.41",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "node-int64": "^0.4.0"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
- "dependencies": {
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "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": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001676",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz",
- "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==",
- "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/chalk": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
- "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "license": "MIT"
- },
- "node_modules/chokidar": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
- "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cjs-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cli-width": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
- "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
- "license": "ISC",
- "engines": {
- "node": ">= 12"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
- }
- },
- "node_modules/collect-v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
- "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
- "dev": true,
- "license": "MIT"
- },
- "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"
- },
- "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=="
- },
- "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"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "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==",
- "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"
- }
- },
- "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/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "engines": {
- "node": ">= 0.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-js-compat": {
- "version": "3.39.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
- "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.24.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
- },
- "bin": {
- "create-jest": "bin/create-jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/create-jest/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,
- "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/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,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/dedent": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
- "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
- },
- "peerDependenciesMeta": {
- "babel-plugin-macros": {
- "optional": true
- }
- }
- },
- "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,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "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/electron-to-chromium": {
- "version": "1.5.50",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz",
- "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
- },
- "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/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/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.19.9",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz",
- "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.19.9",
- "@esbuild/android-arm64": "0.19.9",
- "@esbuild/android-x64": "0.19.9",
- "@esbuild/darwin-arm64": "0.19.9",
- "@esbuild/darwin-x64": "0.19.9",
- "@esbuild/freebsd-arm64": "0.19.9",
- "@esbuild/freebsd-x64": "0.19.9",
- "@esbuild/linux-arm": "0.19.9",
- "@esbuild/linux-arm64": "0.19.9",
- "@esbuild/linux-ia32": "0.19.9",
- "@esbuild/linux-loong64": "0.19.9",
- "@esbuild/linux-mips64el": "0.19.9",
- "@esbuild/linux-ppc64": "0.19.9",
- "@esbuild/linux-riscv64": "0.19.9",
- "@esbuild/linux-s390x": "0.19.9",
- "@esbuild/linux-x64": "0.19.9",
- "@esbuild/netbsd-x64": "0.19.9",
- "@esbuild/openbsd-x64": "0.19.9",
- "@esbuild/sunos-x64": "0.19.9",
- "@esbuild/win32-arm64": "0.19.9",
- "@esbuild/win32-ia32": "0.19.9",
- "@esbuild/win32-x64": "0.19.9"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "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=="
- },
- "node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "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==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/execa/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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.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"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "license": "MIT",
- "dependencies": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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,
- "license": "MIT"
- },
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "bser": "2.1.1"
- }
- },
- "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==",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "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"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "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"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "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==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "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==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
- "dependencies": {
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "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/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,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/gopd": {
- "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"
- }
- },
- "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=="
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
- "dependencies": {
- "get-intrinsic": "^1.2.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "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/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/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==",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.17.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==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "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.",
- "dev": true,
- "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=="
- },
- "node_modules/inquirer": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.0.tgz",
- "integrity": "sha512-W3mwgzLtWIqHndtAb82zCHbRfdPit3jcqEyYkAjM/4p15g/1tOoduYydx6IJ3sh31FHT82YoqYZB8RoTwoMy7w==",
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.0.0",
- "@inquirer/prompts": "^7.0.0",
- "@inquirer/type": "^3.0.0",
- "ansi-escapes": "^4.3.2",
- "mute-stream": "^2.0.0",
- "run-async": "^3.0.0",
- "rxjs": "^7.8.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-core-module": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
- "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "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==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "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==",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "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-instrument": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
- "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@istanbuljs/schema": "^0.1.3",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "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": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "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": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/istanbul-lib-source-maps/node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/istanbul-lib-source-maps/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,
- "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==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
- "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/types": "^29.6.3",
- "import-local": "^3.0.2",
- "jest-cli": "^29.7.0"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-changed-files": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
- "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "execa": "^5.0.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^1.0.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
- "pure-rand": "^6.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-circus/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,
- "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/jest-cli": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
- "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "create-jest": "^29.7.0",
- "exit": "^0.1.2",
- "import-local": "^3.0.2",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "yargs": "^17.3.1"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-cli/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,
- "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/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/jest-config/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,
- "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/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-diff/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,
- "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/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "detect-newline": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-each/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,
- "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/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- }
- },
- "node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-matcher-utils/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,
- "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/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-message-util/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,
- "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/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
- "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
- },
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
- }
- },
- "node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "resolve": "^1.20.0",
- "resolve.exports": "^2.0.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-resolve-dependencies": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
- "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jest-regex-util": "^29.6.3",
- "jest-snapshot": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-resolve/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,
- "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/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-runner/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,
- "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/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-runtime/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,
- "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/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
- "semver": "^7.5.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-snapshot/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,
- "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/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-util/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,
- "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/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-validate/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jest-validate/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,
- "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/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.7.0",
- "string-length": "^4.0.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-watcher/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,
- "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/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.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,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "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,
- "license": "MIT"
- },
- "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,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "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/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "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": {
- "p-locate": "^4.1.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==",
- "license": "MIT"
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "dev": true,
- "license": "MIT"
- },
- "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,
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "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": {
- "semver": "^7.5.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tmpl": "1.0.5"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "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/merge-stream": {
- "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,
- "license": "MIT"
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "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"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "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==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/mute-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
- "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "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==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
- "dev": true,
- "license": "MIT"
- },
- "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,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "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==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-locate/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": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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/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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT"
- },
- "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/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": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "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": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.32",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
- "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
- "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"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "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==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "license": "MIT"
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/readdirp": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
- "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
- "license": "MIT",
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
- "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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,
- "license": "MIT"
- },
- "node_modules/regenerator-transform": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "node_modules/regexpu-core": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
- "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.2.0",
- "regjsgen": "^0.8.0",
- "regjsparser": "^0.11.0",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/regjsparser": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
- "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "jsesc": "~3.0.2"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "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"
- }
- },
- "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,
- "license": "MIT",
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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/resolve.exports": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
- "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/rollup": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz",
- "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==",
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.9.1",
- "@rollup/rollup-android-arm64": "4.9.1",
- "@rollup/rollup-darwin-arm64": "4.9.1",
- "@rollup/rollup-darwin-x64": "4.9.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.9.1",
- "@rollup/rollup-linux-arm64-gnu": "4.9.1",
- "@rollup/rollup-linux-arm64-musl": "4.9.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.9.1",
- "@rollup/rollup-linux-x64-gnu": "4.9.1",
- "@rollup/rollup-linux-x64-musl": "4.9.1",
- "@rollup/rollup-win32-arm64-msvc": "4.9.1",
- "@rollup/rollup-win32-ia32-msvc": "4.9.1",
- "@rollup/rollup-win32-x64-msvc": "4.9.1",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-async": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
- "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "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==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.1.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/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "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"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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/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==",
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
- "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
- "dependencies": {
- "define-data-property": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "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/stack-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
- "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "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"
- },
- "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==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "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,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "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": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "license": "MIT",
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "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==",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "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==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
- "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
- "license": "0BSD"
- },
- "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/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "license": "MIT"
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
- "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
- "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "engines": {
- "node": ">= 10.0.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==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
- "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
- "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": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
- "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/v8-to-istanbul": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
- "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^2.0.0"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "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==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/vite": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz",
- "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==",
- "dependencies": {
- "esbuild": "^0.19.3",
- "postcss": "^8.4.32",
- "rollup": "^4.2.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vite-plugin-singlefile": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz",
- "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==",
- "dependencies": {
- "micromatch": "^4.0.5"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "rollup": ">=2.79.0",
- "vite": ">=3.2.0"
- }
- },
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
- "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,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/write-file-atomic/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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ws": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
- "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
- "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/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "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/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "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,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yoctocolors-cjs": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
- "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
+ "name": "plugma",
+ "version": "2.0.0-beta.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "plugma",
+ "version": "2.0.0-beta.1",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "chokidar": "^4.0.1",
+ "commander": "^12.1.0",
+ "cross-dirname": "^0.1.0",
+ "debug": "^4.4.0",
+ "express": "^4.18.2",
+ "fs-extra": "^11.2.0",
+ "inquirer": "^12.0.0",
+ "lodash": "^4.17.21",
+ "plugma": "^1.2.8",
+ "prettier": "^3.3.3",
+ "semver": "^7.6.3",
+ "slugify": "^1.6.6",
+ "supports-color": "^10.0.0",
+ "uuid": "^10.0.0",
+ "vite": "5.4.12",
+ "vite-plugin-singlefile": "^0.13.5",
+ "ws": "^8.16.0"
+ },
+ "bin": {
+ "plugma": "bin/plugma"
+ },
+ "devDependencies": {
+ "@antfu/ni": "^23.2.0",
+ "@babel/preset-env": "^7.26.0",
+ "@figma/plugin-typings": "^1.107.0-beta.1",
+ "@sveltejs/vite-plugin-svelte": "^3.1.2",
+ "@types/debug": "^4.1.12",
+ "@types/express": "^5.0.0",
+ "@types/fs-extra": "^11.0.4",
+ "@types/node": "^22.12.0",
+ "@types/react": "^19.0.7",
+ "@types/react-dom": "^19.0.3",
+ "@types/uuid": "^10.0.0",
+ "@types/ws": "^8.5.13",
+ "@vitest/coverage-v8": "^3.0.4",
+ "@vitest/ui": "^3.0.4",
+ "biome": "^0.3.3",
+ "concurrently": "^9.1.2",
+ "dprint": "^0.48.0",
+ "reconnecting-websocket": "^4.4.0",
+ "source-map": "^0.7.4",
+ "svelte": "^4.2.19",
+ "terser": "^5.37.0",
+ "type-fest": "^4.33.0",
+ "typescript": "^5.7.3",
+ "vite-tsconfig-paths": "^5.1.4",
+ "vitest": "^3.0.3"
+ }
+ },
+ "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,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@antfu/ni": {
+ "version": "23.2.0",
+ "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-23.2.0.tgz",
+ "integrity": "sha512-PsqWG9QcgTQ0eyEMxYaaJMxoCaCmy8InPkToC7MQuOHHUPQknMZtCrnzZSZDXk+X9Z93eGFh+v0mE2X6FWNtuw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "na": "bin/na.mjs",
+ "nci": "bin/nci.mjs",
+ "ni": "bin/ni.mjs",
+ "nlx": "bin/nlx.mjs",
+ "nr": "bin/nr.mjs",
+ "nu": "bin/nu.mjs",
+ "nun": "bin/nun.mjs"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
+ "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.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"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "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",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
+ "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.2",
+ "@babel/types": "^7.26.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
+ "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/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/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/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/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
+ "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
+ "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
+ "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
+ "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
+ "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-simple-access": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
+ "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
+ "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
+ "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.25.9",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.25.9",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.25.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/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/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.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": ">=18"
+ }
+ },
+ "node_modules/@dprint/darwin-arm64": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/darwin-arm64/-/darwin-arm64-0.48.0.tgz",
+ "integrity": "sha512-LJ+02WB1PDIUqobfwxBVMz0cUByXsZ6izFTC9tHR+BDt+qWfoZpCn5r/zpAVSkVlA5LzGHKLVNJrwKwaTnAiVA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@dprint/darwin-x64": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/darwin-x64/-/darwin-x64-0.48.0.tgz",
+ "integrity": "sha512-OxfLbitoNvFMVucauJ2DvEaJpnxyyhXWC2M56f2AX8lkZSsHrdMHtklqxHz3cBGVPpcCXjLPRC139ynwmqtjIA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@dprint/linux-arm64-glibc": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.48.0.tgz",
+ "integrity": "sha512-VMeyorjMXE9NrksmyOJ0zJRGxT7r7kDBBxshCxW+U1xgW+FqR8oE25RZaeDZZPDzUHapAly4ILZqjExLzAWVpw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@dprint/linux-arm64-musl": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-musl/-/linux-arm64-musl-0.48.0.tgz",
+ "integrity": "sha512-1BUHQKEngrZv8F6wq2SVxdokyeUoHFXjz0xbYGwctlFPzXAVNLpDy9FROXsfIKmxZ0NsRqEpatETLmubtvWtcA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@dprint/linux-riscv64-glibc": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/linux-riscv64-glibc/-/linux-riscv64-glibc-0.48.0.tgz",
+ "integrity": "sha512-c8LktisPGbygyFf9wUg0trbAQDApawU017iPQXkZnGcV4QoCeGkFjnY8vltIKyy5DeP5gIp12KjlaT/wogMPkw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@dprint/linux-x64-glibc": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.48.0.tgz",
+ "integrity": "sha512-Am8rp4FqmkO4aFdmwxk+82g2csxPLTPIlNq0Fa9AZReU15yta3Pq0Pg4AXFq+KSso5L4WGmt09ciCitK5gmdOg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@dprint/linux-x64-musl": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/linux-x64-musl/-/linux-x64-musl-0.48.0.tgz",
+ "integrity": "sha512-0nzrZXOvblM/H4GVffNJ7YZn/Y4F/i+DNDZRT1hQmKuTQurB7a2MBJ91OpooLIWJoSn4q40crwM1Po4xnNXrdg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@dprint/win32-arm64": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/win32-arm64/-/win32-arm64-0.48.0.tgz",
+ "integrity": "sha512-bRcGLbhKEXmP7iXDir/vU6DqkA3XaMqBM6P2ACCJMHd+XKWsz3VJzZMn5hFWZ+oZpxUsS3Mg2RcgH5xVjaawgA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@dprint/win32-x64": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@dprint/win32-x64/-/win32-x64-0.48.0.tgz",
+ "integrity": "sha512-9JOKWWngo5vPBFxJgFogAS4rfFC2GaB9Yew6JZbRBUik7j5Num2muuw5p1tMYnl2NUBdS2W4EgsSLM3uUDyhBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@figma/plugin-typings": {
+ "version": "1.107.0-beta.1",
+ "resolved": "https://registry.npmjs.org/@figma/plugin-typings/-/plugin-typings-1.107.0-beta.1.tgz",
+ "integrity": "sha512-h7X3XLK4TdR+WQtLMHkamnB2PeFquZkknUxM1q16U+dLJ6zEH4//KA4SQnpoxwLDlKDckWZKbnK1u0NpZbIhGw==",
+ "dev": true,
+ "license": "MIT License"
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.0.tgz",
+ "integrity": "sha512-TNd+u1fAG8vf8YMgXzK2BI0u0xsphFv//T5rpF1eZ+8AAXby5Ll1qptr4/XVS45dvWDIzuBmmWIpVJRvnaNqzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/figures": "^1.0.7",
+ "@inquirer/type": "^3.0.0",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.0.tgz",
+ "integrity": "sha512-6QEzj6bZg8atviRIL+pR0tODC854cYSjvZxkyCarr8DVaOJPEyuGys7GmEG3W0Rb8kKSQec7P6okt0sJvNneFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.0.tgz",
+ "integrity": "sha512-7dwoKCGvgZGHWTZfOj2KLmbIAIdiXP9NTrwGaTO/XDfKMEmyBahZpnombiG6JDHmiOrmK3GLEJRXrWExXCDLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/figures": "^1.0.7",
+ "@inquirer/type": "^3.0.0",
+ "ansi-escapes": "^4.3.2",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.0.tgz",
+ "integrity": "sha512-bhHAP7hIOxUjiTZrpjyAYD+2RFRa+PNutWeW7JdDPcWWG3GVRiFsu3pBGw9kN2PktoiilDWFGSR0dwXBzGQang==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0",
+ "external-editor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.0.tgz",
+ "integrity": "sha512-mR7JHNIvCB4o12f75KN42he7s1O9tmcSN4wJ6l04oymfXKLn+lYJFI7z9lbe4/Ald6fm8nuF38fuY5hNPl3B+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz",
+ "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.0.tgz",
+ "integrity": "sha512-LD7MNzaX+q2OpU4Fn0i/SedhnnBCAnEzRr6L0MP6ohofFFlx9kp5EXX7flbRZlUnh8icOwC3NFmXTyP76hvo0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.0.tgz",
+ "integrity": "sha512-DUYfROyQNWm3q+JXL3S6s1/y/cOWRstnmt5zDXhdYNJ5N8TgCnHcDXKwW/dRZL7eBZupmDVHxdKCWZDUYUqmeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.0.tgz",
+ "integrity": "sha512-W4QRSzJDMKIvWSvQWOIhs6qba1MJ6yIoy+sazSFhl2QIwn58B0Yw3iZ/zLk3QqVcCsTmKcyrSNVWUJ5RVDLStw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0",
+ "ansi-escapes": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.0.tgz",
+ "integrity": "sha512-y8kX/TmyBqV0H1i3cWbhiTljcuBtgVgyVXAVub3ba1j5/G+dxhYohK1JLRkaosPGKKf3LnEJsYK+GPabpfnaHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/checkbox": "^4.0.0",
+ "@inquirer/confirm": "^5.0.0",
+ "@inquirer/editor": "^4.0.0",
+ "@inquirer/expand": "^4.0.0",
+ "@inquirer/input": "^4.0.0",
+ "@inquirer/number": "^3.0.0",
+ "@inquirer/password": "^4.0.0",
+ "@inquirer/rawlist": "^4.0.0",
+ "@inquirer/search": "^3.0.0",
+ "@inquirer/select": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.0.tgz",
+ "integrity": "sha512-frzJNoMsQBO1fxLXrtpxt2c8hUy/ASEmBpIOEnXY2CjylPnLsVyxrEq7hcOIqVJKHn1tIPfplfiSPowOTrrUDg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/type": "^3.0.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.0.tgz",
+ "integrity": "sha512-AT9vkC2KD/PLHZZXIW5Tn/FnJzEU3xEZMLxNo9OggKoreDEKfTOKVM1LkYbDg6UQUOOjntXd0SsrvoHfCzS8cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/figures": "^1.0.7",
+ "@inquirer/type": "^3.0.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.0.tgz",
+ "integrity": "sha512-XTN4AIFusWbNCBU1Xm2YDxbtH94e/FOrC27U3QargSsoDT1mRm+aLfqE+oOZnUuxwtTnInRT8UHRU3MVOu52wg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/figures": "^1.0.7",
+ "@inquirer/type": "^3.0.0",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz",
+ "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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/@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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.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==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+ "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz",
+ "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz",
+ "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz",
+ "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz",
+ "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz",
+ "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz",
+ "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz",
+ "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz",
+ "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz",
+ "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz",
+ "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz",
+ "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz",
+ "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz",
+ "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz",
+ "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz",
+ "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz",
+ "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz",
+ "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz",
+ "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz",
+ "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz",
+ "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
+ "debug": "^4.3.4",
+ "deepmerge": "^4.3.1",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.10",
+ "svelte-hmr": "^0.16.0",
+ "vitefu": "^0.2.5"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz",
+ "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "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==",
+ "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/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz",
+ "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^5.0.0",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz",
+ "integrity": "sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz",
+ "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/jsonfile": "*",
+ "@types/node": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/jsonfile": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
+ "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.12.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
+ "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.18",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
+ "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+ "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/react": {
+ "version": "19.0.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.7.tgz",
+ "integrity": "sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz",
+ "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "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.5.13",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
+ "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vitest/coverage-v8": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.4.tgz",
+ "integrity": "sha512-f0twgRCHgbs24Dp8cLWagzcObXMcuKtAwgxjJV/nnysPAJJk1JiKu/W0gIehZLmkljhJXU/E0/dmuQzsA/4jhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@bcoe/v8-coverage": "^1.0.2",
+ "debug": "^4.4.0",
+ "istanbul-lib-coverage": "^3.2.2",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-lib-source-maps": "^5.0.6",
+ "istanbul-reports": "^3.1.7",
+ "magic-string": "^0.30.17",
+ "magicast": "^0.3.5",
+ "std-env": "^3.8.0",
+ "test-exclude": "^7.0.1",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@vitest/browser": "3.0.4",
+ "vitest": "3.0.4"
+ },
+ "peerDependenciesMeta": {
+ "@vitest/browser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.4.tgz",
+ "integrity": "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.0.4",
+ "@vitest/utils": "3.0.4",
+ "chai": "^5.1.2",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.4.tgz",
+ "integrity": "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.0.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.4.tgz",
+ "integrity": "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.4.tgz",
+ "integrity": "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.0.4",
+ "pathe": "^2.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.4.tgz",
+ "integrity": "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.0.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.4.tgz",
+ "integrity": "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/ui": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.0.4.tgz",
+ "integrity": "sha512-e+s2F9e9FUURkZ5aFIe1Fi3Y8M7UF6gEuShcaV/ur7y/Ldri+1tzWQ1TJq9Vas42NXnXvCAIrU39Z4U2RyET6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.0.4",
+ "fflate": "^0.8.2",
+ "flatted": "^3.3.2",
+ "pathe": "^2.0.2",
+ "sirv": "^3.0.0",
+ "tinyglobby": "^0.2.10",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "vitest": "3.0.4"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.4.tgz",
+ "integrity": "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.0.4",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "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/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+ "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/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/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+ "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "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/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/biome": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/biome/-/biome-0.3.3.tgz",
+ "integrity": "sha512-4LXjrQYbn9iTXu9Y4SKT7ABzTV0WnLDHCVSd2fPUOKsy1gQ+E4xPFmlY1zcWexoi0j7fGHItlL6OWA2CZ/yYAQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "bluebird": "^3.4.1",
+ "chalk": "^1.1.3",
+ "commander": "^2.9.0",
+ "editor": "^1.0.0",
+ "fs-promise": "^0.5.0",
+ "inquirer-promise": "0.0.3",
+ "request-promise": "^3.0.0",
+ "untildify": "^3.0.2",
+ "user-home": "^2.0.0"
+ },
+ "bin": {
+ "biome": "dist/index.js"
+ }
+ },
+ "node_modules/biome/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/biome/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/biome/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/biome/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/biome/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/biome/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "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.1",
+ "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/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "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/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "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": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001676",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz",
+ "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==",
+ "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/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/chai": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
+ "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "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": ">=12"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "license": "MIT"
+ },
+ "node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/code-red": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
+ "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.10.0",
+ "estree-walker": "^3.0.3",
+ "periscopic": "^3.1.0"
+ }
+ },
+ "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"
+ },
+ "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=="
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concurrently": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz",
+ "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.8.1",
+ "shell-quote": "^1.8.1",
+ "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": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/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,
+ "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/concurrently/node_modules/chalk/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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==",
+ "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"
+ }
+ },
+ "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",
+ "peer": true
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.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-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
+ "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-dirname": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
+ "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/dprint": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.48.0.tgz",
+ "integrity": "sha512-dmCrYTiubcsQklTLUimlO+p8wWgMtZBjpPVsOGiw4kPX7Dn41vwyE1R4qA8Px4xHgQtcX7WP9mJujF4C8vISIw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "dprint": "bin.js"
+ },
+ "optionalDependencies": {
+ "@dprint/darwin-arm64": "0.48.0",
+ "@dprint/darwin-x64": "0.48.0",
+ "@dprint/linux-arm64-glibc": "0.48.0",
+ "@dprint/linux-arm64-musl": "0.48.0",
+ "@dprint/linux-riscv64-glibc": "0.48.0",
+ "@dprint/linux-x64-glibc": "0.48.0",
+ "@dprint/linux-x64-musl": "0.48.0",
+ "@dprint/win32-arm64": "0.48.0",
+ "@dprint/win32-x64": "0.48.0"
+ }
+ },
+ "node_modules/earlgrey-runtime": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/earlgrey-runtime/-/earlgrey-runtime-0.1.2.tgz",
+ "integrity": "sha512-T4qoScXi5TwALDv8nlGTvOuCT8jXcKcxtO8qVdqv46IA2GHJfQzwoBPbkOmORnyhu3A98cVVuhWLsM2CzPljJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "kaiser": ">=0.0.4",
+ "lodash": "^4.17.2",
+ "regenerator-runtime": "^0.9.5"
+ }
+ },
+ "node_modules/earlgrey-runtime/node_modules/regenerator-runtime": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz",
+ "integrity": "sha512-D0Y/JJ4VhusyMOd/o25a3jdUqN/bC85EFsaoL9Oqmy/O4efCh+xhp7yj2EEOsj974qvMkcW8AwUzJ1jB/MbxCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/editor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz",
+ "integrity": "sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==",
+ "dev": true,
+ "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/electron-to-chromium": {
+ "version": "1.5.50",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz",
+ "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==",
+ "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=="
+ },
+ "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/es-module-lexer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "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=="
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.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==",
+ "dev": true,
+ "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==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/exit-hook": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
+ "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.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"
+ },
+ "engines": {
+ "node": ">= 0.10.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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "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/figures": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5",
+ "object-assign": "^4.1.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.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"
+ },
+ "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/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "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==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-promise": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.5.0.tgz",
+ "integrity": "sha512-Y+4F4ujhEcayCJt6JmzcOun9MYGQwz+bVUiuBmTkJImhBHKpBvmVPZR9wtfiF7k3ffwAOAuurygQe+cPLSFQhw==",
+ "deprecated": "Use mz or fs-extra^3.0 with Promise Support",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "fs-extra": "^0.26.5",
+ "mz": "^2.3.1",
+ "thenify-all": "^1.6.0"
+ }
+ },
+ "node_modules/fs-promise/node_modules/fs-extra": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
+ "integrity": "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "node_modules/fs-promise/node_modules/jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "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==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "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/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gopd": {
+ "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"
+ }
+ },
+ "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=="
+ },
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "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/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/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==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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.",
+ "dev": true,
+ "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=="
+ },
+ "node_modules/inquirer": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.0.tgz",
+ "integrity": "sha512-W3mwgzLtWIqHndtAb82zCHbRfdPit3jcqEyYkAjM/4p15g/1tOoduYydx6IJ3sh31FHT82YoqYZB8RoTwoMy7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.0.0",
+ "@inquirer/prompts": "^7.0.0",
+ "@inquirer/type": "^3.0.0",
+ "ansi-escapes": "^4.3.2",
+ "mute-stream": "^2.0.0",
+ "run-async": "^3.0.0",
+ "rxjs": "^7.8.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/inquirer-promise": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/inquirer-promise/-/inquirer-promise-0.0.3.tgz",
+ "integrity": "sha512-82CQX586JAV9GAgU9yXZsMDs+NorjA0nLhkfFx9+PReyOnuoHRbHrC1Z90sS95bFJI1Tm1gzMObuE0HabzkJpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "earlgrey-runtime": ">=0.0.11",
+ "inquirer": "^0.11.3"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/cli-width": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz",
+ "integrity": "sha512-eMU2akIeEIkCxGXUNmDnJq1KzOIiPnJ+rKqRe6hcxE3vIOPvpMrBYOn/Bl7zNlYJj/zQxXquAnozHUCf9Whnsg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inquirer-promise/node_modules/inquirer": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz",
+ "integrity": "sha512-QR+2TW90jnKk9LUUtbcA3yQXKt2rDEKMh6+BAZQIeumtzHexnwVLdPakSslGijXYLJCzFv7GMXbFCn0pA00EUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^1.1.0",
+ "ansi-regex": "^2.0.0",
+ "chalk": "^1.0.0",
+ "cli-cursor": "^1.0.1",
+ "cli-width": "^1.0.1",
+ "figures": "^1.3.5",
+ "lodash": "^3.3.1",
+ "readline2": "^1.0.1",
+ "run-async": "^0.1.0",
+ "rx-lite": "^3.1.2",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.0",
+ "through": "^2.3.6"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/inquirer-promise/node_modules/run-async": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
+ "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.3.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inquirer-promise/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.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==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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-reference": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+ "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.6"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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-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": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/kaiser": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/kaiser/-/kaiser-0.0.4.tgz",
+ "integrity": "sha512-m8ju+rmBqvclZmyrOXgGGhOYSjKJK6RN1NhqEltemY87UqZOxEkizg9TOy1vQSyJ01Wx6SAPuuN0iO2Mgislvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "earlgrey-runtime": ">=0.0.10"
+ }
+ },
+ "node_modules/klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
+ "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.25.4",
+ "@babel/types": "^7.25.4",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "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": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "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"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
+ "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/mute-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.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==",
+ "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==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "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/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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/pathe": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
+ "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/periscopic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
+ "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "is-reference": "^3.0.0"
+ }
+ },
+ "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": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/plugma": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/plugma/-/plugma-1.2.8.tgz",
+ "integrity": "sha512-CJUuMi5/nHifqRDJBBZeRqy7kLWghzB/Ec3rTxh2xJMzk0ekF2v2gA6Zwsqx+DeC1/6Ay0DhB9hCXNTLykYe3w==",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "chokidar": "^4.0.1",
+ "commander": "^12.1.0",
+ "express": "^4.18.2",
+ "fs-extra": "^11.2.0",
+ "inquirer": "^12.0.0",
+ "lodash": "^4.17.21",
+ "prettier": "^3.3.3",
+ "semver": "^7.6.3",
+ "uuid": "^10.0.0",
+ "vite": "^5.0.4",
+ "vite-plugin-singlefile": "^0.13.5",
+ "ws": "^8.16.0"
+ },
+ "bin": {
+ "plugma": "bin/cli.js"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+ "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": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/readline2": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
+ "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "mute-stream": "0.0.5"
+ }
+ },
+ "node_modules/readline2/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readline2/node_modules/mute-stream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
+ "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/reconnecting-websocket": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz",
+ "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
+ "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.11.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
+ "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-3.0.0.tgz",
+ "integrity": "sha512-wVGUX+BoKxYsavTA72i6qHcyLbjzM4LR4y/AmDCqlbuMAursZdDWO7PmgbGAUvD2SeEJ5iB99VSq/U51i/DNbw==",
+ "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.3",
+ "lodash": "^4.6.1",
+ "request": "^2.34"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/request/node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/request/node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "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"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "exit-hook": "^1.0.0",
+ "onetime": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz",
+ "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.31.0",
+ "@rollup/rollup-android-arm64": "4.31.0",
+ "@rollup/rollup-darwin-arm64": "4.31.0",
+ "@rollup/rollup-darwin-x64": "4.31.0",
+ "@rollup/rollup-freebsd-arm64": "4.31.0",
+ "@rollup/rollup-freebsd-x64": "4.31.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.31.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.31.0",
+ "@rollup/rollup-linux-arm64-musl": "4.31.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.31.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-gnu": "4.31.0",
+ "@rollup/rollup-linux-x64-musl": "4.31.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.31.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.31.0",
+ "@rollup/rollup-win32-x64-msvc": "4.31.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
+ "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rx-lite": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
+ "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==",
+ "dev": true
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.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/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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": {
+ "ms": "2.0.0"
+ }
+ },
+ "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/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==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
+ "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/slugify": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
+ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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/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==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/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==",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+ "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+ "dev": true,
+ "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==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "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==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz",
+ "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "4.2.19",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz",
+ "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/estree": "^1.0.1",
+ "acorn": "^8.9.0",
+ "aria-query": "^5.3.0",
+ "axobject-query": "^4.0.0",
+ "code-red": "^1.0.3",
+ "css-tree": "^2.3.1",
+ "estree-walker": "^3.0.3",
+ "is-reference": "^3.0.1",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.4",
+ "periscopic": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/svelte-hmr": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz",
+ "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^12.20 || ^14.13.1 || >= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3.19.0 || ^4.0.0"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.37.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
+ "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "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"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/test-exclude": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz",
+ "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^10.4.1",
+ "minimatch": "^9.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/test-exclude/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,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz",
+ "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+ "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+ "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "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": ">=8.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "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/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tsconfck": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz",
+ "integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "license": "0BSD"
+ },
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/type-fest": {
+ "version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz",
+ "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "engines": {
+ "node": ">= 10.0.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==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
+ "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "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": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.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,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/user-home": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-homedir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.12.tgz",
+ "integrity": "sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.4.tgz",
+ "integrity": "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.0",
+ "es-module-lexer": "^1.6.0",
+ "pathe": "^2.0.2",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite-plugin-singlefile": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz",
+ "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==",
+ "dependencies": {
+ "micromatch": "^4.0.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "rollup": ">=2.79.0",
+ "vite": ">=3.2.0"
+ }
+ },
+ "node_modules/vite-tsconfig-paths": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",
+ "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "globrex": "^0.1.2",
+ "tsconfck": "^3.0.3"
+ },
+ "peerDependencies": {
+ "vite": "*"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
+ "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.4.tgz",
+ "integrity": "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "3.0.4",
+ "@vitest/mocker": "3.0.4",
+ "@vitest/pretty-format": "^3.0.4",
+ "@vitest/runner": "3.0.4",
+ "@vitest/snapshot": "3.0.4",
+ "@vitest/spy": "3.0.4",
+ "@vitest/utils": "3.0.4",
+ "chai": "^5.1.2",
+ "debug": "^4.4.0",
+ "expect-type": "^1.1.0",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.2",
+ "std-env": "^3.8.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinypool": "^1.0.2",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
+ "vite-node": "3.0.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.0.4",
+ "@vitest/ui": "3.0.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "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,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "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/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
}
diff --git a/packages/plugma/package.json b/packages/plugma/package.json
index 91c58b6a..78243709 100644
--- a/packages/plugma/package.json
+++ b/packages/plugma/package.json
@@ -1,44 +1,142 @@
{
- "name": "plugma",
- "version": "1.2.7",
- "description": "",
- "main": "index.js",
- "type": "module",
- "bin": {
- "plugma": "./bin/cli.js"
- },
- "scripts": {
- "test": "echo \"Error: no test specified\"",
- "build-apps": "cd ../apps && npm run build",
- "copy-apps": "node scripts/copy-files.js",
- "build-and-copy-apps": "npm run build-apps && npm run copy-apps",
- "prepublishOnly": "npm run build-and-copy-apps",
- "copy-workflows": "cp -r ./templates/github/ .github/",
- "postinstall": "node ./migration/v1/check-migration.js"
- },
- "jest": {
- "transform": {}
- },
- "author": "",
- "license": "ISC",
- "dependencies": {
- "chalk": "^5.3.0",
- "chokidar": "^4.0.1",
- "commander": "^12.1.0",
- "express": "^4.18.2",
- "fs-extra": "^11.2.0",
- "inquirer": "^12.0.0",
- "lodash": "^4.17.21",
- "prettier": "^3.3.3",
- "semver": "^7.6.3",
- "uuid": "^10.0.0",
- "vite": "^5.0.4",
- "vite-plugin-singlefile": "^0.13.5",
- "ws": "^8.16.0"
- },
- "devDependencies": {
- "@babel/preset-env": "^7.26.0",
- "babel-jest": "^29.7.0",
- "jest": "^29.7.0"
- }
+ "name": "plugma",
+ "version": "2.0.0-beta.2",
+ "description": "",
+ "main": "index.js",
+ "type": "module",
+ "bin": {
+ "plugma": "./bin/plugma"
+ },
+ "files": [
+ "bin",
+ "dist",
+ "migration",
+ "templates",
+ "test"
+ ],
+ "scripts": {
+ "build:all-apps": "./build/build-all-apps.sh",
+ "build:dev-server": "cd apps/dev-server && vite build",
+ "build:figma-bridge": "cd apps/figma-bridge && vite build",
+ "build:runtime": "cd apps/plugma-runtime && vite build",
+ "build:plugma": "./build/header.sh Plugma && tsc -p tsconfig.build.json",
+ "build": "nr clean && nr build:plugma && nr build:all-apps",
+ "build:watch": "concurrently -c green,blue,yellow,cyan -n plugma,dev-app,bridge,runtime 'nr dev:plugma --watch' 'nr build:dev-server --watch' 'nr build:figma-bridge --watch' 'nr build:runtime --watch'",
+ "test-cmd": "nr clean && nr build && cd ../../sandbox && ../packages/plugma/bin/plugma",
+ "check": "tsc --noEmit",
+ "clean": "rm -rf dist && rm -rf apps/dist",
+ "copy-workflows": "cp -r ./templates/github/ .github/",
+ "dev:apps": "nr build:dev-server --watch && nr build:figma-bridge --watch",
+ "dev:plugma": "tsc -p tsconfig.build.json --watch",
+ "dev": "nr clean && concurrently -n apps,plugma 'nr dev:apps' 'nr dev:plugma'",
+ "lint:fix": "biome check --fix .",
+ "lint:unsafe-fix": "biome check --unsafe-fix .",
+ "lint": "biome check .",
+ "postinstall": "node ./migration/v1/check-migration.js",
+ "prepublishOnly": "nr clean && nr build",
+ "test:coverage": "vitest --run --coverage",
+ "test:watch": "vitest",
+ "test": "vitest --run"
+ },
+ "imports": {
+ "#core": "./dist/core/index.js",
+ "#core/*": "./dist/core/*",
+ "#commands": "./dist/commands/index.js",
+ "#commands/*": "./dist/commands/*",
+ "#utils": "./dist/utils/index.js",
+ "#utils/*": "./dist/utils/*",
+ "#tasks": "./dist/tasks/index.js",
+ "#tasks/*": "./dist/tasks/*",
+ "#vite-plugins": "./dist/vite-plugins/index.js",
+ "#vite-plugins/*": "./dist/vite-plugins/*",
+ "#testing/*": "./dist/testing/*",
+ "#test/*": "./test/*",
+ "#packageJson": "./package.json"
+ },
+ "exports": {
+ "./core": {
+ "import": "./dist/core/index.js",
+ "types": "./dist/core/index.d.ts"
+ },
+ "./commands": {
+ "import": "./dist/commands/index.js",
+ "types": "./dist/commands/index.d.ts"
+ },
+ "./commands/*": {
+ "import": "./dist/commands/*.js",
+ "types": "./dist/commands/*.d.ts"
+ },
+ "./utils": {
+ "import": "./dist/utils/index.js",
+ "types": "./dist/utils/index.d.ts"
+ },
+ "./tasks": {
+ "import": "./dist/tasks/index.js",
+ "types": "./dist/tasks/index.d.ts"
+ },
+ "./vite-plugins": {
+ "import": "./dist/vite-plugins/index.js",
+ "types": "./dist/vite-plugins/index.d.ts"
+ },
+ "./testing": {
+ "import": "./dist/testing/index.js",
+ "types": "./dist/testing/index.d.ts"
+ },
+ "./testing/figma": {
+ "import": "./dist/testing/figma/index.js",
+ "types": "./dist/testing/figma/index.d.ts"
+ }
+ },
+ "jest": {
+ "transform": {}
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "chokidar": "^4.0.1",
+ "commander": "^12.1.0",
+ "cross-dirname": "^0.1.0",
+ "debug": "^4.4.0",
+ "express": "^4.18.2",
+ "fs-extra": "^11.2.0",
+ "inquirer": "^12.0.0",
+ "lodash": "^4.17.21",
+ "plugma": "^1.2.8",
+ "prettier": "^3.3.3",
+ "semver": "^7.6.3",
+ "slugify": "^1.6.6",
+ "supports-color": "^10.0.0",
+ "uuid": "^10.0.0",
+ "vite": "5.4.12",
+ "vite-plugin-singlefile": "^0.13.5",
+ "ws": "^8.16.0"
+ },
+ "devDependencies": {
+ "@antfu/ni": "^23.2.0",
+ "@babel/preset-env": "^7.26.0",
+ "@figma/plugin-typings": "^1.107.0-beta.1",
+ "@sveltejs/vite-plugin-svelte": "^3.1.2",
+ "@types/debug": "^4.1.12",
+ "@types/express": "^5.0.0",
+ "@types/fs-extra": "^11.0.4",
+ "@types/node": "^22.12.0",
+ "@types/react": "^19.0.7",
+ "@types/react-dom": "^19.0.3",
+ "@types/uuid": "^10.0.0",
+ "@types/ws": "^8.5.13",
+ "@vitest/coverage-v8": "^3.0.4",
+ "@vitest/ui": "^3.0.4",
+ "biome": "^0.3.3",
+ "concurrently": "^9.1.2",
+ "dprint": "^0.48.0",
+ "reconnecting-websocket": "^4.4.0",
+ "source-map": "^0.7.4",
+ "svelte": "^4.2.19",
+ "terser": "^5.37.0",
+ "type-fest": "^4.33.0",
+ "typescript": "^5.7.3",
+ "vite-tsconfig-paths": "^5.1.4",
+ "vitest": "^3.0.3"
+ }
}
diff --git a/packages/plugma/plugma.test.js b/packages/plugma/plugma.test.js
deleted file mode 100644
index de236ec4..00000000
--- a/packages/plugma/plugma.test.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { execSync } from 'child_process';
-
-describe('create plugma CLI', () => {
- test('should run plugma dev without errors', () => {
- // Set up process.argv as if we're running "plugma dev"
- process.argv = ['node', 'create-plugma', 'dev'];
-
- // Execute the command and capture output
- const output = execSync('node ../create-plugma/create-plugma.js', { encoding: 'utf-8' });
-
- console.log(output)
-
- // Assert the expected output
- expect(output).toContain('Expected output from plugma dev');
- });
-});
diff --git a/packages/plugma/scripts/copy-files.js b/packages/plugma/scripts/copy-files.js
deleted file mode 100644
index ae2440aa..00000000
--- a/packages/plugma/scripts/copy-files.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { readdir, copyFile, mkdir, existsSync } from 'fs';
-import { join } from 'path';
-
-// Source and destination directories
-const sourceDir = join(process.cwd(), '../apps/dist');
-const destDir = join(process.cwd(), 'apps');
-
-// Ensure destination directory exists
-if (!existsSync(destDir)) {
- mkdir(destDir, { recursive: true }, (err) => {
- if (err) throw err;
- });
-}
-
-// Copy all files from source to destination
-readdir(sourceDir, (err, files) => {
- if (err) throw err;
-
- files.forEach(file => {
- const srcPath = join(sourceDir, file);
- const destPath = join(destDir, file);
-
- copyFile(srcPath, destPath, (err) => {
- if (err) throw err;
- console.log(`${file} was copied to ${destPath}`);
- });
- });
-});
diff --git a/packages/plugma/src/bin/cli.ts b/packages/plugma/src/bin/cli.ts
new file mode 100644
index 00000000..5a2c24e5
--- /dev/null
+++ b/packages/plugma/src/bin/cli.ts
@@ -0,0 +1,209 @@
+import { readPlugmaPackageJson } from '#utils/fs/read-json.js';
+
+import { Command } from 'commander';
+
+import {
+ type BuildCommandOptions,
+ type DevCommandOptions,
+ type PreviewCommandOptions,
+ type ReleaseCommandOptions,
+ type TestCommandOptions,
+ build,
+ dev,
+ preview,
+ release,
+ test,
+} from '#commands';
+import { colorStringify, debugLogger, defaultLogger } from '#utils';
+import chalk from 'chalk';
+import type { ReleaseType } from './types.js';
+
+// Read package.json to get the version
+const packageJson = await readPlugmaPackageJson();
+const version = packageJson.version;
+
+// Initialize Commander
+const program = new Command();
+
+// Set version for the program
+program
+ .name('plugma')
+ .description('A modern Figma plugin development toolkit')
+ .version(version, '-v, --version', 'Output the current version')
+ .addHelpText(
+ 'beforeAll',
+ `${chalk.blue.bold('Plugma')} ${chalk.grey(`v${version}`)}\n`,
+ );
+
+// Global Debug Option
+const handleDebug = async (
+ command: string,
+ options: Record & { debug?: boolean },
+): Promise => {
+ if (options.debug) {
+ process.env.PLUGMA_DEBUG = 'true';
+ defaultLogger.setOptions({ debug: true });
+ debugLogger.info('Debug mode enabled - preloading source maps...');
+
+ // Preload source maps before any logging occurs
+ const { preloadSourceMaps } = await import('#utils/fs/map-to-source.js');
+ await preloadSourceMaps();
+
+ debugLogger.info(`command: ${command}`);
+ debugLogger.info(`arguments: ${colorStringify(options)}\n`);
+ }
+};
+
+// Dev Command
+program
+ .command('dev')
+ .description('Start a server to develop your plugin')
+ .addHelpText(
+ 'after',
+ '\nStart a server to develop your plugin. This command builds the ui.html and points it to the dev server making it easier to develop and debug your plugin.',
+ )
+ .option('-p, --port ', 'Specify a port number for the plugin preview')
+ .option('-t, --toolbar', 'Display the developer toolbar within the plugin UI')
+ .option('-m, --mode ', 'Specify the mode', 'development')
+ .option('-o, --output ', 'Specify the output directory', 'dist')
+ .option('-ws, --websockets', 'Enable websockets', false)
+ .option('-d, --debug', 'Enable debug mode', false)
+ .action(function (this: Command, options: DevCommandOptions) {
+ handleDebug(this.name(), options);
+ dev(options);
+ })
+ .addHelpText(
+ 'after',
+ `
+ Examples:
+ plugma dev --port 3000 --websockets
+ plugma dev --mode test
+ `,
+ );
+
+// Preview Command
+program
+ .command('preview')
+ .description('Preview your plugin')
+ .addHelpText(
+ 'after',
+ '\nPreview your plugin in any browser to see how it looks and works. Make sure the plugin is open in the Figma desktop app for this to work.',
+ )
+ .option('-p, --port ', 'Specify a port number for the plugin preview')
+ .option('-t, --toolbar', 'Display the developer toolbar within the plugin UI')
+ .option('-m, --mode ', 'Specify the mode', 'development')
+ .option('-o, --output ', 'Specify the output directory', 'dist')
+ .option('-d, --debug', 'Enable debug mode', false)
+ .action(function (this: Command, options: PreviewCommandOptions) {
+ handleDebug(this.name(), options);
+ preview(options);
+ })
+ .addHelpText(
+ 'after',
+ `
+ Examples:
+ plugma preview --port 3000
+ `,
+ );
+
+// Build Command
+program
+ .command('build')
+ .description('Create a build ready for publishing')
+ .addHelpText(
+ 'after',
+ '\nThis command compiles and bundles your plugin, preparing it for distribution.',
+ )
+ .option('-w, --watch', 'Watch for changes and rebuild automatically')
+ .option('-m, --mode ', 'Specify the mode', 'production')
+ .option('-o, --output ', 'Specify the output directory', 'dist')
+ .option('-d, --debug', 'Enable debug mode', false)
+ .action(function (this: Command, options: BuildCommandOptions) {
+ handleDebug(this.name(), options);
+ build(options);
+ })
+ .addHelpText(
+ 'after',
+ `
+ Examples:
+ plugma build --watch
+ `,
+ );
+
+// Release Command
+program
+ .command('release')
+ .argument('[type]', 'Release type or version number', 'stable')
+ .description('Prepare a release for your plugin')
+ .option('-t, --title ', 'Specify a title for the release')
+ .option('-n, --notes ', 'Specify release notes')
+ .option('-d, --debug', 'Enable debug mode', false)
+ .option('-o, --output ', 'Specify the output directory', 'dist')
+ .action(function (
+ this: Command,
+ type: string,
+ options: ReleaseCommandOptions,
+ ) {
+ handleDebug(this.name(), { ...options, type });
+
+ const validReleaseTypes: ReleaseType[] = [
+ 'alpha',
+ 'beta',
+ 'stable',
+ ] as const;
+ const releaseOptions: ReleaseCommandOptions = {
+ command: 'release',
+ title: options.title,
+ notes: options.notes,
+ output: options.output,
+ debug: options.debug,
+ };
+
+ if (
+ validReleaseTypes.includes(type as (typeof validReleaseTypes)[number])
+ ) {
+ releaseOptions.type = type as (typeof validReleaseTypes)[number];
+ } else if (/^\d+$/.test(type)) {
+ releaseOptions.version = type;
+ } else {
+ console.error(
+ 'Invalid version: must be a whole integer or a release type (alpha, beta, stable)',
+ );
+ process.exit(1);
+ }
+
+ release(releaseOptions);
+ })
+ .addHelpText(
+ 'after',
+ `
+ Examples:
+ plugma release
+ plugma release alpha --title "Alpha Release" --notes "Initial alpha release"
+ `,
+ );
+
+// Test Command
+program
+ .command('test')
+ .description('Run tests for your plugin')
+ .option('-w, --watch', 'Watch for changes and rerun tests')
+ .option('-t, --timeout ', 'Test timeout in milliseconds', '10000')
+ .option('-p, --port ', 'WebSocket server port')
+ .option('-d, --debug', 'Enable debug mode', false)
+ .action(function (this: Command, options: TestCommandOptions) {
+ handleDebug(this.name(), options);
+ test(options);
+ })
+ .addHelpText(
+ 'after',
+ `
+ Examples:
+ plugma test
+ plugma test --watch
+ plugma test --timeout 5000
+ `,
+ );
+
+// Parse arguments
+program.parse(process.argv);
diff --git a/packages/plugma/src/bin/types.ts b/packages/plugma/src/bin/types.ts
new file mode 100644
index 00000000..a790b3c5
--- /dev/null
+++ b/packages/plugma/src/bin/types.ts
@@ -0,0 +1,21 @@
+/**
+ * Types for the CLI interface
+ */
+
+export interface ScriptOptions {
+ port?: number;
+ toolbar?: boolean;
+ mode?: string;
+ output?: string;
+ websockets?: boolean;
+ watch?: boolean;
+}
+
+export interface ReleaseOptions {
+ title?: string;
+ notes?: string;
+ type?: 'alpha' | 'beta' | 'stable';
+ version?: string;
+}
+
+export type ReleaseType = 'alpha' | 'beta' | 'stable';
diff --git a/packages/plugma/src/commands/README.md b/packages/plugma/src/commands/README.md
new file mode 100644
index 00000000..3677df84
--- /dev/null
+++ b/packages/plugma/src/commands/README.md
@@ -0,0 +1,197 @@
+# Commands System
+
+This directory contains the core command implementations for the Plugma CLI. The system is built around a task-based architecture where each command executes a sequence of reusable tasks.
+
+## Architecture Overview
+
+### Directory Structure
+
+```
+commands/
+├── README.md # This file
+├── types.ts # Command type definitions
+├── config.ts # Configuration utilities
+├── index.ts # Command exports
+├── tasks
+│ ├── build
+│ │ ├── main.ts
+│ │ ├── manifest.ts
+│ │ ├── ui.ts
+│ │ └── wrap-plugin-ui.ts
+│ ├── common
+│ │ ├── ensure-dist.ts
+│ │ ├── get-files.ts
+│ │ └── prompt.ts
+│ ├── release
+│ │ ├── create-release-yml.ts
+│ │ ├── git-release.ts
+│ │ ├── git-status.ts
+│ │ ├── version-update.ts
+│ │ └── workflow-templates.ts
+│ ├── server
+│ │ ├── restart-vite.ts
+│ │ ├── vite.ts
+│ │ └── websocket.ts
+│ ├── test
+│ │ ├── inject-test-code.ts
+│ │ ├── run-vitest.ts
+│ │ └── start-test-server.ts
+│ └── runner.ts
+├── dev.ts # Development command
+├── preview.ts # Preview command
+├── build.ts # Build command
+└── release.ts # Release command
+```
+
+### Core Concepts
+
+1. **Tasks**: Self-contained units of work with their own type definitions and results
+2. **Commands**: High-level operations that execute task sequences
+3. **Task Results**: Strongly typed values returned by tasks
+4. **Task Context**: Runtime context containing options and previous task results
+5. **Command Options**: Configuration options specific to each command
+
+## Commands
+
+### `dev` Command
+- **Purpose**: Starts a development server with live reload
+- **Options**:
+ - `debug`: Enable debug logging
+ - `mode`: Development mode (defaults to 'development')
+ - `port`: Server port (defaults to 3000)
+ - `output`: Output directory (defaults to 'dist')
+- **Tasks Executed**:
+ 1. `common:get-files`: Load plugin files and configuration
+ 2. `common:show-plugma-prompt`: Display startup information
+ 3. `build:manifest`: Generate plugin manifest
+ 4. `build:wrap-plugin-ui`: Create development UI
+ 5. `build:main`: Build plugin main script
+ 6. `server:start-websockets-server`: Start WebSocket server for live reload
+ 7. `server:start-vite-server`: Start Vite dev server
+
+### `preview` Command
+- **Purpose**: Preview production build with development server
+- **Options**: Same as `dev` command
+- **Tasks Executed**: Same sequence as `dev` command but in preview mode
+
+### `build` Command
+- **Purpose**: Create production build of the plugin
+- **Options**:
+ - `debug`: Enable debug logging
+ - `mode`: Build mode (defaults to 'production')
+ - `output`: Output directory (defaults to 'dist')
+- **Tasks Executed**:
+ 1. `common:get-files`: Load plugin files and configuration
+ 2. `common:show-plugma-prompt`: Display build information
+ 3. `build:manifest`: Generate plugin manifest
+ 4. `build:ui`: Build production UI
+ 5. `build:main`: Build production main script
+
+## Tasks
+
+### Common Tasks
+
+#### `common:get-files`
+- **Purpose**: Loads user configuration and files
+- **Supported Commands**: All
+- **Returns**:
+ ```typescript
+ {
+ plugmaPkg: PackageJson; // Plugin package info
+ files: UserFiles; // User source files
+ config: PluginConfig; // Plugin configuration
+ }
+ ```
+- **Location**: `tasks/common/files.ts`
+
+#### `common:show-plugma-prompt`
+- **Purpose**: Displays command startup information
+- **Supported Commands**: All
+- **Returns**: void
+- **Location**: `tasks/common/prompt.ts`
+- **Requires**: Results from `common:get-files`
+
+### Build Tasks
+
+#### `build:manifest`
+- **Purpose**: Generates plugin manifest
+- **Supported Commands**: All
+- **Returns**:
+ ```typescript
+ {
+ raw: ManifestFile; // Original manifest
+ processed: ManifestFile; // Processed manifest
+ }
+ ```
+- **Location**: `tasks/build/manifest.ts`
+- **Requires**: Results from `common:get-files`
+
+#### `build:wrap-plugin-ui`
+- **Purpose**: Creates development UI if none exists
+- **Supported Commands**: dev, preview
+- **Returns**: void
+- **Location**: `tasks/build/ui.ts`
+- **Requires**: Results from `common:get-files`
+
+#### `build:ui`
+- **Purpose**: Builds production UI with Vite
+- **Supported Commands**: build
+- **Returns**: void
+- **Location**: `tasks/build/ui.ts`
+- **Requires**: Results from `common:get-files`
+
+#### `build:main`
+- **Purpose**: Builds plugin main script
+- **Supported Commands**: All
+- **Returns**: void
+- **Location**: `tasks/build/main.ts`
+- **Requires**: Results from `common:get-files`, `build:manifest`
+
+### Server Tasks
+
+#### `server:start-websockets-server`
+- **Purpose**: Starts WebSocket server for live reload
+- **Supported Commands**: dev, preview
+- **Returns**:
+ ```typescript
+ {
+ port: number; // Server port
+ server: WebSocketServer; // Server instance
+ }
+ ```
+- **Location**: `tasks/server/websocket.ts`
+- **Requires**: Results from `common:get-files`
+
+#### `server:start-vite-server`
+- **Purpose**: Starts Vite development server
+- **Supported Commands**: dev, preview
+- **Returns**: void
+- **Location**: `tasks/server/vite.ts`
+- **Requires**: Results from `common:get-files`, `build:manifest`
+
+## Task Development
+
+### Creating a New Task
+
+1. Create a new file in the appropriate tasks directory
+2. Define the task's result type (if any)
+3. Implement the task using `TaskDefinition`
+4. Export both type and implementation
+
+Example:
+```typescript
+// tasks/build/ui.ts
+export interface BuildUiResult {
+ outputPath: string;
+}
+
+export const buildUi: TaskDefinition = {
+ name: 'build:ui',
+ supportedCommands: ['build'],
+ execute: async ({ options, results }) => {
+ const files = getTaskResult(results, getFiles);
+ if (!files) throw new Error('get-files task must run first');
+ // Implementation...
+ }
+};
+```
diff --git a/packages/plugma/src/commands/build.test.ts b/packages/plugma/src/commands/build.test.ts
new file mode 100644
index 00000000..912a5824
--- /dev/null
+++ b/packages/plugma/src/commands/build.test.ts
@@ -0,0 +1,104 @@
+import {
+ BuildMainTask,
+ BuildManifestTask,
+ BuildUiTask,
+ EnsureDistTask,
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+} from '#tasks';
+import { serial } from '#tasks/runner.js';
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+import { build } from './build.js';
+import type { BuildCommandOptions } from './types.js';
+
+// Mock the task runner module
+vi.mock('#tasks/runner.js', () => {
+ const runTasksFn = vi.fn(() => Promise.resolve());
+ return {
+ task: vi.fn((name, fn) => ({ name, run: fn })),
+ serial: vi.fn(() => runTasksFn),
+ parallel: vi.fn(() => vi.fn(() => Promise.resolve())),
+ run: vi.fn(),
+ log: vi.fn(),
+ };
+});
+
+describe('Build Command', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ describe('Task Execution', () => {
+ test('should execute tasks in correct order', async () => {
+ const options: BuildCommandOptions = { debug: false, command: 'build' };
+ await build(options);
+
+ expect(serial).toHaveBeenCalledWith(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ EnsureDistTask,
+ BuildManifestTask,
+ BuildUiTask,
+ BuildMainTask,
+ );
+
+ // Verify the options passed to the returned function
+ const runTasks = vi.mocked(serial).mock.results[0].value;
+ expect(runTasks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...options,
+ mode: 'production',
+ port: 3000,
+ output: 'dist',
+ instanceId: expect.any(String),
+ }),
+ );
+ });
+
+ test('should use provided options', async () => {
+ const options: BuildCommandOptions = {
+ debug: true,
+ mode: 'development',
+ output: 'build',
+ command: 'build',
+ };
+ await build(options);
+
+ // Verify the options passed to the returned function
+ const runTasks = vi.mocked(serial).mock.results[0].value;
+ expect(runTasks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...options,
+ port: 3000,
+ instanceId: expect.any(String),
+ }),
+ );
+ });
+
+ test('should not start servers in build mode', async () => {
+ await build({ debug: false, command: 'build' });
+
+ expect(serial).toHaveBeenCalledWith(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ EnsureDistTask,
+ BuildManifestTask,
+ BuildUiTask,
+ BuildMainTask,
+ );
+ });
+ });
+
+ describe('Error Handling', () => {
+ test('should handle task execution errors', async () => {
+ const error = new Error('Task execution failed');
+ vi.mocked(serial).mockImplementationOnce(() => () => {
+ throw error;
+ });
+
+ await expect(build({ debug: false, command: 'build' })).rejects.toThrow(
+ error,
+ );
+ });
+ });
+});
diff --git a/packages/plugma/src/commands/build.ts b/packages/plugma/src/commands/build.ts
new file mode 100644
index 00000000..2fb15d4d
--- /dev/null
+++ b/packages/plugma/src/commands/build.ts
@@ -0,0 +1,69 @@
+/**
+ * Build command implementation
+ * Handles production builds and watch mode for plugin development
+ */
+
+import type { PluginOptions } from '#core/types.js';
+import EnsureDistTask from '#tasks/common/ensure-dist.js';
+import { Logger } from '#utils/log/logger.js';
+import { nanoid } from 'nanoid';
+import { BuildMainTask } from '../tasks/build/main.js';
+import { BuildManifestTask } from '../tasks/build/manifest.js';
+import { BuildUiTask } from '../tasks/build/ui.js';
+import { GetFilesTask } from '../tasks/common/get-files.js';
+import { ShowPlugmaPromptTask } from '../tasks/common/prompt.js';
+import { serial } from '../tasks/runner.js';
+import type { BuildCommandOptions } from './types.js';
+
+/**
+ * Main build command implementation
+ * Creates production-ready builds of the plugin
+ *
+ * @param options - Build configuration options
+ * @remarks
+ * The build command creates optimized production builds:
+ * - Minified and optimized code
+ * - Production UI build
+ * - Manifest generation
+ * - Optional watch mode for development
+ */
+export async function build(options: BuildCommandOptions): Promise {
+ const log = new Logger({ debug: options.debug });
+
+ try {
+ log.info('Starting production build...');
+ log.debug(`Build options: ${JSON.stringify(options)}`);
+
+ const pluginOptions: PluginOptions = {
+ ...options,
+ mode: options.mode || 'production',
+ instanceId: nanoid(),
+ port: 3000, // Build command doesn't need a port, but it's required by PluginOptions
+ output: options.output || 'dist',
+ command: 'build',
+ };
+
+ log.debug(`Plugin options: ${JSON.stringify(pluginOptions)}`);
+
+ // Execute tasks in sequence
+ log.info('Executing tasks...');
+
+ // Pass the task objects directly - BuildMainTask first, BuildManifestTask last
+ const results = await serial(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ EnsureDistTask, // ensures a clean dist directory
+ BuildManifestTask, // creates a manifest
+ BuildUiTask, // copies and transforms UI
+ BuildMainTask, // builds the main script
+ )(pluginOptions);
+
+ // log.debug(`Task execution results: ${JSON.stringify(results, null, 2)}`);
+
+ log.success('Production build completed successfully');
+ } catch (error) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ log.error('Failed to build plugin:', errorMessage);
+ throw error;
+ }
+}
diff --git a/packages/plugma/src/commands/dev.test.ts b/packages/plugma/src/commands/dev.test.ts
new file mode 100644
index 00000000..2e8b32fe
--- /dev/null
+++ b/packages/plugma/src/commands/dev.test.ts
@@ -0,0 +1,140 @@
+import {
+ BuildMainTask,
+ BuildManifestTask,
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ StartViteServerTask,
+ StartWebSocketsServerTask,
+ WrapPluginUiTask,
+} from '#tasks';
+import { serial } from '#tasks/runner.js';
+import { Logger } from '#utils/log/logger.js';
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+import { dev } from './dev.js';
+import type { DevCommandOptions } from './types.js';
+
+// Mock the task runner module
+vi.mock('#tasks/runner.js', () => {
+ const runTasksFn = vi.fn(() => Promise.resolve());
+ return {
+ task: vi.fn((name, fn) => ({ name, run: fn })),
+ serial: vi.fn(() => runTasksFn),
+ parallel: vi.fn(() => vi.fn(() => Promise.resolve())),
+ run: vi.fn(),
+ log: vi.fn(),
+ };
+});
+
+// Mock nanoid and getRandomPort
+vi.mock('nanoid', () => ({
+ nanoid: vi.fn(() => 'test-instance-id'),
+}));
+
+vi.mock('../utils/get-random-port.js', () => ({
+ getRandomPort: vi.fn(() => 12345),
+}));
+
+// Mock Logger
+vi.mock('#utils/log/logger.js', () => {
+ const mockLoggerMethods = {
+ info: vi.fn(),
+ success: vi.fn(),
+ error: vi.fn(),
+ debug: vi.fn(),
+ };
+ return {
+ Logger: vi.fn().mockImplementation(() => mockLoggerMethods),
+ };
+});
+
+describe('Dev Command', () => {
+ let mockLogger: ReturnType;
+
+ beforeEach(() => {
+ vi.clearAllMocks();
+ mockLogger = new Logger({ debug: false });
+ });
+
+ describe('Task Execution', () => {
+ test('should execute tasks in correct order with default options', async () => {
+ const options: DevCommandOptions = {
+ debug: false,
+ command: 'dev',
+ };
+ await dev(options);
+
+ expect(serial).toHaveBeenCalledWith(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ BuildManifestTask,
+ WrapPluginUiTask,
+ BuildMainTask,
+ StartWebSocketsServerTask,
+ StartViteServerTask,
+ );
+
+ // Verify the options passed to the returned function
+ const runTasks = vi.mocked(serial).mock.results[0].value;
+ expect(runTasks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...options,
+ mode: 'development',
+ output: 'dist',
+ instanceId: 'test-instance-id',
+ port: 12345,
+ cwd: expect.any(String),
+ }),
+ );
+ });
+
+ test('should use provided options over defaults', async () => {
+ const options: DevCommandOptions = {
+ debug: true,
+ command: 'dev',
+ mode: 'production',
+ output: 'custom-dist',
+ port: 3000,
+ cwd: '/custom/path',
+ };
+ await dev(options);
+
+ const runTasks = vi.mocked(serial).mock.results[0].value;
+ expect(runTasks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...options,
+ instanceId: 'test-instance-id',
+ }),
+ );
+ });
+
+ test('should handle errors gracefully', async () => {
+ const error = new Error('Task execution failed');
+ vi.mocked(serial).mockImplementationOnce(() => () => {
+ throw error;
+ });
+
+ const options: DevCommandOptions = {
+ debug: false,
+ command: 'dev',
+ };
+ await expect(dev(options)).rejects.toThrow(error);
+ });
+
+ test('should log appropriate messages during execution', async () => {
+ const options: DevCommandOptions = {
+ debug: true,
+ command: 'dev',
+ };
+
+ await dev(options);
+
+ expect(mockLogger.info).toHaveBeenCalledWith(
+ 'Starting development server...',
+ );
+ expect(mockLogger.info).toHaveBeenCalledWith('Executing tasks...');
+ expect(mockLogger.success).toHaveBeenCalledWith(
+ 'Development server started successfully',
+ );
+ });
+ });
+});
diff --git a/packages/plugma/src/commands/dev.ts b/packages/plugma/src/commands/dev.ts
new file mode 100644
index 00000000..221668fa
--- /dev/null
+++ b/packages/plugma/src/commands/dev.ts
@@ -0,0 +1,68 @@
+/**
+ * Development command implementation
+ * Handles development server and file watching for plugin development
+ */
+
+import type { DevCommandOptions } from '#commands/types.js';
+import {
+ BuildMainTask,
+ BuildManifestTask,
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ StartViteServerTask,
+ StartWebSocketsServerTask,
+ WrapPluginUiTask,
+} from '#tasks';
+import { serial } from '#tasks/runner.js';
+import { Logger } from '#utils/log/logger.js';
+import { nanoid } from 'nanoid';
+import { getRandomPort } from '../utils/get-random-port.js';
+
+/**
+ * Main development command implementation
+ * Starts a development server with live reload capabilities
+ *
+ * @param options - Development configuration options
+ * @remarks
+ * The dev command sets up a full development environment with:
+ * - File watching and live reload
+ * - Development UI with placeholder
+ * - WebSocket communication
+ * - Vite development server
+ * - Output file validation to ensure integrity
+ */
+export async function dev(options: DevCommandOptions): Promise {
+ const log = new Logger({ debug: options.debug });
+
+ try {
+ log.info('Starting development server...');
+
+ const pluginOptions = {
+ ...options,
+ mode: options.mode || 'development',
+ instanceId: nanoid(),
+ port: options.port || getRandomPort(),
+ output: options.output || 'dist',
+ command: 'dev' as const,
+ cwd: options.cwd || process.cwd(),
+ };
+
+ // Execute tasks in sequence
+ log.info('Executing tasks...');
+ await serial(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ BuildManifestTask,
+ WrapPluginUiTask,
+ BuildMainTask,
+ StartWebSocketsServerTask,
+ StartViteServerTask,
+ )(pluginOptions);
+
+ log.success('Development server started successfully');
+ } catch (error) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ log.error('Failed to start development server:', errorMessage);
+ throw error;
+ }
+}
diff --git a/packages/plugma/src/commands/index.ts b/packages/plugma/src/commands/index.ts
new file mode 100644
index 00000000..9a0e654e
--- /dev/null
+++ b/packages/plugma/src/commands/index.ts
@@ -0,0 +1,8 @@
+//@index(['./!(*.test).ts', './*/index.ts'], f => `export * from '${f.path}.js';`)
+export * from "./build.js";
+export * from "./dev.js";
+export * from "./preview.js";
+export * from "./release.js";
+export * from "./test-cmd.js";
+export * from "./types.js";
+//@endindex
diff --git a/packages/plugma/src/commands/preview.test.ts b/packages/plugma/src/commands/preview.test.ts
new file mode 100644
index 00000000..5867f8bc
--- /dev/null
+++ b/packages/plugma/src/commands/preview.test.ts
@@ -0,0 +1,76 @@
+import {
+ BuildMainTask,
+ BuildManifestTask,
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ StartViteServerTask,
+ StartWebSocketsServerTask,
+ WrapPluginUiTask,
+} from '#tasks';
+import { serial } from '#tasks/runner.js';
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+import { preview } from './preview.js';
+import type { PreviewCommandOptions } from './types.js';
+
+// Mock the task runner module
+vi.mock('#tasks/runner.js', () => {
+ const runTasksFn = vi.fn(() => Promise.resolve());
+ return {
+ task: vi.fn((name, fn) => ({ name, run: fn })),
+ serial: vi.fn(() => runTasksFn),
+ parallel: vi.fn(() => vi.fn(() => Promise.resolve())),
+ run: vi.fn(),
+ log: vi.fn(),
+ };
+});
+
+describe('Preview Command', () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ describe('Task Execution', () => {
+ test('should execute tasks in correct order', async () => {
+ const options: PreviewCommandOptions = {
+ debug: false,
+ command: 'preview',
+ };
+ await preview(options);
+
+ expect(serial).toHaveBeenCalledWith(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ BuildManifestTask,
+ WrapPluginUiTask,
+ BuildMainTask,
+ StartWebSocketsServerTask,
+ StartViteServerTask,
+ );
+
+ // Verify the options passed to the returned function
+ const runTasks = vi.mocked(serial).mock.results[0].value;
+ expect(runTasks).toHaveBeenCalledWith(
+ expect.objectContaining({
+ ...options,
+ mode: 'preview',
+ output: 'dist',
+ instanceId: expect.any(String),
+ port: expect.any(Number),
+ }),
+ );
+ });
+
+ test('should handle errors gracefully', async () => {
+ const error = new Error('Task execution failed');
+ vi.mocked(serial).mockImplementationOnce(() => () => {
+ throw error;
+ });
+
+ const options: PreviewCommandOptions = {
+ debug: false,
+ command: 'preview',
+ };
+ await expect(preview(options)).rejects.toThrow(error);
+ });
+ });
+});
diff --git a/packages/plugma/src/commands/preview.ts b/packages/plugma/src/commands/preview.ts
new file mode 100644
index 00000000..f92c134a
--- /dev/null
+++ b/packages/plugma/src/commands/preview.ts
@@ -0,0 +1,69 @@
+/**
+ * Preview command implementation
+ * Handles preview server for testing plugin builds
+ */
+
+import type { PluginOptions } from '#core/types.js';
+import {
+ BuildMainTask,
+ BuildManifestTask,
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ StartViteServerTask,
+ StartWebSocketsServerTask,
+ WrapPluginUiTask,
+} from '#tasks';
+import { getRandomPort } from '#utils';
+import { Logger } from '#utils/log/logger.js';
+import { nanoid } from 'nanoid';
+import { serial } from '../tasks/runner.js';
+import type { PreviewCommandOptions } from './types.js';
+
+/**
+ * Main preview command implementation
+ * Sets up a preview environment for testing built plugins
+ *
+ * @param options - Preview configuration options
+ * @remarks
+ * The preview command is similar to dev but optimized for testing:
+ * - Uses production-like builds
+ * - Includes development server
+ * - Supports WebSocket communication
+ * - Enables testing plugin functionality
+ */
+export async function preview(options: PreviewCommandOptions): Promise {
+ const log = new Logger({ debug: options.debug });
+
+ try {
+ log.info('Starting preview server...');
+
+ const pluginOptions: PluginOptions = {
+ ...options,
+ mode: options.mode || 'preview',
+ instanceId: nanoid(),
+ port: options.port || getRandomPort(),
+ output: options.output || 'dist',
+ command: 'preview' as const,
+ cwd: options.cwd || process.cwd(),
+ websockets: options.websockets ?? true,
+ };
+
+ // Execute tasks in sequence
+ log.info('Executing tasks...');
+ await serial(
+ GetFilesTask,
+ ShowPlugmaPromptTask,
+ BuildManifestTask,
+ WrapPluginUiTask,
+ BuildMainTask,
+ StartWebSocketsServerTask,
+ StartViteServerTask,
+ )(pluginOptions);
+
+ log.success('Preview server started successfully');
+ } catch (error) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ log.error('Failed to start preview server:', errorMessage);
+ throw error;
+ }
+}
diff --git a/packages/plugma/src/commands/release.ts b/packages/plugma/src/commands/release.ts
new file mode 100644
index 00000000..fa3f66f4
--- /dev/null
+++ b/packages/plugma/src/commands/release.ts
@@ -0,0 +1,62 @@
+import {
+ gitRelease,
+ gitStatus,
+ versionUpdate,
+ workflowTemplates,
+} from '#tasks/release/index.js';
+import type { ReleaseCommandOptions } from './types.js';
+
+/**
+ * Main release command implementation
+ * @param options - Release configuration options
+ */
+export async function release(options: ReleaseCommandOptions): Promise {
+ // Check Git repository status
+ const status = await gitStatus();
+
+ if (!status.isGitRepo) {
+ throw new Error(
+ 'This is not a Git repository. Please initialize a Git repository before proceeding.',
+ );
+ }
+ if (!status.isClean) {
+ throw new Error(
+ 'Working directory has uncommitted changes. Please commit or stash them before proceeding.',
+ );
+ }
+
+ // Update workflow templates
+ const { updatedTemplates, releaseWorkflowPath } = await workflowTemplates();
+
+ // Update version in package.json
+ const { newTag } = await versionUpdate({
+ version: options.version,
+ type: options.type || 'stable',
+ });
+
+ // Commit changes and create release
+ const filesToStage = ['package.json'];
+ if (updatedTemplates) {
+ filesToStage.push(releaseWorkflowPath);
+ }
+
+ // Stage files before creating release
+ const { execSync } = await import('node:child_process');
+ for (const file of filesToStage) {
+ execSync(`git add ${file}`, { stdio: 'inherit' });
+ }
+
+ const releaseResult = await gitRelease({
+ tag: newTag,
+ title: options.title,
+ notes: options.notes,
+ });
+
+ // If release was successful, run build
+ if (releaseResult.pushed) {
+ execSync('plugma build', { stdio: 'inherit' });
+ }
+
+ // TODO: review this...
+ // CreateReleaseYmlTask.run(options as any);
+}
diff --git a/packages/plugma/src/commands/test-cmd.ts b/packages/plugma/src/commands/test-cmd.ts
new file mode 100644
index 00000000..94711d1d
--- /dev/null
+++ b/packages/plugma/src/commands/test-cmd.ts
@@ -0,0 +1,61 @@
+/**
+ * Test command implementation
+ * Handles running tests for Figma plugins
+ */
+
+import type { PluginOptions } from '#core/types.js';
+import { InjectTestCodeTask } from '#tasks';
+import { getRandomPort } from '#utils/get-random-port.js';
+import { Logger } from '#utils/log/logger.js';
+import { nanoid } from 'nanoid';
+import { serial } from '../tasks/runner.js';
+// import { InjectTestCodeTask } from '../../tasks/test/inject-test-code.js';
+import { RunVitestTask } from '../tasks/test/run-vitest.js';
+import { StartTestServerTask } from '../tasks/test/start-test-server.js';
+import type { TestCommandOptions } from './types.js';
+
+/**
+ * Main test command implementation
+ * Sets up and runs tests for Figma plugins
+ *
+ * @param options - Test configuration options
+ * @remarks
+ * The test command:
+ * 1. Injects test framework code into the plugin
+ * 2. Starts WebSocket server for test communication
+ * 3. Runs tests using Vitest
+ */
+export async function test(options: TestCommandOptions): Promise {
+ const log = new Logger({ debug: options.debug });
+
+ try {
+ log.info('Starting test environment...');
+
+ const pluginOptions: PluginOptions = {
+ ...options,
+ mode: 'test',
+ instanceId: nanoid(),
+ port: options.port || getRandomPort(),
+ command: 'test',
+ };
+
+ // Execute tasks in sequence
+ log.info('Executing test tasks...');
+ const results = await serial(
+ InjectTestCodeTask, // Inject test framework
+ StartTestServerTask, // Start WebSocket server
+ RunVitestTask, // Run tests with Vitest
+ )(pluginOptions);
+
+ if (results['test:run-vitest'].success) {
+ log.success('All tests passed');
+ } else {
+ log.error('Some tests failed');
+ process.exit(1);
+ }
+ } catch (error) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ log.error('Failed to run tests:', errorMessage);
+ throw error;
+ }
+}
diff --git a/packages/plugma/src/commands/types.ts b/packages/plugma/src/commands/types.ts
new file mode 100644
index 00000000..f28a9aea
--- /dev/null
+++ b/packages/plugma/src/commands/types.ts
@@ -0,0 +1,84 @@
+/**
+ * Common types for command implementations
+ */
+
+import type { PluginOptions } from '#core/types.js';
+import type { ViteDevServer } from 'vite';
+
+export type CommandName = 'dev' | 'preview' | 'build' | 'release';
+
+/**
+ * Base options shared by all commands
+ */
+export interface BaseCommandOptions {
+ command: CommandName;
+ debug?: boolean;
+ mode?: string;
+ output?: string;
+ cwd?: string;
+}
+
+/**
+ * Options specific to development commands (dev and preview)
+ */
+export interface DevCommandOptions extends BaseCommandOptions {
+ command: 'dev';
+ port?: number;
+ toolbar?: boolean;
+ websockets?: boolean;
+}
+
+/**
+ * Options specific to preview command
+ */
+export interface PreviewCommandOptions
+ extends Omit {
+ command: 'preview';
+}
+
+/**
+ * Options specific to the build command
+ */
+export interface BuildCommandOptions extends BaseCommandOptions {
+ command: 'build';
+ watch?: boolean;
+}
+
+/**
+ * Options specific to the release command
+ */
+export interface ReleaseCommandOptions extends BaseCommandOptions {
+ command: 'release';
+ version?: string;
+ type?: 'stable' | 'alpha' | 'beta';
+ title?: string;
+ notes?: string;
+}
+
+/**
+ * Options for the test command
+ */
+export type TestCommandOptions = BaseCommandOptions &
+ PluginOptions & {
+ /** Test files pattern */
+ testMatch?: string[];
+ /** Whether to watch for changes */
+ watch?: boolean;
+ /** Test timeout in milliseconds */
+ timeout?: number;
+ /** WebSocket server port */
+ port?: number;
+ /** WebSocket server host */
+ host?: string;
+ /** Whether to run in debug mode */
+ debug?: boolean;
+ };
+
+/**
+ * Shared state for Vite server instances
+ */
+export interface ViteServerState {
+ viteServer: ViteDevServer | null;
+ viteBuild: ViteDevServer | null;
+ viteUi: ViteDevServer | null;
+}
diff --git a/packages/plugma/src/core/README.md b/packages/plugma/src/core/README.md
new file mode 100644
index 00000000..ea09937d
--- /dev/null
+++ b/packages/plugma/src/core/README.md
@@ -0,0 +1,103 @@
+# Core
+
+Core system components and types. This layer handles the foundational operations like task execution, WebSocket communication, and Adobe app interactions.
+
+## Components
+
+### Task Runner (`task-runner/`)
+Executes tasks in a controlled environment with proper lifecycle management.
+
+```typescript
+import { Task, taskCaller } from './task-runner'
+
+// Define and run tasks
+taskCaller((task, run) => {
+ task('example', function* (opts) {
+ yield log('Running example task')
+ return opts.value * 2
+ })
+
+ run('example', { value: 10 })
+})
+```
+
+### WebSocket Server (`ws-server.cts`)
+Handles bidirectional communication with Adobe apps.
+
+```typescript
+// const server = await createServer({
+// port: 8080,
+// onMessage: (msg) => {
+// // Handle incoming messages
+// }
+// })
+```
+
+### Global Shims (`global-shim.ts`)
+Adobe app environment shims and type augmentations. Import this in your plugin's entry point:
+
+```typescript
+import './global-shim'
+```
+
+### Event System (`listeners/`)
+Event handling for plugin lifecycle and communication.
+
+```typescript
+import { on } from './listeners'
+
+on('plugin:start', () => {
+ // Handle plugin start
+})
+```
+
+## Type System
+
+Core types are defined in `types.ts`. Key interfaces:
+
+```typescript
+interface PluginConfig {
+ name: string
+ version: string
+ // ... see types.ts for full definition
+}
+
+interface TaskContext {
+ options: PluginOptions
+ results: Record
+}
+```
+
+## Common Patterns
+
+### Task Definition
+```typescript
+task('name', function* (opts) {
+ // 1. Validate inputs
+ if (!opts.required) throw new Error('Missing required option')
+
+ // 2. Yield progress/status
+ yield log('Processing...')
+
+ // 3. Return results
+ return { success: true }
+})
+```
+
+### WebSocket Communication
+```typescript
+// 1. Create server
+// const server = await createServer(config)
+
+// 2. Send message
+// await server.send({ type: 'update', data: {} })
+
+// 3. Handle response
+// server.on('message', (msg) => {
+// switch (msg.type) {
+// case 'response':
+// // Handle response
+// break
+// }
+// })
+```
diff --git a/packages/plugma/src/core/global-shim.ts b/packages/plugma/src/core/global-shim.ts
new file mode 100644
index 00000000..20c5d3f6
--- /dev/null
+++ b/packages/plugma/src/core/global-shim.ts
@@ -0,0 +1,25 @@
+/**
+ * Sets up a global reference to ensure consistent access to global scope across different JavaScript environments.
+ * This is particularly useful for ensuring compatibility across Node.js, browser, and other JavaScript runtimes.
+ */
+(() => {
+ type GlobalRef = typeof globalThis & {
+ global?: typeof globalThis;
+ };
+
+ // Cast each potential global object to GlobalRef to satisfy TypeScript
+ const globalRef: GlobalRef = (
+ typeof globalThis !== 'undefined'
+ ? globalThis
+ : typeof self !== 'undefined'
+ ? self
+ : typeof window !== 'undefined'
+ ? window
+ : {}
+ ) as GlobalRef;
+
+ if (typeof globalRef.global === 'undefined') {
+ globalRef.global = globalRef;
+ console.log('global is now defined globally:', globalRef.global);
+ }
+})();
diff --git a/packages/plugma/src/core/task-runner/task-runner.test.ts b/packages/plugma/src/core/task-runner/task-runner.test.ts
new file mode 100644
index 00000000..aeab8899
--- /dev/null
+++ b/packages/plugma/src/core/task-runner/task-runner.test.ts
@@ -0,0 +1,78 @@
+import { beforeEach, describe, expect, test } from 'vitest';
+import { TaskRunner } from './task-runner.js';
+import type { RegisteredTask } from './types.js';
+
+describe('Task Runner', () => {
+ let taskRunner: TaskRunner>;
+
+ beforeEach(() => {
+ taskRunner = new TaskRunner();
+ });
+
+ describe('Task Registration', () => {
+ test('should register a task successfully', () => {
+ const handler = async () => 'test result';
+ const task = taskRunner.task('test-task', handler);
+
+ expect(task.name).toBe('test-task');
+ expect(task.run).toBe(handler);
+ });
+
+ test('should throw error when registering duplicate task', () => {
+ const handler = async () => 'test result';
+ taskRunner.task('test-task', handler);
+
+ expect(() => taskRunner.task('test-task', handler)).toThrow(
+ 'already registered',
+ );
+ });
+ });
+
+ describe('Task Execution', () => {
+ test('should execute tasks in sequence', async () => {
+ const task1 = taskRunner.task(
+ 'task1',
+ async (opt: {}, ctx: {}) => 'result1',
+ );
+ const task2 = taskRunner.task(
+ 'task2',
+ async (_: {}, context: { task1: string }) => {
+ expect(context.task1).toBe('result1');
+ return 42;
+ },
+ );
+
+ const results = await taskRunner.serial(task1, {}, task2);
+ expect(results.task1).toBe('result1');
+ expect(results.task2).toBe(42);
+ });
+
+ test('should handle task execution errors', async () => {
+ const task = taskRunner.task('error-task', async () => {
+ throw new Error('Task execution failed');
+ });
+
+ await expect(taskRunner.serial(task, {})).rejects.toThrow(
+ 'Task execution failed',
+ );
+ });
+ });
+
+ describe('Task Results', () => {
+ test('should get task result with proper typing', async () => {
+ interface TaskResult {
+ value: number;
+ }
+ const task = taskRunner.task('typed_task', async () => ({ value: 42 }));
+
+ const results = await taskRunner.serial(task, {});
+ expect(results.typed_task.value).toBe(42);
+ });
+
+ test('should return undefined for missing task result', () => {
+ const results = {} as Record;
+ const result = results['missing-task'];
+ expect(result).toBeUndefined();
+ });
+ });
+});
diff --git a/packages/plugma/src/core/task-runner/task-runner.ts b/packages/plugma/src/core/task-runner/task-runner.ts
new file mode 100644
index 00000000..28826fd7
--- /dev/null
+++ b/packages/plugma/src/core/task-runner/task-runner.ts
@@ -0,0 +1,218 @@
+import { Logger } from '#utils/log/logger.js';
+import type { RegisteredTask, ResultsOfTask } from './types.js';
+
+/**
+ * TaskRunner class for managing and executing tasks in a type-safe manner.
+ * This class provides functionality to register, run, and manage tasks with proper dependency validation.
+ */
+export class TaskRunner<
+ AvailableTasks extends RegisteredTask = never,
+> {
+ private tasks: Map<
+ AvailableTasks['name'],
+ RegisteredTask
+ >;
+ private logger: Logger;
+
+ constructor(options?: { debug: boolean }) {
+ this.tasks = new Map();
+ this.logger = new Logger({ debug: options?.debug ?? false });
+ this.logger.debug('TaskRunner initialized');
+ }
+
+ /**
+ * Log a message to the console
+ */
+ log(message: string): void {
+ this.logger.debug(message);
+ }
+
+ /**
+ * Register a task with a name and handler function
+ */
+ task(
+ name: TName,
+ handler: (options: TOptions, context: TContext) => Promise,
+ ): RegisteredTask {
+ this.logger.debug(`Registering task: ${name}`);
+ if (this.tasks.has(name)) {
+ throw new Error(`Task "${name}" is already registered`);
+ }
+
+ const task = {
+ name,
+ run: handler,
+ };
+
+ this.tasks.set(name, task);
+ return task;
+ }
+
+ /**
+ * Run a single task by its name
+ */
+ async run<
+ T extends RegisteredTask & {
+ name: AvailableTasks['name'];
+ },
+ >(
+ task: T,
+ options: Parameters[0],
+ context: Parameters[1],
+ ): Promise> {
+ const registeredTask = this.tasks.get(task.name);
+ if (!registeredTask) {
+ throw new Error(`Task "${task.name}" not found`);
+ }
+
+ this.logger.format({ indent: 1 }).debug(`Starting task "${task.name}"`);
+ this.logger
+ .format({ indent: 2 })
+ .debug(`Options: ${JSON.stringify(options)}`);
+ this.logger
+ .format({ indent: 2 })
+ .debug(`Context: ${JSON.stringify(context)}`);
+ console.time(`Task "${task.name}"`);
+
+ try {
+ const result = (await registeredTask.run(options, context)) as ReturnType<
+ T['run']
+ >;
+ console.timeEnd(`Task "${task.name}"`);
+ this.logger
+ .format({ indent: 1 })
+ .success(`Task "${task.name}" completed successfully`);
+ this.logger
+ .format({ indent: 2 })
+ .debug(`Result: ${JSON.stringify(result)}`);
+ return result;
+ } catch (error) {
+ console.timeEnd(`Task "${task.name}"`);
+ this.logger
+ .format({ indent: 1 })
+ .error(
+ `Task "${task.name}" failed: ${error instanceof Error ? error.message : String(error)}`,
+ );
+ throw error;
+ }
+ }
+
+ /**
+ * Run multiple tasks in series with proper dependency validation and guaranteed serial execution
+ */
+ async serial(
+ firstTask: First,
+ options: Parameters[0],
+ ...otherTasks: Rest
+ ): Promise> {
+ this.logger.format({ indent: 1 });
+ this.logger.debug(
+ `Starting execution of task series ${firstTask.name}, ${otherTasks
+ .map((task) => task.name)
+ .join(', ')}`,
+ );
+
+ const context = {} as ResultsOfTask;
+ const tasks = [firstTask, ...otherTasks] as ((First | Rest[number]) & {
+ name: keyof typeof context;
+ })[];
+
+ // Use for...of to ensure sequential execution
+ for (const task of tasks) {
+ const registeredTask = this.tasks.get(task.name);
+ if (!registeredTask) {
+ throw new Error(`Task "${task.name}" not found`);
+ }
+
+ this.logger.format({ indent: 2 }).debug(`Starting task: ${task.name}`);
+
+ try {
+ // Await each task explicitly to ensure serial execution
+ const result = await registeredTask.run(options, context);
+
+ // Store result in context before proceeding to next task
+ context[task.name] = result;
+
+ this.logger
+ .format({ indent: 2 })
+ .debug(`Completed task ${task.name} with result:`, result);
+ } catch (error) {
+ this.logger
+ .format({ indent: 2 })
+ .error(`Task ${task.name} failed:`, error);
+
+ // Rethrow with enhanced context
+ throw new Error(
+ `Serial execution failed at task "${task.name}": ${
+ error instanceof Error ? error.message : String(error)
+ }`,
+ );
+ }
+ }
+
+ return context;
+ }
+
+ /**
+ * Run multiple tasks in parallel
+ */
+ async parallel(
+ tasks: T['name'][],
+ options: Parameters[0],
+ ): Promise> {
+ const promises = tasks.map(async (taskName) => {
+ const task = this.tasks.get(taskName);
+ if (!task) {
+ throw new Error(`Task "${taskName}" not found`);
+ }
+ const context = {} as Record;
+ const result = await task.run(options, context);
+ return { name: taskName, result };
+ });
+
+ const results = await Promise.all(promises);
+ const context = {} as Record;
+
+ for (const { name, result } of results) {
+ context[name] = result;
+ }
+
+ return context;
+ }
+}
+
+/**
+ * Creates a set of helper functions for working with a TaskRunner instance.
+ * These helpers are pre-typed with the available tasks, making them more convenient to use.
+ */
+export function createHelpers<
+ AvailableTasks extends RegisteredTask,
+>(runner: TaskRunner) {
+ return {
+ log: (message: string) => runner.log(message),
+
+ task: (
+ name: TName,
+ handler: (options: TOptions, context: TContext) => Promise,
+ ) => runner.task(name, handler),
+
+ run: (
+ task: Task,
+ options: Parameters[0],
+ context: Parameters[1],
+ ) => runner.run(task, options, context),
+
+ serial:
+ (
+ firstTask: First,
+ ...otherTasks: Rest
+ ) =>
+ (options: Parameters[0]) =>
+ runner.serial(firstTask, options, ...otherTasks),
+
+ parallel: (
+ tasks: AvailableTasks['name'][],
+ options: Parameters[0],
+ ) => runner.parallel(tasks, options),
+ };
+}
diff --git a/packages/plugma/src/core/task-runner/types.ts b/packages/plugma/src/core/task-runner/types.ts
new file mode 100644
index 00000000..98449379
--- /dev/null
+++ b/packages/plugma/src/core/task-runner/types.ts
@@ -0,0 +1,233 @@
+/**
+ * Core types for the task runner system.
+ * This module provides the foundational types for defining and executing tasks
+ * in a type-safe, dependency-aware manner.
+ */
+import type { EmptyObject, Join, UnionToTuple } from 'type-fest';
+
+/**
+ * Utility type to convert a union of string literals to a comma-separated string literal type
+ */
+export type UnionToString =
+ UnionToTuple extends readonly string[]
+ ? Join, ', '>
+ : never;
+
+/**
+ * Base interface for task definitions.
+ * Tasks are the fundamental unit of work in the system, each with a unique name
+ * and a handler function that performs the actual work.
+ *
+ * @property name - Unique identifier for the task
+ * @property handler - Function that executes the task's logic
+ *
+ * @example
+ * ```typescript
+ * const myTask: TaskDef = {
+ * name: 'build',
+ * handler: async (options: { mode: 'dev' | 'prod' }) => {
+ * // Task implementation
+ * }
+ * };
+ * ```
+ */
+export type TaskDef = {
+ name: string;
+ handler: (options: Options, context?: Context) => Promise;
+};
+
+/**
+ * Represents a task that has been registered and can be run.
+ */
+export type RegisteredTask<
+ Name extends string,
+ TOptions,
+ TResults,
+ TContext,
+> = {
+ name: Name;
+ run: (options: TOptions, context: TContext) => Promise;
+};
+
+/**
+ * Extracts and infers the complete type information from a task definition.
+ * This utility type is crucial for maintaining type safety throughout the task system
+ * by providing access to the exact types of a task's name, options, context, and results.
+ *
+ * @template T - A type that extends TaskDef
+ *
+ * @property name - The literal type of the task's name
+ * @property options - The type of the first parameter of the handler function
+ * @property context - The type of the second parameter of the handler function
+ * @property results - The resolved return type of the handler function
+ * @property handler - The type of the handler function itself
+ *
+ * @example
+ * ```typescript
+ * const buildTask = {
+ * name: 'build' as const,
+ * handler: async (options: { mode: 'dev' | 'prod' }, context: { env: string }) => ({ success: true })
+ * };
+ *
+ * type BuildTask = GetTaskTypeFor;
+ * // Results in:
+ * // {
+ * // name: 'build'
+ * // options: { mode: 'dev' | 'prod' }
+ * // context: { env: string }
+ * // results: { success: boolean }
+ * // handler: (options: { mode: 'dev' | 'prod' }, context: { env: string }) => Promise<{ success: boolean }>
+ * // }
+ * ```
+ */
+export type GetTaskTypeFor> = {
+ name: T extends { name: infer N } ? N : never;
+ options: Parameters[0];
+ context: Parameters[1] extends {
+ [K in keyof Parameters[1]]: any;
+ }
+ ? Parameters[1]
+ : {};
+ results: Awaited>;
+ handler: T['run'];
+};
+
+/**
+ * Maps each task to its results type, creating a type-safe dictionary of task results.
+ * This type is essential for managing task dependencies and ensuring that tasks
+ * receive the correct result types from their dependencies.
+ *
+ * @template T - A Task type or a union of Task types
+ *
+ * @example
+ * ```typescript
+ * type Tasks = BuildTask | TestTask | DeployTask;
+ * type AllResults = ResultsOfTask;
+ * // Results in:
+ * // {
+ * // 'build': { success: boolean }
+ * // 'test': { passed: boolean; coverage: number }
+ * // 'deploy': { url: string }
+ * // }
+ * ```
+ */
+export type ResultsOfTask<
+ T extends TaskDef | RegisteredTask,
+> = {
+ [K in T['name']]: Extract extends infer Task
+ ? Task extends TaskDef
+ ? Task['handler'] extends (...args: any[]) => Promise
+ ? R
+ : never
+ : Task extends RegisteredTask
+ ? Task['run'] extends (...args: any[]) => Promise
+ ? R
+ : never
+ : never
+ : never;
+};
+
+/**
+ * Generates a type error message when task dependencies are not satisfied.
+ * Used internally by ValidateTaskOrder to provide clear error messages about missing dependencies.
+ *
+ * @template Name - The name of the task that has unsatisfied dependencies
+ * @template Missing - The names of the missing dependency tasks
+ */
+type TaskDependencyError<
+ Name extends string,
+ Missing extends string,
+> = `Task '${Name}' must come after tasks: ${UnionToString}`;
+
+/**
+ * Validates that tasks are ordered correctly based on their context dependencies.
+ * This type ensures that tasks are executed in an order that satisfies their dependencies,
+ * preventing runtime errors from missing context data.
+ *
+ * @template Names - Tuple of task names in their execution order
+ * @template T - The task definition type
+ * @template Acc - Accumulator of validated task names (internal use)
+ *
+ * @example
+ * ```typescript
+ * // Valid order - buildTask doesn't depend on any other tasks
+ * // testTask depends on buildTask
+ * // deployTask depends on both buildTask and testTask
+ * type ValidOrder = ValidateTaskOrder<['build', 'test', 'deploy'], Tasks>;
+ *
+ * // Invalid order - will result in a type error because testTask needs buildTask's results
+ * type InvalidOrder = ValidateTaskOrder<['test', 'build', 'deploy'], Tasks>;
+ * // Error: Task 'test' must come after tasks: build
+ * ```
+ */
+export type ValidateTaskOrder<
+ Names extends readonly string[],
+ T extends TaskDef | RegisteredTask,
+ Acc extends string = never,
+> = Names extends []
+ ? never
+ : Names extends readonly [infer First extends string]
+ ? T extends { name: First; context: infer Context }
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Names
+ : TaskDependencyError>
+ : Names
+ : Names
+ : Names extends readonly [
+ infer First extends string,
+ ...infer Rest extends string[],
+ ]
+ ? T extends { name: First; context: infer Context }
+ ? Context extends ResultsOfTask
+ ? TaskDeps['name'] extends Acc
+ ? Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : TaskDependencyError>
+ : Rest extends ValidateTaskOrder
+ ? Names
+ : ValidateTaskOrder
+ : never
+ : never;
+
+/**
+ * Maps task names to their option types for a group of tasks, filtering out tasks that don't require options.
+ * This type is essential for the task runner system as it:
+ * 1. Ensures type safety when running multiple tasks by requiring only the necessary options
+ * 2. Automatically filters out tasks that have empty options (EmptyObject) to avoid unnecessary configuration
+ * 3. Preserves the exact mapping between task names and their specific option types
+ *
+ * @template T - The task definition type that extends TaskDef
+ * @template Names - A tuple of task names that will be executed
+ *
+ * @example
+ * ```typescript
+ * // Given tasks:
+ * // - taskA: requires { foo: string }
+ * // - taskB: requires no options (EmptyObject)
+ * // - taskC: requires { bar: number }
+ *
+ * type Options = TaskGroupOptions;
+ * // Results in: { taskA: { foo: string }, taskC: { bar: number } }
+ * // Note: taskB is omitted since it requires no options
+ * ```
+ */
+export type TaskGroupOptions<
+ T extends RegisteredTask,
+ Names extends readonly T['name'][],
+> = {
+ [K in Names[number] as Extract['run'] extends (
+ options: infer O,
+ ...args: any[]
+ ) => any
+ ? O extends EmptyObject
+ ? never
+ : K
+ : never]: Extract['run'] extends (
+ options: infer O,
+ ...args: any[]
+ ) => any
+ ? O
+ : never;
+};
diff --git a/packages/plugma/src/core/types.ts b/packages/plugma/src/core/types.ts
new file mode 100644
index 00000000..3223ae2e
--- /dev/null
+++ b/packages/plugma/src/core/types.ts
@@ -0,0 +1,70 @@
+//@index('./**/types.ts', f => `export * from '${f.path}.js';`)
+export * from './task-runner/types.js';
+import type { PackageJson } from 'type-fest';
+//@endindex
+
+import type { UserConfig } from 'vite';
+
+
+export type PlugmaCommand = 'preview' | 'dev' | 'build' | 'test';
+
+/**
+ * Plugin options for configuring the build process
+*/
+export interface PluginOptions {
+ mode: string;
+ port: number;
+ output: string;
+ command?: PlugmaCommand;
+ instanceId: string;
+ debug?: boolean;
+ watch?: boolean;
+ manifest?: ManifestFile;
+ /** The working directory for the plugin */
+ cwd?: string;
+ [key: string]: unknown;
+}
+
+export type PlugmaRuntimeData = PluginOptions;
+
+/**
+ * Manifest file structure for Figma plugins
+ */
+export interface ManifestFile {
+ name: string;
+ version: string;
+ main: string;
+ ui?: string;
+ api: string;
+ networkAccess?: {
+ devAllowedDomains?: string[];
+ allowedDomains?: string[];
+ };
+ [key: string]: unknown;
+}
+
+export type PlugmaPackageJson = typeof import('#packageJson');
+export type UserPackageJson = PackageJson & {
+ plugma?: {
+ manifest?: ManifestFile;
+ };
+};
+
+/**
+ * User files configuration
+ */
+export interface UserFiles {
+ manifest: ManifestFile;
+ userPkgJson: UserPackageJson;
+}
+
+export interface ViteConfigs {
+ vite: {
+ dev: UserConfig;
+ build: UserConfig;
+ };
+ viteMain: {
+ dev: UserConfig;
+ build: UserConfig;
+ };
+}
diff --git a/packages/plugma/src/tasks/build/main.test.ts b/packages/plugma/src/tasks/build/main.test.ts
new file mode 100644
index 00000000..31c8fd26
--- /dev/null
+++ b/packages/plugma/src/tasks/build/main.test.ts
@@ -0,0 +1,228 @@
+import {
+ createMockBuildFs,
+ createMockGetFilesResult,
+ createMockTaskContext,
+ createMockViteServer,
+ mockBuildOptions,
+ resetMocks,
+ setupFsMocks,
+ setupViteMock,
+} from '#test';
+import { build } from 'vite';
+import { beforeEach, describe, expect, test, vi } from 'vitest';
+import { GetFilesTask } from '../common/get-files.js';
+import { viteState } from '../server/vite.js';
+import { BuildMainTask } from './main.js';
+
+// Setup mocks
+setupFsMocks();
+setupViteMock();
+
+// Mock Logger and createViteConfigs
+vi.mock('#utils/log/logger.js', () => ({
+ Logger: vi.fn().mockImplementation(() => ({
+ debug: vi.fn(),
+ success: vi.fn(),
+ error: vi.fn(),
+ })),
+}));
+
+vi.mock('#utils/config/create-vite-configs.js', () => ({
+ createViteConfigs: vi.fn().mockReturnValue({
+ main: {
+ dev: {
+ root: process.cwd(),
+ base: '/',
+ mode: 'development',
+ build: {
+ outDir: 'dist',
+ emptyOutDir: true,
+ sourcemap: true,
+ minify: false,
+ lib: {
+ entry: 'src/plugin-main.ts',
+ formats: ['iife'],
+ name: 'plugin',
+ fileName: () => 'main.js',
+ },
+ rollupOptions: {
+ input: 'src/plugin-main.ts',
+ external: ['figma'],
+ output: {
+ globals: {
+ figma: 'figma',
+ },
+ },
+ },
+ },
+ },
+ build: {
+ root: process.cwd(),
+ base: '/',
+ mode: 'production',
+ build: {
+ outDir: 'dist',
+ emptyOutDir: true,
+ sourcemap: true,
+ minify: true,
+ lib: {
+ entry: 'src/plugin-main.ts',
+ formats: ['iife'],
+ name: 'plugin',
+ fileName: () => 'main.js',
+ },
+ rollupOptions: {
+ input: 'src/plugin-main.ts',
+ external: ['figma'],
+ output: {
+ globals: {
+ figma: 'figma',
+ },
+ },
+ },
+ },
+ },
+ },
+ }),
+}));
+
+describe('Main Build Tasks', () => {
+ beforeEach(() => {
+ resetMocks();
+ viteState.viteMainWatcher = null;
+ });
+
+ describe('Task Execution', () => {
+ test('should build main script using manifest.main', async () => {
+ const fs = createMockBuildFs();
+ const mainPath = 'src/plugin-main.ts';
+ const getFilesResult = createMockGetFilesResult({
+ files: {
+ manifest: {
+ name: 'Test Plugin',
+ id: 'test-plugin',
+ version: '1.0.0',
+ api: '1.0.0',
+ main: mainPath,
+ },
+ },
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: getFilesResult,
+ });
+
+ await BuildMainTask.run(mockBuildOptions, context);
+
+ expect(build).toHaveBeenCalledWith(
+ expect.objectContaining({
+ root: process.cwd(),
+ base: '/',
+ mode: expect.any(String),
+ build: expect.objectContaining({
+ outDir: expect.any(String),
+ emptyOutDir: true,
+ sourcemap: true,
+ minify: expect.any(Boolean),
+ lib: expect.objectContaining({
+ entry: expect.stringContaining(mainPath),
+ formats: ['iife'],
+ name: 'plugin',
+ fileName: expect.any(Function),
+ }),
+ rollupOptions: expect.objectContaining({
+ input: expect.stringContaining(mainPath),
+ external: ['figma'],
+ output: expect.objectContaining({
+ globals: expect.objectContaining({
+ figma: 'figma',
+ }),
+ }),
+ }),
+ }),
+ }),
+ );
+ });
+
+ test('should skip build when main is not specified', async () => {
+ const getFilesResult = createMockGetFilesResult({
+ files: {
+ manifest: {
+ name: 'Test Plugin',
+ id: 'test-plugin',
+ version: '1.0.0',
+ api: '1.0.0',
+ // main is intentionally omitted
+ },
+ },
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: getFilesResult,
+ });
+
+ const result = await BuildMainTask.run(mockBuildOptions, context);
+
+ expect(build).not.toHaveBeenCalled();
+ expect(result).toEqual({
+ outputPath: expect.stringContaining('main.js'),
+ });
+ });
+
+ test('should close existing build server', async () => {
+ const mockServer = createMockViteServer();
+ viteState.viteMainWatcher = mockServer;
+
+ const mainPath = 'src/plugin-main.ts';
+ const getFilesResult = createMockGetFilesResult({
+ files: {
+ manifest: {
+ name: 'Test Plugin',
+ id: 'test-plugin',
+ version: '1.0.0',
+ api: '1.0.0',
+ main: mainPath,
+ },
+ },
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: getFilesResult,
+ });
+
+ await BuildMainTask.run(mockBuildOptions, context);
+
+ expect(mockServer.close).toHaveBeenCalled();
+ });
+
+ test('should handle missing get-files result', async () => {
+ await expect(
+ BuildMainTask.run(mockBuildOptions, {} as any),
+ ).rejects.toThrow('get-files task must run first');
+ });
+
+ test('should handle Vite build errors', async () => {
+ const mainPath = 'src/plugin-main.ts';
+ const getFilesResult = createMockGetFilesResult({
+ files: {
+ manifest: {
+ name: 'Test Plugin',
+ id: 'test-plugin',
+ version: '1.0.0',
+ api: '1.0.0',
+ main: mainPath,
+ },
+ },
+ });
+ vi.mocked(build).mockRejectedValueOnce(new Error('Build failed'));
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: getFilesResult,
+ });
+
+ await expect(
+ BuildMainTask.run(mockBuildOptions, context),
+ ).rejects.toThrow('Failed to build main script: Build failed');
+ });
+ });
+});
diff --git a/packages/plugma/src/tasks/build/main.ts b/packages/plugma/src/tasks/build/main.ts
new file mode 100644
index 00000000..f5500aa0
--- /dev/null
+++ b/packages/plugma/src/tasks/build/main.ts
@@ -0,0 +1,111 @@
+import { join, resolve } from 'node:path';
+import type { RollupWatcher } from 'rollup';
+import { build } from 'vite';
+/**
+ * Main script build task implementation
+ */
+import type {
+ GetTaskTypeFor,
+ PluginOptions,
+ ResultsOfTask,
+} from '#core/types.js';
+import { createViteConfigs } from '#utils/config/create-vite-configs.js';
+import { Logger } from '#utils/log/logger.js';
+import { GetFilesTask } from '../common/get-files.js';
+import { task } from '../runner.js';
+import { viteState } from '../server/vite.js';
+
+/**
+ * Result type for the build-main task
+ */
+interface Result {
+ /** Path to the built main script file */
+ outputPath: string;
+}
+
+/**
+ * Task that builds the plugin's main script.
+ *
+ * This task is responsible for:
+ * 1. Building the main script using Vite:
+ * - Configures Vite for CommonJS output format
+ * - Sets up Figma API externals
+ * - Handles source maps and minification
+ * 2. Managing build state:
+ * - Closes existing build server if any
+ * - Validates output files against source files
+ * - Manages watch mode for development
+ *
+ * The main script is built from the path specified in manifest.main and outputs to main.js.
+ * In development mode:
+ * - Builds are not minified for better debugging
+ * - Watch mode is enabled for rebuilding on changes
+ * - Output files are validated against source files
+ *
+ * In production mode:
+ * - Output is minified
+ * - Watch mode is disabled (unless explicitly enabled)
+ * - Build artifacts are preserved
+ *
+ * @param options - Plugin build options including command, output path, etc
+ * @param context - Task context containing results from previous tasks
+ * @returns Object containing the output file path
+ */
+const buildMain = async (
+ options: PluginOptions,
+ context: ResultsOfTask,
+): Promise => {
+ try {
+ const log = new Logger({
+ debug: options.debug,
+ prefix: 'build:main',
+ });
+
+ const fileResult = context[GetFilesTask.name];
+ if (!fileResult) {
+ throw new Error('get-files task must run first');
+ }
+
+ const { files } = fileResult;
+ const outputPath = join(options.output || 'dist', 'main.js');
+
+ // Close existing build server if any
+ if (viteState.viteMainWatcher) {
+ await viteState.viteMainWatcher.close();
+ }
+
+ // Only build if main script is specified
+ if (!files.manifest.main) {
+ log.debug('No main script specified in manifest, skipping build');
+ return { outputPath };
+ }
+
+ const mainPath = resolve(files.manifest.main);
+ log.debug(`Building main script from: ${mainPath}`);
+
+ // Get the appropriate Vite config from createViteConfigs
+ const configs = createViteConfigs(options, files);
+ const config =
+ options.command === 'build' ? configs.main.build : configs.main.dev;
+
+ // Build main script with Vite using the correct config
+ const buildResult = await build(config);
+
+ // Only store the watcher in watch mode
+ if (options.watch || ['dev', 'preview'].includes(options.command ?? '')) {
+ viteState.viteMainWatcher = buildResult as RollupWatcher;
+ }
+
+ log.success('Main script built successfully at dist/main.js');
+
+ return { outputPath };
+ } catch (error) {
+ const errorMessage = error instanceof Error ? error.message : String(error);
+ throw new Error(`Failed to build main script: ${errorMessage}`);
+ }
+};
+
+export const BuildMainTask = task('build:main', buildMain);
+export type BuildMainTask = GetTaskTypeFor;
+
+export default BuildMainTask;
diff --git a/packages/plugma/src/tasks/build/manifest.test.ts b/packages/plugma/src/tasks/build/manifest.test.ts
new file mode 100644
index 00000000..a9a7bbc5
--- /dev/null
+++ b/packages/plugma/src/tasks/build/manifest.test.ts
@@ -0,0 +1,415 @@
+import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
+
+// Hoist mocks
+const mocks = vi.hoisted(() => {
+ const pathMock = {
+ dirname: vi.fn().mockReturnValue('src/tasks/build'),
+ join: vi.fn().mockImplementation((...paths: string[]) => paths.join('/')),
+ resolve: vi.fn().mockImplementation((p: string) => p),
+ relative: vi.fn().mockImplementation((from, to) => to),
+ sep: '/',
+ };
+
+ const loggerMock = {
+ debug: vi.fn(),
+ info: vi.fn(),
+ warn: vi.fn(),
+ error: vi.fn(),
+ success: vi.fn(),
+ };
+
+ const watcher = {
+ on: vi.fn((event, handler) => {
+ if (event === 'change') {
+ handler('manifest.json');
+ }
+ return watcher;
+ }),
+ close: vi.fn(),
+ };
+
+ const readFileMock = vi.fn().mockImplementation((path: string) => {
+ if (path === 'package.json') {
+ return Promise.resolve(
+ JSON.stringify({
+ name: 'test-plugin',
+ version: '1.0.0',
+ }),
+ );
+ }
+ return Promise.reject(new Error('File not found'));
+ });
+
+ const buildMainTask = {
+ run: vi.fn(),
+ };
+
+ return {
+ access: vi.fn().mockImplementation(async () => Promise.resolve()),
+ mkdir: vi.fn().mockResolvedValue(undefined),
+ readFile: readFileMock,
+ writeFile: vi.fn(),
+ rm: vi.fn().mockResolvedValue(undefined),
+ path: {
+ ...pathMock,
+ default: pathMock,
+ relative: pathMock.relative,
+ },
+ Logger: vi.fn().mockImplementation(() => loggerMock),
+ loggerInstance: loggerMock,
+ defaultLogger: loggerMock,
+ registerCleanup: vi.fn(),
+ unregisterCleanup: vi.fn(),
+ cleanManifestFiles: vi.fn(),
+ validateOutputFiles: vi.fn(),
+ getFilesRecursively: vi.fn().mockResolvedValue([]),
+ BuildMainTask: buildMainTask,
+ RestartViteServerTask: {
+ run: vi.fn(),
+ default: {
+ run: vi.fn(),
+ },
+ },
+ chokidar: {
+ watch: vi.fn((files: string[]) => watcher),
+ },
+ watcher,
+ readFileMock,
+ process: {
+ cwd: vi.fn().mockReturnValue('/work/cva/plugma/packages/plugma'),
+ },
+ };
+});
+
+// Mock modules
+vi.mock('node:fs/promises', () => ({
+ access: mocks.access,
+ mkdir: mocks.mkdir,
+ readFile: mocks.readFile,
+ writeFile: mocks.writeFile,
+ rm: mocks.rm,
+}));
+
+vi.mock('node:path', () => mocks.path);
+
+vi.mock('#utils/log/logger.js', () => ({
+ Logger: mocks.Logger,
+ defaultLogger: mocks.defaultLogger,
+}));
+
+vi.mock('#utils/cleanup.js', () => ({
+ registerCleanup: mocks.registerCleanup,
+ unregisterCleanup: mocks.unregisterCleanup,
+}));
+
+vi.mock('#utils/config/clean-manifest-files.js', () => ({
+ cleanManifestFiles: mocks.cleanManifestFiles,
+}));
+
+vi.mock('#utils/fs/get-files-recursively.js', () => ({
+ getFilesRecursively: mocks.getFilesRecursively,
+}));
+
+vi.mock('./main.js', () => ({
+ BuildMainTask: mocks.BuildMainTask,
+ default: mocks.BuildMainTask,
+}));
+
+vi.mock('../server/restart-vite.js', () => ({
+ RestartViteServerTask: mocks.RestartViteServerTask,
+ default: mocks.RestartViteServerTask.default,
+}));
+
+vi.mock('chokidar', () => ({
+ default: mocks.chokidar,
+}));
+
+vi.mock('node:process', () => mocks.process);
+
+vi.mock('#utils/config/validateOutputFiles.js', () => ({
+ validateOutputFiles: mocks.validateOutputFiles,
+}));
+
+import { BuildManifestTask, GetFilesTask } from '#tasks';
+import { type MockFs, createMockFs, createMockTaskContext } from '#test';
+
+const baseOptions = {
+ command: 'dev' as const,
+ mode: 'development',
+ port: 3000,
+ output: 'dist',
+ instanceId: 'test',
+ debug: false,
+};
+
+describe('BuildManifestTask', () => {
+ let mockFs: MockFs;
+
+ beforeEach(() => {
+ vi.clearAllMocks();
+ mockFs = createMockFs();
+ mocks.access.mockImplementation((path) => mockFs.access(path));
+ mocks.readFileMock.mockImplementation((path) => {
+ if (path === 'package.json') {
+ return Promise.resolve(
+ JSON.stringify({
+ name: 'test-plugin',
+ version: '1.0.0',
+ }),
+ );
+ }
+ return mockFs.readFile(path);
+ });
+ mocks.writeFile.mockImplementation((path, content) =>
+ mockFs.writeFile(path, content),
+ );
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ describe('Task Definition', () => {
+ test('should have correct name', () => {
+ expect(BuildManifestTask.name).toBe('build:manifest');
+ });
+ });
+
+ describe('Task Execution', () => {
+ test('should build manifest successfully', async () => {
+ mockFs.addFiles({
+ 'src/main.ts': 'export default {}',
+ 'src/ui.html': '',
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {
+ main: 'src/main.ts',
+ ui: 'src/ui.html',
+ },
+ },
+ },
+ });
+
+ const result = await BuildManifestTask.run(baseOptions, context);
+
+ expect(result).toEqual({
+ raw: {
+ main: 'src/main.ts',
+ ui: 'src/ui.html',
+ },
+ processed: {
+ api: '1.0.0',
+ main: 'main.js',
+ ui: 'ui.html',
+ },
+ });
+ });
+
+ test('should handle missing get-files result', async () => {
+ const context = createMockTaskContext({});
+
+ await expect(BuildManifestTask.run(baseOptions, context)).rejects.toThrow(
+ 'Failed to build manifest: get-files task must run first',
+ );
+ });
+
+ test('should handle missing main/ui files', async () => {
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {},
+ },
+ },
+ });
+
+ const result = await BuildManifestTask.run(baseOptions, context);
+
+ expect(result).toEqual({
+ raw: {},
+ processed: {
+ api: '1.0.0',
+ },
+ });
+ });
+
+ test('should handle fs errors', async () => {
+ // Mock writeFile to reject
+ mocks.writeFile.mockRejectedValueOnce(new Error('Failed to write file'));
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {
+ main: 'src/main.ts',
+ },
+ },
+ },
+ });
+
+ await expect(BuildManifestTask.run(baseOptions, context)).rejects.toThrow(
+ 'Failed to build manifest: Failed to write file',
+ );
+ });
+
+ describe('Watch Mode', () => {
+ test('should set up watchers in dev mode', async () => {
+ mockFs.addFiles({
+ 'src/main.ts': 'export default {}',
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {
+ main: 'src/main.ts',
+ },
+ },
+ },
+ });
+
+ await BuildManifestTask.run(baseOptions, context);
+
+ const watchCalls = mocks.chokidar.watch.mock.calls;
+ expect(watchCalls).toHaveLength(2);
+
+ // First call for manifest and package.json
+ const firstCall = watchCalls[0];
+ expect(firstCall?.[0]).toEqual(['./manifest.json', './package.json']);
+
+ // Second call for src directory
+ const secondCall = watchCalls[1];
+ expect(secondCall).toEqual([
+ ['./src'],
+ {
+ ignoreInitial: false,
+ persistent: true,
+ },
+ ]);
+ });
+
+ test('should handle manifest changes', async () => {
+ mockFs.addFiles({
+ 'src/main.ts': 'export default {}',
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {
+ main: 'src/main.ts',
+ },
+ },
+ },
+ });
+
+ await BuildManifestTask.run(baseOptions, context);
+
+ // Simulate manifest change event
+ const onCall = mocks.watcher.on.mock.calls.find(
+ (call) => call[0] === 'change',
+ );
+ if (onCall) {
+ const [, handler] = onCall;
+ await handler();
+ }
+
+ expect(mocks.RestartViteServerTask.default.run).toHaveBeenCalledWith(
+ expect.objectContaining({
+ command: 'dev',
+ mode: 'development',
+ }),
+ expect.any(Object),
+ );
+ });
+
+ test('should handle new file additions', async () => {
+ mockFs.addFiles({
+ 'src/main.ts': 'export default {}',
+ });
+
+ const mainPath = 'src/new-file.ts';
+ const files = {
+ manifest: {
+ main: mainPath,
+ },
+ };
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files,
+ },
+ });
+
+ // Mock getFilesRecursively to return empty array so new file isn't in existingFiles
+ mocks.getFilesRecursively.mockResolvedValue([]);
+
+ // Mock path.relative to return the same path as in manifest
+ mocks.path.relative.mockReturnValue(mainPath);
+
+ // Mock readFile to return manifest with matching main path
+ mocks.readFileMock.mockImplementation((path: string) => {
+ if (path === 'package.json') {
+ return Promise.resolve(
+ JSON.stringify({
+ name: 'test-plugin',
+ version: '1.0.0',
+ }),
+ );
+ }
+ if (path === 'manifest.json') {
+ return Promise.resolve(
+ JSON.stringify({
+ main: mainPath,
+ }),
+ );
+ }
+ return mockFs.readFile(path);
+ });
+
+ await BuildManifestTask.run(baseOptions, context);
+
+ // Simulate file add event with the same path as manifest.main
+ const onCall = mocks.watcher.on.mock.calls.find(
+ (call) => call[0] === 'add',
+ );
+ if (onCall) {
+ const [, handler] = onCall;
+ await handler(mainPath);
+ }
+
+ expect(mocks.BuildMainTask.run).toHaveBeenCalledWith(
+ expect.objectContaining({
+ command: 'dev',
+ }),
+ expect.any(Object),
+ );
+ });
+
+ test('should not set up watchers in build mode', async () => {
+ mockFs.addFiles({
+ 'src/main.ts': 'export default {}',
+ });
+
+ const context = createMockTaskContext({
+ [GetFilesTask.name]: {
+ files: {
+ manifest: {
+ main: 'src/main.ts',
+ },
+ },
+ },
+ });
+
+ await BuildManifestTask.run(
+ { ...baseOptions, command: 'build' },
+ context,
+ );
+
+ expect(mocks.chokidar.watch).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/packages/plugma/src/tasks/build/manifest.ts b/packages/plugma/src/tasks/build/manifest.ts
new file mode 100644
index 00000000..5a16a925
--- /dev/null
+++ b/packages/plugma/src/tasks/build/manifest.ts
@@ -0,0 +1,254 @@
+import type {
+ GetTaskTypeFor,
+ ManifestFile,
+ PluginOptions,
+ ResultsOfTask,
+} from '#core/types.js';
+import {
+ GetFilesTask,
+ type GetFilesTaskResult,
+} from '#tasks/common/get-files.js';
+import RestartViteServerTask from '#tasks/server/restart-vite.js';
+import { registerCleanup } from '#utils/cleanup.js';
+import { validateOutputFiles } from '#utils/config/validate-output-files.js';
+import { filterNullProps } from '#utils/filter-null-props.js';
+import { getFilesRecursively } from '#utils/fs/get-files-recursively.js';
+import { Logger, defaultLogger as log } from '#utils/log/logger.js';
+import chokidar from 'chokidar';
+import { access, mkdir, writeFile } from 'node:fs/promises';
+import { join, relative, resolve } from 'node:path';
+import { task } from '../runner.js';
+import BuildMainTask from './main.js';
+
+/**
+ * Result type for the build-manifest task
+ */
+export interface BuildManifestResult {
+ /** The original manifest file contents before processing */
+ raw: ManifestFile;
+ /** The processed manifest with defaults and overrides applied */
+ processed: ManifestFile;
+}
+
+/**
+ * Task that generates and maintains the plugin manifest file.
+ *
+ * This task is responsible for:
+ * 1. Creating the initial manifest file with proper defaults and overrides
+ * 2. In development mode:
+ * - Watching manifest.json and package.json for changes
+ * - Watching src directory for file additions/removals
+ * - Triggering server restart when needed
+ * - Rebuilding main script when its path changes
+ * - Validating output files against source files
+ * 3. In build mode:
+ * - Creating the final manifest for production
+ * - Preserving build artifacts
+ *
+ * The manifest file is central to the plugin's functionality as it:
+ * - Defines the plugin's metadata (name, id, version)
+ * - Specifies entry points (main script, UI)
+ * - Sets API compatibility version
+ *
+ * @param options - Plugin build options including command, output path, etc
+ * @param context - Task context containing results from previous tasks
+ * @returns The raw and processed manifest contents
+ */
+const buildManifest = async (
+ options: PluginOptions,
+ context: ResultsOfTask,
+): Promise