diff --git a/cli/bolt-cli.ts b/cli/bolt-cli.ts new file mode 100644 index 00000000..de814d39 --- /dev/null +++ b/cli/bolt-cli.ts @@ -0,0 +1,132 @@ +#!/usr/bin/env node +import { Command } from 'commander'; +import fs from 'fs-extra'; +import path from 'path'; + +const program = new Command(); + +program + .command('make:controller ') + .description('Create a new controller class') + .action((controllerName: string) => { + let normalizedName = controllerName.charAt(0).toUpperCase() + controllerName.slice(1); + const controllerSuffix = 'Controller'; + + if (normalizedName.toLowerCase().endsWith(controllerSuffix.toLowerCase())) { + normalizedName = normalizedName.substring(0, normalizedName.length - controllerSuffix.length) + controllerSuffix; + } else { + normalizedName += controllerSuffix; + } + + const controllerDir = path.resolve(process.cwd(), 'app', 'controllers'); + const controllerPath = path.resolve(controllerDir, `${normalizedName}.ts`); + + try { + fs.ensureDirSync(controllerDir); + + if (fs.existsSync(controllerPath)) { + console.error(`Error: Controller ${normalizedName} already exists at ${controllerPath}`); + process.exit(1); + } + + const boilerplate = `// app/controllers/${normalizedName}.ts + +// TODO: Define or import Request and Response types suitable for the project if needed. + +export class ${normalizedName} { + constructor() { + console.log('${normalizedName} initialized'); + } + + /** + * Example index method. + */ + public async index(): Promise { + console.log('Executing ${normalizedName} index method'); + // Your logic here + // Example: return some data or render a view + } + + /** + * Example show method. + * @param id The ID of the resource to show. + */ + public async show(id: string): Promise { + console.log(\`Executing ${normalizedName} show method for ID: \${id}\`); + // Your logic here + } +} +`; + fs.writeFileSync(controllerPath, boilerplate); + console.log(`Controller ${normalizedName} created successfully at ${controllerPath}`); + + } catch (error) { + if (error instanceof Error) { + console.error(`Failed to create controller: ${error.message}`); + } else { + console.error('Failed to create controller (unknown error type):', error); + } + process.exit(1); + } + }); + +program + .command('make:model ') + .description('Create a new model class') + .action((modelName: string) => { + let normalizedName = modelName.charAt(0).toUpperCase() + modelName.slice(1); + // No strict suffix like "Model" is enforced, just PascalCase. + + const modelDir = path.resolve(process.cwd(), 'app', 'models'); + const modelPath = path.resolve(modelDir, `${normalizedName}.ts`); + + try { + fs.ensureDirSync(modelDir); + + if (fs.existsSync(modelPath)) { + console.error(`Error: Model ${normalizedName} already exists at ${modelPath}`); + process.exit(1); + } + + const boilerplate = `// app/models/${normalizedName}.ts + +// TODO: Define database interaction logic or ORM setup if applicable. + +export class ${normalizedName} { + public id: string | number; // Example property + + constructor(id: string | number) { + this.id = id; + console.log('${normalizedName} initialized with id:', id); + } + + public async save(): Promise { + console.log('Saving ${normalizedName} instance with id:', this.id); + // Actual save logic here + } + + public static async findById(id: string | number): Promise<${normalizedName} | null> { + console.log('Finding ${normalizedName} instance with id:', id); + // Actual find logic here + return null; + } +} +`; + + fs.writeFileSync(modelPath, boilerplate); + console.log(`Model ${normalizedName} created successfully at ${modelPath}`); + + } catch (error) { + if (error instanceof Error) { + console.error(`Failed to create model: ${error.message}`); + } else { + console.error('Failed to create model (unknown error type):', error); + } + process.exit(1); + } + }); + +program.parse(process.argv); + +// Commander handles help output by default if no command/args are given, +// or if an unknown command is used. So, no explicit help call needed here. diff --git a/cli/tests/cli.test.ts b/cli/tests/cli.test.ts new file mode 100644 index 00000000..50910824 --- /dev/null +++ b/cli/tests/cli.test.ts @@ -0,0 +1,126 @@ +import { type ExecSyncOptionsWithStringEncoding, execSync } from 'child_process'; // Added 'type' keyword +import fs from 'fs-extra'; +import path from 'path'; +import assert from 'assert'; +import { rimrafSync } from 'rimraf'; // Use rimrafSync + +const cliCommand = 'pnpm run bolt --'; // Base command to run the CLI +const controllersDir = path.join(process.cwd(), 'app', 'controllers'); +const modelsDir = path.join(process.cwd(), 'app', 'models'); + +const execOptions: ExecSyncOptionsWithStringEncoding = { encoding: 'utf-8', stdio: 'pipe' }; + +function runCli(args: string): { stdout: string; stderr: string; error: any } { + try { + const stdout = execSync(`${cliCommand} ${args}`, execOptions); + return { stdout, stderr: '', error: null }; + } catch (e: any) { + // If execSync throws, 'e' is the error object. + // stdout and stderr are properties on it if the command produced output before failing. + return { + stdout: e.stdout?.toString() || '', + stderr: e.stderr?.toString() || '', + error: e + }; + } +} + +function cleanup() { + console.log('Cleaning up test directories...'); + if (fs.existsSync(controllersDir)) { + rimrafSync(controllersDir); + } + if (fs.existsSync(modelsDir)) { + rimrafSync(modelsDir); + } +} + +function testMakeController() { + console.log('Running make:controller tests...'); + let result; + + // Test 1: Successful creation + console.log(' Test 1: Successful controller creation'); + result = runCli('make:controller TestUserController'); + assert.strictEqual(result.error, null, `make:controller TestUserController failed: STDERR: ${result.stderr} STDOUT: ${result.stdout}`); + const controllerPath = path.join(controllersDir, 'TestUserController.ts'); + assert(fs.existsSync(controllerPath), `TestUserController.ts should be created. STDERR: ${result.stderr}`); + const content = fs.readFileSync(controllerPath, 'utf-8'); + assert(content.includes('export class TestUserController'), 'File content is incorrect'); + console.log(' Test 1 PASSED'); + + // Test 2: Already exists + console.log(' Test 2: Controller already exists'); + result = runCli('make:controller TestUserController'); + assert.notStrictEqual(result.error, null, 'make:controller TestUserController should fail if controller exists'); + assert(result.stderr.includes('already exists'), `Error message for existing controller is incorrect. STDERR: ${result.stderr}`); + console.log(' Test 2 PASSED'); + + // Test 3: Naming convention (lowercase input) + console.log(' Test 3: Controller naming convention'); + result = runCli('make:controller lowercaseuser'); + assert.strictEqual(result.error, null, `make:controller lowercaseuser failed: ${result.stderr}`); + const normalizedControllerPath = path.join(controllersDir, 'LowercaseuserController.ts'); + assert(fs.existsSync(normalizedControllerPath), `LowercaseuserController.ts should be created. Actual path: ${normalizedControllerPath}`); + console.log(' Test 3 PASSED'); + + // Test 4: Missing argument + console.log(' Test 4: Missing controller name'); + result = runCli('make:controller'); + assert.notStrictEqual(result.error, null, 'make:controller should fail without a name'); + assert(result.stderr.includes("error: missing required argument 'ControllerName'"), `Error message for missing argument is incorrect. STDERR: ${result.stderr}`); + console.log(' Test 4 PASSED'); +} + +function testMakeModel() { + console.log('Running make:model tests...'); + let result; + + // Test 1: Successful creation + console.log(' Test 1: Successful model creation'); + result = runCli('make:model TestModel'); + assert.strictEqual(result.error, null, `make:model TestModel failed: ${result.stderr}`); + const modelPath = path.join(modelsDir, 'TestModel.ts'); + assert(fs.existsSync(modelPath), 'TestModel.ts should be created'); + const content = fs.readFileSync(modelPath, 'utf-8'); + assert(content.includes('export class TestModel'), 'File content is incorrect'); + console.log(' Test 1 PASSED'); + + // Test 2: Already exists + console.log(' Test 2: Model already exists'); + result = runCli('make:model TestModel'); + assert.notStrictEqual(result.error, null, 'make:model TestModel should fail if model exists'); + assert(result.stderr.includes('already exists'), `Error message for existing model is incorrect. STDERR: ${result.stderr}`); + console.log(' Test 2 PASSED'); + + // Test 3: Naming convention (lowercase input) + console.log(' Test 3: Model naming convention'); + result = runCli('make:model lowermodule'); + assert.strictEqual(result.error, null, `make:model lowermodule failed: ${result.stderr}`); + const normalizedModelPath = path.join(modelsDir, 'Lowermodule.ts'); + assert(fs.existsSync(normalizedModelPath), `Lowermodule.ts should be created. Actual path: ${normalizedModelPath}`); + console.log(' Test 3 PASSED'); + + // Test 4: Missing argument + console.log(' Test 4: Missing model name'); + result = runCli('make:model'); + assert.notStrictEqual(result.error, null, 'make:model should fail without a name'); + assert(result.stderr.includes("error: missing required argument 'ModelName'"), `Error message for missing argument is incorrect. STDERR: ${result.stderr}`); + console.log(' Test 4 PASSED'); +} + +// Main test execution +try { + cleanup(); + testMakeController(); + cleanup(); + testMakeModel(); + console.log('\nAll CLI tests PASSED!'); +} catch (e: any) { + console.error('\nCLI tests FAILED:', e.message); // Log specific error message + if (e.stdout) console.error('STDOUT:', e.stdout.toString()); + if (e.stderr) console.error('STDERR:', e.stderr.toString()); + process.exit(1); +} finally { + cleanup(); +} diff --git a/package.json b/package.json index 9051a74a..4632919e 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,10 @@ "deploy": "npm run build && wrangler pages deploy", "build": "remix vite:build", "dev": "node pre-start.cjs && remix vite:dev", + "bolt": "TS_NODE_PROJECT=tsconfig.cli.json node --loader ts-node/esm --experimental-specifier-resolution=node cli/bolt-cli.ts", "test": "vitest --run", "test:watch": "vitest", + "test:cli": "TS_NODE_PROJECT=tsconfig.cli.test.json node --loader ts-node/esm --experimental-specifier-resolution=node cli/tests/cli.test.ts", "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint app", "lint:fix": "npm run lint -- --fix && prettier app --write", "start:windows": "wrangler pages dev ./build/client", @@ -106,6 +108,7 @@ "chart.js": "^4.4.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "commander": "^14.0.0", "date-fns": "^3.6.0", "diff": "^5.2.0", "dotenv": "^16.4.7", @@ -114,6 +117,7 @@ "electron-updater": "^6.3.9", "file-saver": "^2.0.5", "framer-motion": "^11.12.0", + "fs-extra": "^11.3.0", "ignore": "^6.0.2", "isbot": "^4.4.0", "isomorphic-git": "^1.27.2", @@ -168,11 +172,14 @@ "@types/dom-speech-recognition": "^0.0.4", "@types/electron": "^1.6.12", "@types/file-saver": "^2.0.7", + "@types/fs-extra": "^11.0.4", "@types/js-cookie": "^3.0.6", + "@types/node": "^22.15.30", "@types/path-browserify": "^1.0.3", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/react-window": "^1.8.8", + "@types/rimraf": "^4.0.5", "@vitejs/plugin-react": "^4.3.4", "concurrently": "^8.2.2", "cross-env": "^7.0.3", @@ -191,6 +198,7 @@ "rimraf": "^4.4.1", "sass-embedded": "^1.81.0", "stream-browserify": "^3.0.0", + "ts-node": "^10.9.2", "typescript": "^5.7.2", "unified": "^11.0.5", "unocss": "^0.61.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4f026db..8101aeee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,6 +197,9 @@ importers: clsx: specifier: ^2.1.0 version: 2.1.1 + commander: + specifier: ^14.0.0 + version: 14.0.0 date-fns: specifier: ^3.6.0 version: 3.6.0 @@ -221,6 +224,9 @@ importers: framer-motion: specifier: ^11.12.0 version: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + fs-extra: + specifier: ^11.3.0 + version: 11.3.0 ignore: specifier: ^6.0.2 version: 6.0.2 @@ -271,7 +277,7 @@ importers: version: 5.3.0(chart.js@4.4.8)(react@18.3.1) react-dnd: specifier: ^16.0.1 - version: 16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.13.14)(@types/react@18.3.20)(react@18.3.1) + version: 16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.15.30)(@types/react@18.3.20)(react@18.3.1) react-dnd-html5-backend: specifier: ^16.0.1 version: 16.0.1 @@ -331,7 +337,7 @@ importers: version: 10.0.4(react@18.3.1) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + version: 0.22.0(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) zod: specifier: ^3.24.1 version: 3.24.2 @@ -356,7 +362,7 @@ importers: version: 2.0.0 '@remix-run/dev': specifier: ^2.15.2 - version: 2.16.3(@remix-run/react@2.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.3(typescript@5.8.2))(@types/node@22.13.14)(sass-embedded@1.86.0)(typescript@5.8.2)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))(wrangler@4.6.0(@cloudflare/workers-types@4.20250327.0)) + version: 2.16.3(@remix-run/react@2.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.3(typescript@5.8.2))(@types/node@22.15.30)(sass-embedded@1.86.0)(ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.2))(typescript@5.8.2)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))(wrangler@4.6.0(@cloudflare/workers-types@4.20250327.0)) '@remix-run/serve': specifier: ^2.15.2 version: 2.16.3(typescript@5.8.2) @@ -378,9 +384,15 @@ importers: '@types/file-saver': specifier: ^2.0.7 version: 2.0.7 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 '@types/js-cookie': specifier: ^3.0.6 version: 3.0.6 + '@types/node': + specifier: ^22.15.30 + version: 22.15.30 '@types/path-browserify': specifier: ^1.0.3 version: 1.0.3 @@ -393,9 +405,12 @@ importers: '@types/react-window': specifier: ^1.8.8 version: 1.8.8 + '@types/rimraf': + specifier: ^4.0.5 + version: 4.0.5 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + version: 4.3.4(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -447,6 +462,9 @@ importers: stream-browserify: specifier: ^3.0.0 version: 3.0.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.15.30)(typescript@5.8.2) typescript: specifier: ^5.7.2 version: 5.8.2 @@ -455,22 +473,22 @@ importers: version: 11.0.5 unocss: specifier: ^0.61.9 - version: 0.61.9(postcss@8.5.3)(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + version: 0.61.9(postcss@8.5.3)(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) vite: specifier: ^5.4.11 - version: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + version: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) vite-plugin-copy: specifier: ^0.1.6 version: 0.1.6 vite-plugin-optimize-css-modules: specifier: ^1.1.0 - version: 1.2.0(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + version: 1.2.0(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.8.2)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + version: 4.3.2(typescript@5.8.2)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) vitest: specifier: ^2.1.7 - version: 2.1.9(@types/node@22.13.14)(jsdom@26.0.0)(sass-embedded@1.86.0) + version: 2.1.9(@types/node@22.15.30)(jsdom@26.0.0)(sass-embedded@1.86.0) wrangler: specifier: ^4.5.1 version: 4.6.0(@cloudflare/workers-types@4.20250327.0) @@ -3181,6 +3199,18 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -3230,6 +3260,9 @@ packages: '@types/file-saver@2.0.7': resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -3251,6 +3284,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -3269,8 +3305,8 @@ packages: '@types/node@20.17.28': resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==} - '@types/node@22.13.14': - resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} '@types/path-browserify@1.0.3': resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==} @@ -3304,6 +3340,10 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/rimraf@4.0.5': + resolution: {integrity: sha512-DTCZoIQotB2SUJnYgrEx43cQIUYOlNZz0AZPbKU4PSLYTUdML5Gox0++z4F9kQocxStrCmRNhi4x5x/UlwtKUA==} + deprecated: This is a stub types definition. rimraf provides its own type definitions, so you do not need this installed. + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -3669,6 +3709,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -4060,6 +4103,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} + commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -4363,6 +4410,10 @@ packages: diff3@0.0.3: resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -5605,6 +5656,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -7552,6 +7606,20 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tsconfck@3.1.5: resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} @@ -7621,8 +7689,8 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -7797,6 +7865,9 @@ packages: engines: {node: '>=8'} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + valibot@0.41.0: resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} peerDependencies: @@ -8106,6 +8177,10 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -10502,7 +10577,7 @@ snapshots: optionalDependencies: typescript: 5.8.2 - '@remix-run/dev@2.16.3(@remix-run/react@2.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.3(typescript@5.8.2))(@types/node@22.13.14)(sass-embedded@1.86.0)(typescript@5.8.2)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))(wrangler@4.6.0(@cloudflare/workers-types@4.20250327.0))': + '@remix-run/dev@2.16.3(@remix-run/react@2.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(@remix-run/serve@2.16.3(typescript@5.8.2))(@types/node@22.15.30)(sass-embedded@1.86.0)(ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.2))(typescript@5.8.2)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))(wrangler@4.6.0(@cloudflare/workers-types@4.20250327.0))': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.27.0 @@ -10519,7 +10594,7 @@ snapshots: '@remix-run/router': 1.23.0 '@remix-run/server-runtime': 2.16.3(typescript@5.8.2) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@22.13.14)(sass-embedded@1.86.0) + '@vanilla-extract/integration': 6.5.0(@types/node@22.15.30)(sass-embedded@1.86.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -10547,7 +10622,7 @@ snapshots: pidtree: 0.6.0 postcss: 8.5.3 postcss-discard-duplicates: 5.1.0(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.2)) postcss-modules: 6.0.1(postcss@8.5.3) prettier: 2.8.8 pretty-ms: 7.0.1 @@ -10559,12 +10634,12 @@ snapshots: tar-fs: 2.1.2 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.2) - vite-node: 3.0.0-beta.2(@types/node@22.13.14)(sass-embedded@1.86.0) + vite-node: 3.0.0-beta.2(@types/node@22.15.30)(sass-embedded@1.86.0) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.16.3(typescript@5.8.2) typescript: 5.8.2 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) wrangler: 4.6.0(@cloudflare/workers-types@4.20250327.0) transitivePeerDependencies: - '@types/node' @@ -11138,6 +11213,14 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.7 @@ -11169,7 +11252,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.28 + '@types/node': 22.15.30 '@types/responselike': 1.0.3 '@types/cookie@0.6.0': {} @@ -11198,9 +11281,14 @@ snapshots: '@types/file-saver@2.0.7': {} + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.15.30 + '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.30 '@types/hast@2.3.10': dependencies: @@ -11221,9 +11309,13 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.15.30 + '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.28 + '@types/node': 22.15.30 '@types/mdast@3.0.15': dependencies: @@ -11241,15 +11333,15 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.13.14': + '@types/node@22.15.30': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 '@types/path-browserify@1.0.3': {} '@types/plist@3.0.5': dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.30 xmlbuilder: 15.1.1 optional: true @@ -11284,7 +11376,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.28 + '@types/node': 22.15.30 + + '@types/rimraf@4.0.5': + dependencies: + rimraf: 4.4.1 '@types/unist@2.0.11': {} @@ -11297,7 +11393,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.17.28 + '@types/node': 22.15.30 optional: true '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.23.0(jiti@1.21.7))(typescript@5.8.2)': @@ -11393,13 +11489,13 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unocss/astro@0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))': + '@unocss/astro@0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))': dependencies: '@unocss/core': 0.61.9 '@unocss/reset': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + '@unocss/vite': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) optionalDependencies: - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - rollup - supports-color @@ -11536,7 +11632,7 @@ snapshots: dependencies: '@unocss/core': 0.61.9 - '@unocss/vite@0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))': + '@unocss/vite@0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.4(rollup@4.38.0) @@ -11548,7 +11644,7 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.3 magic-string: 0.30.17 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - rollup - supports-color @@ -11576,7 +11672,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@22.13.14)(sass-embedded@1.86.0)': + '@vanilla-extract/integration@6.5.0(@types/node@22.15.30)(sass-embedded@1.86.0)': dependencies: '@babel/core': 7.26.10 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) @@ -11589,8 +11685,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.4 outdent: 0.8.0 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) - vite-node: 1.6.1(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) + vite-node: 1.6.1(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11605,14 +11701,14 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vitejs/plugin-react@4.3.4(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - supports-color @@ -11623,13 +11719,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0))': + '@vitest/mocker@2.1.9(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) '@vitest/pretty-format@2.1.9': dependencies: @@ -11849,6 +11945,8 @@ snapshots: delegates: 1.0.0 readable-stream: 3.6.2 + arg@4.1.3: {} + arg@5.0.2: {} argparse@2.0.1: {} @@ -12319,6 +12417,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@14.0.0: {} + commander@5.1.0: {} common-tags@1.8.2: {} @@ -12608,6 +12708,8 @@ snapshots: diff3@0.0.3: {} + diff@4.0.2: {} + diff@5.2.0: {} diffie-hellman@5.0.3: @@ -13145,7 +13247,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.30 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -14191,6 +14293,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-error@1.3.6: {} + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.6.0 @@ -15441,12 +15545,13 @@ snapshots: dependencies: postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.2)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.3 + ts-node: 10.9.2(@types/node@22.15.30)(typescript@5.8.2) postcss-modules-extract-imports@3.1.0(postcss@8.5.3): dependencies: @@ -15641,7 +15746,7 @@ snapshots: dependencies: dnd-core: 16.0.1 - react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.13.14)(@types/react@18.3.20)(react@18.3.1): + react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.15.30)(@types/react@18.3.20)(react@18.3.1): dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -15651,7 +15756,7 @@ snapshots: react: 18.3.1 optionalDependencies: '@types/hoist-non-react-statics': 3.3.6 - '@types/node': 22.13.14 + '@types/node': 22.15.30 '@types/react': 18.3.20 react-dom@18.3.1(react@18.3.1): @@ -16642,6 +16747,24 @@ snapshots: dependencies: typescript: 5.8.2 + ts-node@10.9.2(@types/node@22.15.30)(typescript@5.8.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.15.30 + acorn: 8.14.1 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsconfck@3.1.5(typescript@5.8.2): optionalDependencies: typescript: 5.8.2 @@ -16705,7 +16828,7 @@ snapshots: undici-types@6.19.8: {} - undici-types@6.20.0: {} + undici-types@6.21.0: {} undici@5.29.0: dependencies: @@ -16820,9 +16943,9 @@ snapshots: universalify@2.0.1: {} - unocss@0.61.9(postcss@8.5.3)(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)): + unocss@0.61.9(postcss@8.5.3)(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)): dependencies: - '@unocss/astro': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + '@unocss/astro': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) '@unocss/cli': 0.61.9(rollup@4.38.0) '@unocss/core': 0.61.9 '@unocss/extractor-arbitrary-variants': 0.61.9 @@ -16841,9 +16964,9 @@ snapshots: '@unocss/transformer-compile-class': 0.61.9 '@unocss/transformer-directives': 0.61.9 '@unocss/transformer-variant-group': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + '@unocss/vite': 0.61.9(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) optionalDependencies: - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - postcss - rollup @@ -16921,6 +17044,8 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 + v8-compile-cache-lib@3.0.1: {} + valibot@0.41.0(typescript@5.8.2): optionalDependencies: typescript: 5.8.2 @@ -16972,13 +17097,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@1.6.1(@types/node@22.13.14)(sass-embedded@1.86.0): + vite-node@1.6.1(@types/node@22.15.30)(sass-embedded@1.86.0): dependencies: cac: 6.7.14 debug: 4.4.0 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - '@types/node' - less @@ -16990,13 +17115,13 @@ snapshots: - supports-color - terser - vite-node@2.1.9(@types/node@22.13.14)(sass-embedded@1.86.0): + vite-node@2.1.9(@types/node@22.15.30)(sass-embedded@1.86.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - '@types/node' - less @@ -17008,13 +17133,13 @@ snapshots: - supports-color - terser - vite-node@3.0.0-beta.2(@types/node@22.13.14)(sass-embedded@1.86.0): + vite-node@3.0.0-beta.2(@types/node@22.15.30)(sass-embedded@1.86.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - '@types/node' - less @@ -17030,43 +17155,43 @@ snapshots: dependencies: fast-glob: 3.3.3 - vite-plugin-node-polyfills@0.22.0(rollup@4.38.0)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)): + vite-plugin-node-polyfills@0.22.0(rollup@4.38.0)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.38.0) node-stdlib-browser: 1.3.1 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - rollup - vite-plugin-optimize-css-modules@1.2.0(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)): + vite-plugin-optimize-css-modules@1.2.0(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)): dependencies: - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) - vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)): + vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.2) optionalDependencies: - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0): + vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.38.0 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.30 fsevents: 2.3.3 sass-embedded: 1.86.0 - vitest@2.1.9(@types/node@22.13.14)(jsdom@26.0.0)(sass-embedded@1.86.0): + vitest@2.1.9(@types/node@22.15.30)(jsdom@26.0.0)(sass-embedded@1.86.0): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0)) + '@vitest/mocker': 2.1.9(vite@5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -17082,11 +17207,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.15(@types/node@22.13.14)(sass-embedded@1.86.0) - vite-node: 2.1.9(@types/node@22.13.14)(sass-embedded@1.86.0) + vite: 5.4.15(@types/node@22.15.30)(sass-embedded@1.86.0) + vite-node: 2.1.9(@types/node@22.15.30)(sass-embedded@1.86.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.30 jsdom: 26.0.0 transitivePeerDependencies: - less @@ -17244,6 +17369,8 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + yn@3.1.1: {} + yocto-queue@0.1.0: {} youch@3.2.3: diff --git a/tsconfig.cli.json b/tsconfig.cli.json new file mode 100644 index 00000000..916bf69f --- /dev/null +++ b/tsconfig.cli.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist/cli", + "rootDir": "cli", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + }, + "include": [ + "cli/**/*.ts" + ], + "exclude": [ + "node_modules", + "app", + "dist" + ] +} diff --git a/tsconfig.cli.test.json b/tsconfig.cli.test.json new file mode 100644 index 00000000..79955ca6 --- /dev/null +++ b/tsconfig.cli.test.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist/cli_tests", + "rootDir": ".", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node", + "transpileOnly": true + }, + "include": [ + "cli/tests/**/*.ts" + ], + "exclude": [ + "node_modules", + "app", + "dist" + ] +}