diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 8881602..6adb9e8 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -4,7 +4,7 @@ on: jobs: formatting: runs-on: ubuntu-latest - container: node:21.5.0-alpine3.19 + container: node:22.6.0-alpine3.19 steps: - run: apk add make - uses: actions/checkout@v4 @@ -13,7 +13,7 @@ jobs: spelling: runs-on: ubuntu-latest - container: node:21.5.0-alpine3.19 + container: node:22.6.0-alpine3.19 steps: - run: apk add make - uses: actions/checkout@v4 diff --git a/.github/workflows/test-npm.yaml b/.github/workflows/test-npm.yaml index e817b59..7df1132 100644 --- a/.github/workflows/test-npm.yaml +++ b/.github/workflows/test-npm.yaml @@ -4,27 +4,18 @@ on: jobs: audit: runs-on: ubuntu-latest - container: node:21.5.0-alpine3.19 + container: node:22.6.0-alpine3.19 steps: - uses: actions/checkout@v4 - run: npm ci - run: npm --workspaces audit --audit-level high - test-lts: - strategy: - matrix: - node-version: [18, 20, 22] - runs-on: [ubuntu-latest, windows-latest, macos-latest] - runs-on: ${{ matrix.runs-on }} + test: + runs-on: ubuntu-latest + container: node:22.6.0-alpine3.19 steps: - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - run: corepack enable - uses: actions/checkout@v4 - run: npm run initialize - - # node test runner seems to support globs since v21 - - if: ${{ matrix.node-version >= 21 }} - run: npm --workspaces test + - run: npm --workspaces test diff --git a/.gitignore b/.gitignore index 3acb00d..4af3909 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ !.gitattributes !.editorconfig !.npmrc - node_modules/ target/ coverage/ diff --git a/SkiffaExamples.code-workspace b/SkiffaExamples.code-workspace index 4cbddf2..233342d 100644 --- a/SkiffaExamples.code-workspace +++ b/SkiffaExamples.code-workspace @@ -12,6 +12,10 @@ "name": "npm/reverse", "path": "packages/npm/reverse", }, + { + "name": "npm/todo", + "path": "packages/npm/todo", + }, ], "settings": { "window.title": "Skiffa Examples", @@ -27,6 +31,9 @@ "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer", }, + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, }, "extensions": { "recommendations": [ diff --git a/cspell.config.yaml b/cspell.config.yaml index b504761..3be568b 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -8,6 +8,7 @@ words: - remle - ryanluker - skiffa + - todos useGitignore: true files: - "**" diff --git a/package-lock.json b/package-lock.json index 56e4b5d..037b088 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "generated/npm/*", "packages/npm/*" ], + "dependencies": { + "todo-api": "^0.1.0" + }, "devDependencies": { "@skiffa/generator": "^0.13.7", "cspell": "^8.14.2", @@ -19,13 +22,13 @@ "version": "0.1.0", "license": "ISC", "dependencies": { - "@skiffa/lib": "^0.12.4", - "@types/node": "^18.19.45", + "@skiffa/lib": "^0.12.2", + "@types/node": "^18.19.43", "goodrouter": "^2.1.6" }, "devDependencies": { "@tsconfig/node18": "^18.2.4", - "rollup": "^4.21.0", + "rollup": "^4.20.0", "typescript": "^5.5.4" }, "engines": { @@ -36,13 +39,13 @@ "version": "0.1.0", "license": "ISC", "dependencies": { - "@skiffa/lib": "^0.12.4", - "@types/node": "^18.19.45", + "@skiffa/lib": "^0.12.2", + "@types/node": "^18.19.43", "goodrouter": "^2.1.6" }, "devDependencies": { "@tsconfig/node18": "^18.2.4", - "rollup": "^4.21.0", + "rollup": "^4.20.0", "typescript": "^5.5.4" }, "engines": { @@ -170,15 +173,15 @@ "dev": true }, "node_modules/@cspell/dict-aws": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.3.tgz", - "integrity": "sha512-0C0RQ4EM29fH0tIYv+EgDQEum0QI6OrmjENC9u98pB8UcnYxGG/SqinuPxo+TgcEuInj0Q73MsBpJ1l5xUnrsw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.4.tgz", + "integrity": "sha512-6AWI/Kkf+RcX/J81VX8+GKLeTgHWEr/OMhGk3dHQzWK66RaqDJCGDqi7494ghZKcBB7dGa3U5jcKw2FZHL/u3w==", "dev": true }, "node_modules/@cspell/dict-bash": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.3.tgz", - "integrity": "sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.4.tgz", + "integrity": "sha512-W/AHoQcJYn3Vn/tUiXX2+6D/bhfzdDshwcbQWv9TdiNlXP9P6UJjDKWbxyA5ogJCsR2D0X9Kx11oV8E58siGKQ==", "dev": true }, "node_modules/@cspell/dict-companies": { @@ -188,9 +191,9 @@ "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.1.15.tgz", - "integrity": "sha512-5X8SouN/qIUrBTcDEevnKU6G3cRSm3Vm7dQEcjHaptIWp+/2YMknIfYbnhKeR1G9V/sbQaY4CVsVAKEaehY+7Q==", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.1.16.tgz", + "integrity": "sha512-32fU5RkuOM55IRcxjByiSoKbjr+C4danDfYjHaQNRWdvjzJzci3fLDGA2wTXiclkgDODxGiV8LCTUwCz+3TNWA==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -212,9 +215,9 @@ "dev": true }, "node_modules/@cspell/dict-dart": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.3.tgz", - "integrity": "sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.2.1.tgz", + "integrity": "sha512-yriKm7QkoPx3JPSSOcw6iX9gOb2N50bOo/wqWviqPYbhpMRh9Xiv6dkUy3+ot+21GuShZazO8X6U5+Vw67XEwg==", "dev": true }, "node_modules/@cspell/dict-data-science": { @@ -236,9 +239,9 @@ "dev": true }, "node_modules/@cspell/dict-dotnet": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.3.tgz", - "integrity": "sha512-q8+b8YWYv+9Q+AbU3mH/RHE9aovhCuGtMuNSsx+YnTofEhVQkJR3vdrYjhOBg3epIiZVUS83VP0vxPLPa+UTug==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.5.tgz", + "integrity": "sha512-gjg0L97ee146wX47dnA698cHm85e7EOpf9mVrJD8DmEaqoo/k1oPy2g7c7LgKxK9XnqwoXxhLNnngPrwXOoEtQ==", "dev": true }, "node_modules/@cspell/dict-elixir": { @@ -302,9 +305,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.11.tgz", - "integrity": "sha512-BMFIDGh1HaFUe1cYBT1dotqyIQG2j3VkNntGQTBa/7i0aBnC5PBJDiAXnUeBHi0AVrz0hyAc7xtcK5KyKCEzwg==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.12.tgz", + "integrity": "sha512-LEPeoqd+4O+vceHF73S7D7+LYfrAjOvp4Dqzh4MT30ruzlQ77yHRSuYOJtrFN1GK5ntAt/ILSVOKg9sgsz1Llg==", "dev": true }, "node_modules/@cspell/dict-google": { @@ -386,21 +389,21 @@ "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.18.tgz", - "integrity": "sha512-weMTyxWpzz19q4wv9n183BtFvdD5fCjtze+bFKpl+4rO/YlPhHL2cXLAeexJz/VDSBecwX4ybTZYoknd1h2J4w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.1.4.tgz", + "integrity": "sha512-yzqVTY4P5neom4z9orV2IFOqDZ7fDotmisP7nwQkEmftoELgn5CUtNdnJhWDoDQQn6yrxOxA8jEqmyETIWzN4Q==", "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.8.tgz", - "integrity": "sha512-TBw3won4MCBQ2wdu7kvgOCR3dY2Tb+LJHgDUpuquy3WnzGiSDJ4AVelrZdE1xu7mjFJUr4q48aB21YT5uQqPZA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.10.tgz", + "integrity": "sha512-NfTZdp6kcZDF1PvgQ6cY0zE4FUO5rSwNmBH/iwCBuaLfJAFQ97rgjxo+D2bic4CFwNjyHutnHPtjJBRANO5XQw==", "dev": true }, "node_modules/@cspell/dict-powershell": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.5.tgz", - "integrity": "sha512-3JVyvMoDJesAATYGOxcUWPbQPUvpZmkinV3m8HL1w1RrjeMVXXuK7U1jhopSneBtLhkU+9HKFwgh9l9xL9mY2Q==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.8.tgz", + "integrity": "sha512-Eg64BccQp5oEJ+V/O2G27KaLWmuOL2AWMOs2470adUihOleRfW8j9XwAEGCS+JKSnDb2mksWA72Z6kDqH138IQ==", "dev": true }, "node_modules/@cspell/dict-public-licenses": { @@ -410,9 +413,9 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.4.tgz", - "integrity": "sha512-sCtLBqMreb+8zRW2bXvFsfSnRUVU6IFm4mT6Dc4xbz0YajprbaPPh/kOUTw5IJRP8Uh+FFb7Xp2iH03CNWRq/A==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.6.tgz", + "integrity": "sha512-Hkz399qDGEbfXi9GYa2hDl7GahglI86JmS2F1KP8sfjLXofUgtnknyC5NWc86nzHcP38pZiPqPbTigyDYw5y8A==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^2.0.1" @@ -425,9 +428,9 @@ "dev": true }, "node_modules/@cspell/dict-ruby": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.2.tgz", - "integrity": "sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.3.tgz", + "integrity": "sha512-V1xzv9hN6u8r6SM4CkYdsxs4ov8gjXXo0Twfx5kWhLXbEVxTXDMt7ohLTqpy2XlF5mutixZdbHMeFiAww8v+Ug==", "dev": true }, "node_modules/@cspell/dict-rust": { @@ -443,9 +446,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-4.0.10.tgz", - "integrity": "sha512-FwFwPnTlzyjtndCxUnaVHk7wYpWRC4EqY9/Q5q2pROKt1rQILRmutjIqzHLH6WX9sb/+wVNb7UKwKO32eflp4g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-4.1.3.tgz", + "integrity": "sha512-5Wn5JG4IzCboX5pjISdkipsPKGaz1//iuBZdHl4US5x7mO4jOGXLpjzx6ZoPM4PXUlMEFz9NJRCDepAu8fXVtA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -467,9 +470,9 @@ "dev": true }, "node_modules/@cspell/dict-terraform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.0.0.tgz", - "integrity": "sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.0.1.tgz", + "integrity": "sha512-29lmUUnZgPh+ieZ5hunick8hzNIpNRtiJh9vAusNskPCrig3RTW6u7F+GG1a8uyslbzSw+Irjf40PTOan1OJJA==", "dev": true }, "node_modules/@cspell/dict-typescript": { @@ -524,29 +527,29 @@ } }, "node_modules/@jns42/core": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@jns42/core/-/core-0.7.9.tgz", - "integrity": "sha512-rFZPdbTDfkXfjkoX8KQ2VlMZB5WPOQNm0+EeLU+Qj6ileN+eFDZn4yfgezpvWxveyU6IP66MDilTeOfaK+yACQ==", + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@jns42/core/-/core-0.7.11.tgz", + "integrity": "sha512-4DWOjbCbsWvVELM/zHn7Vc6dmZEF+d8Ll93r7Y5NZtHZutUSrK0BsidX+Ew4WSL5zDEWOLwLk9GjNjQbuNpCIw==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@jns42/generator": { - "version": "0.21.6", - "resolved": "https://registry.npmjs.org/@jns42/generator/-/generator-0.21.6.tgz", - "integrity": "sha512-YNVODolPpkY2tqTyvbk2bsBxGNenNxe0wCLjFi/VCvn3PalRUM+jGyacKyfH8jCfgCEJGjdwahvbI0zP/qfJfQ==", + "version": "0.21.13", + "resolved": "https://registry.npmjs.org/@jns42/generator/-/generator-0.21.13.tgz", + "integrity": "sha512-EyrPRWwTrIpMnL0dNTOEfEGgnEzkYopT5a4l2Hial6ywX2vX3on4JcQEokoAQ+FSS2QE6OYDfGbxKhBzg7OqEw==", "dev": true, "dependencies": { - "@jns42/core": "^0.7.9", - "@types/node": "^20.14.9", - "@types/yargs": "^17.0.32", + "@jns42/core": "^0.7.11", + "@types/node": "^20.16.5", + "@types/yargs": "^17.0.33", "entities": "^4.5.0", "hash.js": "^1.1.7", "immutable": "^5.0.0-beta.5", - "tslib": "^2.6.3", - "type-fest": "^4.20.1", - "yaml": "^2.4.5", + "tslib": "^2.7.0", + "type-fest": "^4.26.0", + "yaml": "^2.5.1", "yargs": "^17.7.2" }, "bin": { @@ -557,9 +560,9 @@ } }, "node_modules/@jns42/generator/node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -573,9 +576,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -586,18 +588,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -608,9 +608,8 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -633,9 +632,8 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -654,239 +652,227 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", + "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", + "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", + "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", + "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", + "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", + "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", + "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", + "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", + "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", + "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", + "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", + "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", + "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", + "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", + "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", + "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@skiffa/core": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@skiffa/core/-/core-0.2.3.tgz", - "integrity": "sha512-Q3cRqKsfu/RQGmXijYepzX6MQaan6Z44VDVGq/wZYfdePMOSTNmepWVevaZ08Fs/9Ot2+BboQn087riuv5GPLQ==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@skiffa/core/-/core-0.2.5.tgz", + "integrity": "sha512-fB2Yk2HZOve8f8oe5XDrsNDztB6E4qUMYFP5RKS/0bT2NewrI4V1zVedhFDTkKMBhyZQXO7rwSndhRdMo5I0Fw==", "dev": true, "engines": { "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/LuvDaSun" } }, "node_modules/@skiffa/generator": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/@skiffa/generator/-/generator-0.13.7.tgz", - "integrity": "sha512-VZ/4z51V/YB17qrjxh4XkEpB6IDb3PaJr6YTsn6PgYUk2lno/gGTW5+glAA5PMtxkZee0nX5JQ0bX1ejGkRn0Q==", + "version": "0.13.17", + "resolved": "https://registry.npmjs.org/@skiffa/generator/-/generator-0.13.17.tgz", + "integrity": "sha512-ymjQk5meTPHbikgYYKPu7CPxhS4HoIGfM1poctVdwSg2Svcoi0FcJqBxgL6xAh8FpNH6X4fS6akOPEJ+kGuWOw==", "dev": true, "dependencies": { - "@jns42/core": "^0.7.9", - "@jns42/generator": "^0.21.6", - "@skiffa/core": "^0.2.3", - "@skiffa/lib": "^0.12.4", - "@types/node": "^18.19.45", + "@jns42/core": "^0.7.11", + "@jns42/generator": "^0.21.13", + "@skiffa/core": "^0.2.5", + "@skiffa/lib": "^0.12.6", + "@types/node": "^18.19.50", "@types/yargs": "^17.0.33", "camelcase": "^8.0.0", "goodrouter": "^2.1.6", "tslib": "^2.7.0", - "type-fest": "^4.25.0", - "yaml": "^2.5.0", + "type-fest": "^4.26.0", + "yaml": "^2.5.1", "yargs": "^17.7.2" }, "bin": { @@ -901,45 +887,45 @@ } }, "node_modules/@skiffa/lib": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@skiffa/lib/-/lib-0.12.4.tgz", - "integrity": "sha512-3pFSnYf5fKpJrN90DeeFuX8ZcZER1s5zsR6QAaQnZRcnT9cf+hqVvyxuYeQOzsuQZsn/CQUFOXlvbULN18mHEg==", + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@skiffa/lib/-/lib-0.12.6.tgz", + "integrity": "sha512-si9eBJs/u0tLE0xCZ67SjkpNk3QtbHZ8PLHhpZ7LkVr/mSpwRYdPCJinKZmG8GIr+yTSma96iFkNm68a6DPdgQ==", "dependencies": { - "@types/node": "^18.19.43", + "@types/node": "^18.19.50", "js-base64": "^3.7.7", - "msecs": "^1.0.3", - "tslib": "^2.6.3", - "type-fest": "^4.23.0" + "msecs": "^1.0.4", + "tslib": "^2.7.0", + "type-fest": "^4.26.0" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/LuvDaSun" } }, "node_modules/@tsconfig/node18": { "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", - "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.45.tgz", - "integrity": "sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/resolve": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.33", @@ -958,9 +944,8 @@ }, "node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -989,23 +974,10 @@ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", "dev": true }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "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==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1015,9 +987,8 @@ }, "node_modules/builtin-modules": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1036,9 +1007,8 @@ }, "node_modules/camelcase": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -1048,9 +1018,8 @@ }, "node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1060,9 +1029,8 @@ }, "node_modules/chalk-template": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.2.0" }, @@ -1144,9 +1112,8 @@ }, "node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -1348,20 +1315,10 @@ "node": ">=18" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "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" } @@ -1397,9 +1354,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -1420,9 +1377,8 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-equals": { "version": "5.0.1", @@ -1435,9 +1391,8 @@ }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1451,24 +1406,21 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^5.0.0" }, @@ -1478,9 +1430,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1502,9 +1453,8 @@ }, "node_modules/flat-cache": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.3.1", "keyv": "^4.5.4" @@ -1515,15 +1465,13 @@ }, "node_modules/flatted": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "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==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -1535,9 +1483,8 @@ }, "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==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1562,9 +1509,8 @@ }, "node_modules/get-stdin": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1574,9 +1520,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1601,26 +1546,19 @@ }, "node_modules/goodrouter": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/goodrouter/-/goodrouter-2.1.6.tgz", - "integrity": "sha512-RznZ6pFbEQ+w2xc29B8I4VOfh1ZR4VGT8o+oHrLK5XSLazeOXfH1ACFqWgVLVt+EFNrjqOr6VQ75CE4gJBT8vA==", + "license": "ISC", "dependencies": { "@types/node": "^20.11.25", "tslib": "^2.6.2" } }, "node_modules/goodrouter/node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "version": "20.14.14", + "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~5.26.4" } }, - "node_modules/goodrouter/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==" - }, "node_modules/has-own-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", @@ -1642,9 +1580,8 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1722,9 +1659,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -1736,10 +1672,9 @@ } }, "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==", + "version": "2.15.0", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -1752,9 +1687,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1770,9 +1704,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1782,53 +1715,46 @@ }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/js-base64": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + "license": "BSD-3-Clause" }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.7", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1844,20 +1770,20 @@ "dev": true }, "node_modules/msecs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/msecs/-/msecs-1.0.3.tgz", - "integrity": "sha512-jIdCjDyj//v/v0oDvG4+fiYmXKvyx/GOEYttHLHKAU2bOmOIIZxLCWoZjrft1n9qCva9hUCPxufhWwEEQ906SQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/msecs/-/msecs-1.0.4.tgz", + "integrity": "sha512-FQfJdMEIuky0eR3nOA0BedlqLzBQ/tyYKlxVJTLv3e2Mxsk8xIFki+JblROmjGtTXX/cxP7xNN92KdFY/QTFIg==", "dependencies": { - "@types/node": "^20.11.30" + "@types/node": "^22.5.0" }, "engines": { - "node": ">=18" + "node": ">=16" } }, "node_modules/msecs/node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dependencies": { "undici-types": "~6.19.2" } @@ -1881,15 +1807,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1899,9 +1823,8 @@ }, "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==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -1914,8 +1837,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -1930,7 +1851,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/repeat-string": { "version": "1.6.1", @@ -1952,9 +1874,8 @@ }, "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", @@ -1978,9 +1899,8 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -1995,10 +1915,9 @@ "link": true }, "node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", - "dev": true, + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", + "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", "dependencies": { "@types/estree": "1.0.5" }, @@ -2010,80 +1929,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", + "@rollup/rollup-android-arm-eabi": "4.21.3", + "@rollup/rollup-android-arm64": "4.21.3", + "@rollup/rollup-darwin-arm64": "4.21.3", + "@rollup/rollup-darwin-x64": "4.21.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", + "@rollup/rollup-linux-arm-musleabihf": "4.21.3", + "@rollup/rollup-linux-arm64-gnu": "4.21.3", + "@rollup/rollup-linux-arm64-musl": "4.21.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", + "@rollup/rollup-linux-riscv64-gnu": "4.21.3", + "@rollup/rollup-linux-s390x-gnu": "4.21.3", + "@rollup/rollup-linux-x64-gnu": "4.21.3", + "@rollup/rollup-linux-x64-musl": "4.21.3", + "@rollup/rollup-win32-arm64-msvc": "4.21.3", + "@rollup/rollup-win32-ia32-msvc": "4.21.3", + "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "@types/node": ">=10.0.0", - "rollup": ">=0.31.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-sourcemaps/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/rollup-plugin-sourcemaps/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/rollup-plugin-sourcemaps/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -2099,15 +1965,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2119,17 +1985,6 @@ "resolved": "packages/npm/shared", "link": true }, - "node_modules/source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2167,9 +2022,8 @@ }, "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" }, @@ -2182,9 +2036,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" }, @@ -2194,9 +2047,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2204,6 +2056,10 @@ "node": ">=8.0" } }, + "node_modules/todo": { + "resolved": "packages/npm/todo", + "link": true + }, "node_modules/todo-api": { "resolved": "generated/npm/todo-api", "link": true @@ -2214,9 +2070,9 @@ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/type-fest": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", - "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "engines": { "node": ">=16" }, @@ -2226,9 +2082,7 @@ }, "node_modules/typescript": { "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2239,8 +2093,7 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "license": "MIT" }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", @@ -2314,9 +2167,9 @@ } }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -2362,7 +2215,6 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@tsconfig/node18": "^18.2.4", "rollup": "^4.21.0", - "rollup-plugin-sourcemaps": "^0.6.3", "typescript": "^5.5.4" }, "engines": { @@ -2381,6 +2233,15 @@ "engines": { "node": ">=18" } + }, + "packages/npm/todo": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "rollup": "^4.20.0", + "todo-api": "^0.1.0", + "typescript": "^5.5.4" + } } } } diff --git a/package.json b/package.json index 3d17c29..56981bd 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "@skiffa/generator": "^0.13.7", "cspell": "^8.14.2", "prettier": "^3.3.3" + }, + "dependencies": { + "todo-api": "^0.1.0" } } diff --git a/packages/npm/reverse/package.json b/packages/npm/reverse/package.json index 1318c7c..20ab001 100644 --- a/packages/npm/reverse/package.json +++ b/packages/npm/reverse/package.json @@ -3,7 +3,7 @@ "type": "module", "scripts": { "prepack": "node ./scripts/build.js", - "pretest": "tsc --build", + "pretest": "node ./scripts/build.js", "prestart": "node ./scripts/build.js", "start": "node transpiled/server.js", "build": "node ./scripts/build.js", @@ -18,7 +18,6 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@tsconfig/node18": "^18.2.4", "rollup": "^4.21.0", - "rollup-plugin-sourcemaps": "^0.6.3", "typescript": "^5.5.4" }, "engines": { diff --git a/packages/npm/reverse/rollup.config.js b/packages/npm/reverse/rollup.config.js index 7ae0a4a..f793480 100644 --- a/packages/npm/reverse/rollup.config.js +++ b/packages/npm/reverse/rollup.config.js @@ -1,7 +1,6 @@ import { nodeResolve } from "@rollup/plugin-node-resolve"; import path from "path"; import { defineConfig } from "rollup"; -import sourcemaps from "rollup-plugin-sourcemaps"; import { fileURLToPath } from "url"; const dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -12,6 +11,10 @@ export default defineConfig([ input: path.resolve(projectRoot, "transpiled", "client.js"), output: { file: path.resolve("bundled", "client.js"), format: "iife", sourcemap: true }, context: "window", - plugins: [sourcemaps(), nodeResolve()], + plugins: [ + nodeResolve({ + browser: true, + }), + ], }, ]); diff --git a/packages/npm/reverse/scripts/build.js b/packages/npm/reverse/scripts/build.js index 2f11cd2..c544ef2 100644 --- a/packages/npm/reverse/scripts/build.js +++ b/packages/npm/reverse/scripts/build.js @@ -9,6 +9,8 @@ const projectRoot = path.resolve(dirname, ".."); const options = { shell: true, stdio: "inherit", env: process.env, cwd: projectRoot }; +cp.execFileSync("npm", ["--workspace", "reverse-api", "run", "build"], options); + cp.execFileSync("tsc", ["--build"], options); cp.execFileSync("rollup", ["--config", path.resolve(projectRoot, "rollup.config.js")], options); diff --git a/packages/npm/todo/.vscode/launch.json b/packages/npm/todo/.vscode/launch.json new file mode 100644 index 0000000..2706bb9 --- /dev/null +++ b/packages/npm/todo/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "run file", + "program": "${file}", + "args": [], + "cwd": "${workspaceFolder}", + "sourceMaps": true, + "outFiles": ["${workspaceFolder}/transpiled/**/*.js"], + "preLaunchTask": "build", + "outputCapture": "std" + } + ] +} diff --git a/packages/npm/todo/.vscode/tasks.json b/packages/npm/todo/.vscode/tasks.json new file mode 100644 index 0000000..ea1e496 --- /dev/null +++ b/packages/npm/todo/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "label": "build", + "script": "build", + "problemMatcher": ["$tsc"], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/packages/npm/todo/package.json b/packages/npm/todo/package.json new file mode 100644 index 0000000..0b1f1c4 --- /dev/null +++ b/packages/npm/todo/package.json @@ -0,0 +1,22 @@ +{ + "name": "todo", + "version": "1.0.0", + "type": "module", + "scripts": { + "prepack": "node ./scripts/build.js", + "pretest": "node ./scripts/build.js", + "prestart": "node ./scripts/build.js", + "start": "node transpiled/server.js", + "build": "node ./scripts/build.js", + "test": "node --test ./transpiled/operation-handlers/todo.test.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "rollup": "^4.20.0", + "todo-api": "^0.1.0", + "typescript": "^5.5.4" + } +} diff --git a/packages/npm/todo/public/index.html b/packages/npm/todo/public/index.html new file mode 100644 index 0000000..13ed7de --- /dev/null +++ b/packages/npm/todo/public/index.html @@ -0,0 +1,56 @@ + + + + + + + Reverse + + + + +
+ + +
+
+ + diff --git a/packages/npm/todo/rollup.config.js b/packages/npm/todo/rollup.config.js new file mode 100644 index 0000000..f793480 --- /dev/null +++ b/packages/npm/todo/rollup.config.js @@ -0,0 +1,20 @@ +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import path from "path"; +import { defineConfig } from "rollup"; +import { fileURLToPath } from "url"; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const projectRoot = path.resolve(dirname); + +export default defineConfig([ + { + input: path.resolve(projectRoot, "transpiled", "client.js"), + output: { file: path.resolve("bundled", "client.js"), format: "iife", sourcemap: true }, + context: "window", + plugins: [ + nodeResolve({ + browser: true, + }), + ], + }, +]); diff --git a/packages/npm/todo/scripts/build.js b/packages/npm/todo/scripts/build.js new file mode 100644 index 0000000..4f3f219 --- /dev/null +++ b/packages/npm/todo/scripts/build.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +import cp from "child_process"; +import path from "path"; +import { fileURLToPath } from "url"; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const projectRoot = path.resolve(dirname, ".."); + +const options = { shell: true, stdio: "inherit", env: process.env, cwd: projectRoot }; + +cp.execFileSync("npm", ["--workspace", "todo-api", "run", "build"], options); + +cp.execFileSync("tsc", ["--build"], options); + +cp.execFileSync("rollup", ["--config", path.resolve(projectRoot, "rollup.config.js")], options); diff --git a/packages/npm/todo/src/client.ts b/packages/npm/todo/src/client.ts new file mode 100644 index 0000000..bb732b8 --- /dev/null +++ b/packages/npm/todo/src/client.ts @@ -0,0 +1,49 @@ +import * as api from "todo-api"; + +main(); + +// entrypoint for the client +function main() { + // Add event listener for sub events + window.addEventListener("submit", async (event) => { + // prevent the submit from navigating + event.preventDefault(); + + // set a busy class to indicate that we are doing something + window.document.body.className = "busy"; + try { + const form = event.target as HTMLFormElement; + // assume our form has one element that is an input + const input = form.elements.item(0) as HTMLInputElement; + const inputValue = input.value.trim(); + + if (inputValue.length === 0) { + return; + } + + // call the api + const resultValue = await api.client.addTodoItem( + { description: input.value }, + { + baseUrl: new URL("/", window.document.location.href), + }, + ); + + // find the result div, assume it's there + const resultDiv = document.getElementById("result")!; + + // create and fill a div for out result + const itemDiv = document.createElement("div"); + itemDiv.innerText = resultValue.description; + + // add it to the result dic + resultDiv.prepend(itemDiv); + + // reset the form + form.reset(); + } finally { + // unset busy class, we are done + window.document.body.className = ""; + } + }); +} diff --git a/packages/npm/todo/src/context.ts b/packages/npm/todo/src/context.ts new file mode 100644 index 0000000..47f9c16 --- /dev/null +++ b/packages/npm/todo/src/context.ts @@ -0,0 +1,13 @@ +import { TodoService } from "./services.js"; + +export interface Context { + todo: TodoService; +} + +export const createContext = (): Context => { + const todo = new TodoService(); + + return { + todo, + }; +}; diff --git a/packages/npm/todo/src/operation-handlers.ts b/packages/npm/todo/src/operation-handlers.ts new file mode 100644 index 0000000..5e9174a --- /dev/null +++ b/packages/npm/todo/src/operation-handlers.ts @@ -0,0 +1 @@ +export * from "./operation-handlers/todo.js"; diff --git a/packages/npm/todo/src/operation-handlers/todo.test.ts b/packages/npm/todo/src/operation-handlers/todo.test.ts new file mode 100644 index 0000000..4a59019 --- /dev/null +++ b/packages/npm/todo/src/operation-handlers/todo.test.ts @@ -0,0 +1,90 @@ +import * as assert from "node:assert"; +import test from "node:test"; +import * as api from "todo-api"; +import { createContext } from "../context.js"; +import { + addTodoItem, + deleteTodoItem, + ListTodoItems, + modifyTodoItem, + todoItemSetDone, +} from "./todo.js"; + +test("todo test scenario", async () => { + const context = createContext(); + + // Start the server once + const server = new api.server.Server(); + + // Register the operations + server.registerAddTodoItemOperation(addTodoItem(context)); + server.registerListTodoItemsOperation(ListTodoItems(context)); + server.registerModifyTodoItemOperation(modifyTodoItem(context)); + server.registerDeleteTodoItemOperation(deleteTodoItem(context)); + server.registerTodoItemSetDoneOperation(todoItemSetDone(context)); + + await using listener = await api.lib.listen(server); + const baseUrl = new URL(`http://localhost:${listener.port}`); + + let createTodo: { id: number; description: string; done: boolean }; + + await test("list (expect empty list)", async () => { + const listTodo: { id: number; description: string; done: boolean }[] = + await api.client.listTodoItems({ baseUrl }); + + assert.deepEqual(listTodo, []); + }); + + await test("create a todo item", async () => { + createTodo = await api.client.addTodoItem({ description: "Go to work" }, { baseUrl }); + }); + + await test("list (expect 1 item in list)", async () => { + const listTodo: { id: number; description: string; done: boolean }[] = + await api.client.listTodoItems({ baseUrl }); + + assert.equal(listTodo.length, 1); + assert.equal(listTodo[0].description, "Go to work"); + }); + + await test("update the todo item", async () => { + const updatedTodo = "Go to the gym"; + + await api.client.modifyTodoItem( + { id: createTodo.id }, + { description: updatedTodo }, + { baseUrl }, + ); + }); + + await test("list (expect 1 updated item in list)", async () => { + const listTodo: { id: number; description: string; done: boolean }[] = + await api.client.listTodoItems({ baseUrl }); + + assert.equal(listTodo.length, 1); + assert.equal(listTodo[0].description, "Go to the gym"); + }); + + await test("set-done the todo item", async () => { + await api.client.todoItemSetDone({ id: createTodo.id }, { baseUrl }); + }); + + await test("list (expect 1 done item in list)", async () => { + const listTodo: { id: number; description: string; done: boolean }[] = + await api.client.listTodoItems({ baseUrl }); + + assert.equal(listTodo.length, 1); + assert.equal(listTodo[0].done, true); + }); + + await test("delete the todo item", async () => { + await api.client.deleteTodoItem({ id: createTodo.id }, { baseUrl }); + }); + + await test("list (expect empty list)", async () => { + const listTodo: { id: number; description: string; done: boolean }[] = + await api.client.listTodoItems({ baseUrl }); + + assert.deepEqual(listTodo, []); + }); +}); diff --git a/packages/npm/todo/src/operation-handlers/todo.ts b/packages/npm/todo/src/operation-handlers/todo.ts new file mode 100644 index 0000000..c19ebbe --- /dev/null +++ b/packages/npm/todo/src/operation-handlers/todo.ts @@ -0,0 +1,50 @@ +import * as api from "todo-api"; +import { Context } from "../context.js"; + + + +export const ListTodoItems = (context: Context): api.server.ListTodoItemsOperationHandler<{}> => async () => { + + return await context.todo.listTodoItems(); +}; + +export const addTodoItem = (context: Context): api.server.AddTodoItemOperationHandler<{}> => async (todo) => { + const createdTodo = await context.todo.createTodo(todo.description); + + const todoItem = { + description: createdTodo.todoName, + id: createdTodo.todoId, + done: createdTodo.todoIsDone, + }; + + return todoItem; +}; + +export const modifyTodoItem = (context: Context): api.server.ModifyTodoItemOperationHandler<{}> => async (todo) => { + + const updatedTodo = await context.todo.updateTodo(todo.id); + + const todoItem = { + description: updatedTodo.todoName, + id: updatedTodo.todoId, + done: updatedTodo.todoIsDone, + }; + return todoItem; +}; + +export const deleteTodoItem = (context: Context): api.server.DeleteTodoItemOperationHandler<{}> => async (todo) => { + + context.todo.deleteTodoItem(todo.id); +}; + +export const todoItemSetDone = (context: Context): api.server.TodoItemSetDoneOperationHandler<{}> => async (todo) => { + + const isDone = context.todo.markTodoAsDone(todo.id); + + const todoItem = { + description: isDone.todoName, + id: isDone.todoId, + done: isDone.todoIsDone, + }; + return todoItem; +}; diff --git a/packages/npm/todo/src/root.ts b/packages/npm/todo/src/root.ts new file mode 100644 index 0000000..b6e87fe --- /dev/null +++ b/packages/npm/todo/src/root.ts @@ -0,0 +1,12 @@ +import * as path from "path"; +import { fileURLToPath } from "url"; + +/** + * the absolute path to this projects root directory + */ +export const projectRoot = makeProjectRoot(); + +function makeProjectRoot() { + const dirname = path.dirname(fileURLToPath(import.meta.url)); + return path.resolve(dirname, ".."); +} diff --git a/packages/npm/todo/src/server.ts b/packages/npm/todo/src/server.ts new file mode 100644 index 0000000..0e0cd0b --- /dev/null +++ b/packages/npm/todo/src/server.ts @@ -0,0 +1,70 @@ +import * as path from "path"; +import * as shared from "shared"; +import * as api from "todo-api"; +import { createContext } from "./context.js"; +import { + addTodoItem, + deleteTodoItem, + ListTodoItems, + modifyTodoItem, + todoItemSetDone, +} from "./operation-handlers/todo.js"; +import { projectRoot } from "./root.js"; + +main(); + +// entrypoint for the server +async function main() { + const context = createContext(); + + // create the server + const server = new api.server.Server(); + + // register all operations + server.registerAddTodoItemOperation(addTodoItem(context)); + server.registerDeleteTodoItemOperation(deleteTodoItem(context)); + server.registerListTodoItemsOperation(ListTodoItems(context)); + server.registerModifyTodoItemOperation(modifyTodoItem(context)); + server.registerTodoItemSetDoneOperation(todoItemSetDone(context)); + + // serve some static files + server.registerMiddleware( + api.lib.createServeMiddleware({ + "/": { + contentType: "text/html", + path: path.join(projectRoot, "public", "index.html"), + }, + "/client.js": { + contentType: "application/javascript", + path: path.join(projectRoot, "bundled", "client.js"), + }, + "/client.js.map": { + contentType: "application/json", + path: path.join(projectRoot, "bundled", "client.js.map"), + }, + "/favicon.ico": false, + }), + ); + + // get port to listen to from the environment or use the default + const port = Number(process.env.PORT ?? 8080); + + console.info(`Starting server...`); + { + // listen to the specified port and send requests to the server. We are + // using the `using` syntax here, the server will be disposed (terminated) + // at the end of the current block. + await using listener = await api.lib.listen(server, { port }); + + console.info(`Server started (${listener.port})`); + + // wait for a user to send a signal and eventually stop listening. + await shared.waitForSignal("SIGINT", "SIGTERM"); + + console.info("Stopping server..."); + + // Thanks to the `using` keyword (and a proper implementation of the dispose) + // the server is terminated here, at the end of this block. + } + console.info(`Server stopped`); +} diff --git a/packages/npm/todo/src/services.ts b/packages/npm/todo/src/services.ts new file mode 100644 index 0000000..7d173e5 --- /dev/null +++ b/packages/npm/todo/src/services.ts @@ -0,0 +1 @@ +export * from "./services/todo.js"; diff --git a/packages/npm/todo/src/services/todo.ts b/packages/npm/todo/src/services/todo.ts new file mode 100644 index 0000000..de96b2b --- /dev/null +++ b/packages/npm/todo/src/services/todo.ts @@ -0,0 +1,70 @@ +//command handler for all commands +import * as todoApi from "todo-api"; + +export class TodoService { + private todos: Map = new Map(); + + async listTodoItems(): Promise { + return Array.from(this.todos.values()).map((todo) => ({ + id: todo.todoId, + description: todo.todoName, + done: todo.todoIsDone, + })); + } + + async createTodo(todoName: string) { + //generate a unique id for each todo + const generateId = (): number => { + return Math.floor(100000 + Math.random() * 900000); + }; + + const todoId: number = generateId(); + const todoIsDone: boolean = false; + + //create the todo items + const todo = { + todoName: todoName, + todoId, + todoIsDone, + }; + + this.todos.set(todoId, todo); + return todo; + } + + async updateTodo(todoId: number) { + const todoToUpdate = this.todos.get(todoId)!; + + if (this.todos.has(todoId)) { + if (todoToUpdate) { + todoToUpdate.todoName = "Go to the gym"; + + this.todos.set(todoId, todoToUpdate); + } + } + return todoToUpdate; + } + + deleteTodoItem(todoId: number): void { + const todoToDelete = this.todos.get(todoId); + + if (this.todos.has(todoId)) { + if (todoToDelete) { + this.todos.delete(todoId); + } + } + } + + markTodoAsDone(todoId: number) { + const todoToMarkDone = this.todos.get(todoId)!; + + if (this.todos.has(todoId)) { + if (todoToMarkDone) { + todoToMarkDone.todoIsDone = true; + this.todos.set(todoId, todoToMarkDone); + } + } + + return todoToMarkDone; + } +} diff --git a/packages/npm/todo/tsconfig.json b/packages/npm/todo/tsconfig.json new file mode 100644 index 0000000..5c2ee28 --- /dev/null +++ b/packages/npm/todo/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@tsconfig/node18", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./transpiled", + "declarationDir": "./typed", + "sourceMap": true, + "declaration": true, + "composite": true, + "lib": ["ES2023", "DOM"] + }, + "include": ["src/**/*"], + "references": [{ "path": "../shared/" }] +} diff --git a/scripts/generate.js b/scripts/generate.js index 52947c6..cd25579 100755 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -9,7 +9,7 @@ const workspaceRoot = path.resolve(dirname, ".."); const options = { shell: true, stdio: "inherit", env: process.env }; -const names = ["reverse-api"]; +const names = ["reverse-api", "todo-api"]; for (const name of names) { cp.execFileSync( @@ -26,7 +26,4 @@ for (const name of names) { ], options, ); - - cp.execFileSync("npm", ["--workspace", name, "ci"], options); - cp.execFileSync("npm", ["--workspace", name, "run", "build"], options); } diff --git a/specifications/todo-api.yaml b/specifications/todo-api.yaml new file mode 100644 index 0000000..5d4c4d1 --- /dev/null +++ b/specifications/todo-api.yaml @@ -0,0 +1,138 @@ +openapi: 3.0.2 + +info: + title: TODO API + description: |- + This API is a backend for the TODO example + version: 0.1.0 + +paths: + /todo-items: + get: + operationId: list-todo-items + description: Lists all TODO items + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/todo-item" + + post: + operationId: add-todo-item + description: Add a todo-item + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/todo-item-create" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/todo-item" + + /todo-items/{id}: + put: + operationId: modify-todo-item + description: Modify existing todo-item or mark as done + parameters: + - name: id + in: path + required: true + description: ID of the todo item + schema: + type: integer + format: int64 + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/todo-item-update" + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/todo-item" + + delete: + operationId: delete-todo-item + description: Delete an existing todo item + parameters: + - name: id + in: path + required: true + description: ID of the todo item + schema: + type: integer + format: int64 + responses: + "204": + description: No Content + + /todo-items/{id}/done: + post: + operationId: todo-item-set-done + description: > + Mark todo item as done + parameters: + - name: id + in: path + required: true + description: ID of the todo item + schema: + type: integer + format: int64 + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/todo-item" + +components: + schemas: + todo-item: + type: object + required: + - id + - description + - done + properties: + id: + type: integer + format: int64 + minimum: 1 + description: + type: string + minLength: 1 + done: + type: boolean + + todo-item-create: + type: object + required: + - description + properties: + description: + type: string + minLength: 1 + + todo-item-update: + type: object + required: + - description + properties: + description: + type: string + minLength: 1