From ff4e7c16769d62952765612ead92bbdad4da8e50 Mon Sep 17 00:00:00 2001 From: EthanShoeDev <13422990+EthanShoeDev@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:11:55 -0500 Subject: [PATCH] dsc gen ts types --- .gitignore | 2 + .vscode/extensions.json | 3 + .vscode/settings.json | 7 +- biome.jsonc | 88 +++ bun.lock | 325 +++++++++ package.json | 14 +- scripts/gen-dsc-types.ts | 131 ++++ scripts/json-schema-to-effect.ts | 672 ++++++++++++++++++ src/bin.ts | 42 +- src/cli.ts | 0 .../configuration-get-result.gen.ts | 81 +++ .../configuration-set-result.gen.ts | 83 +++ .../configuration-test-result.gen.ts | 84 +++ src/dsc-schema-types/configuration.gen.ts | 99 +++ src/dsc-schema-types/dsc-resource.gen.ts | 42 ++ src/dsc-schema-types/get-result.gen.ts | 58 ++ src/dsc-schema-types/include.gen.ts | 12 + src/dsc-schema-types/resolve-result.gen.ts | 10 + src/dsc-schema-types/resource-manifest.gen.ts | 153 ++++ src/dsc-schema-types/set-result.gen.ts | 60 ++ src/dsc-schema-types/test-result.gen.ts | 61 ++ tsconfig.json | 18 +- turbo.jsonc | 12 + 23 files changed, 2026 insertions(+), 31 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 biome.jsonc create mode 100644 scripts/gen-dsc-types.ts create mode 100644 scripts/json-schema-to-effect.ts delete mode 100644 src/cli.ts create mode 100644 src/dsc-schema-types/configuration-get-result.gen.ts create mode 100644 src/dsc-schema-types/configuration-set-result.gen.ts create mode 100644 src/dsc-schema-types/configuration-test-result.gen.ts create mode 100644 src/dsc-schema-types/configuration.gen.ts create mode 100644 src/dsc-schema-types/dsc-resource.gen.ts create mode 100644 src/dsc-schema-types/get-result.gen.ts create mode 100644 src/dsc-schema-types/include.gen.ts create mode 100644 src/dsc-schema-types/resolve-result.gen.ts create mode 100644 src/dsc-schema-types/resource-manifest.gen.ts create mode 100644 src/dsc-schema-types/set-result.gen.ts create mode 100644 src/dsc-schema-types/test-result.gen.ts create mode 100644 turbo.jsonc diff --git a/.gitignore b/.gitignore index a14702c..e4333bb 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json # Finder (MacOS) folder config .DS_Store + +.turbo diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..699ed73 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 08044fe..cd309d6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { - "typescript.tsdk": "./node_modules/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true - } \ No newline at end of file + "typescript.tsdk": "./node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, + "editor.formatOnSave": true +} diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..5163ed5 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,88 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "includes": ["**", "!**/generated", "!!**/dist", "!!**/docs"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": true, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 80, + "attributePosition": "auto", + "bracketSpacing": true, + "bracketSameLine": false + }, + "linter": { + "enabled": true, + "rules": { + "style": { + "noHeadElement": "off", + "useBlockStatements": "off", + "useConsistentArrayType": { + "level": "error", + "options": { + "syntax": "generic" + } + }, + "noMagicNumbers": "off", + "noNestedTernary": "off" + }, + "suspicious": { + "noUnknownAtRules": "off", + "noConsole": "off", + "noShadowRestrictedNames": "off" + }, + "nursery": { + "noShadow": "off", + "useMaxParams": "off" + }, + "performance": { + "noNamespaceImport": "off", + "noImgElement": "off", + "useTopLevelRegex": "off" + }, + "complexity": { + "noExcessiveCognitiveComplexity": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "single", + "trailingCommas": "all" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "extends": ["ultracite/core"], + "overrides": [ + { + "includes": [ + "**/{tsconfig,jsconfig}.json", + "**/{tsconfig,jsconfig}.*.json", + "**/*.jsonc" + ], + "json": { + "parser": { + "allowComments": true, + "allowTrailingCommas": true + } + } + } + ] +} diff --git a/bun.lock b/bun.lock index a830475..ef22116 100644 --- a/bun.lock +++ b/bun.lock @@ -11,13 +11,42 @@ "effect": "^3.19.8", }, "devDependencies": { + "@biomejs/biome": "2.3.8", "@effect/language-service": "^0.57.1", "@types/bun": "latest", + "@typescript/native-preview": "^7.0.0-dev.20251130.1", + "quicktype": "^23.2.6", + "turbo": "^2.6.1", "typescript": "^5.9.3", + "ultracite": "6.3.8", }, }, }, "packages": { + "@biomejs/biome": ["@biomejs/biome@2.3.8", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.8", "@biomejs/cli-darwin-x64": "2.3.8", "@biomejs/cli-linux-arm64": "2.3.8", "@biomejs/cli-linux-arm64-musl": "2.3.8", "@biomejs/cli-linux-x64": "2.3.8", "@biomejs/cli-linux-x64-musl": "2.3.8", "@biomejs/cli-win32-arm64": "2.3.8", "@biomejs/cli-win32-x64": "2.3.8" }, "bin": { "biome": "bin/biome" } }, "sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.8", "", { "os": "linux", "cpu": "x64" }, "sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.8", "", { "os": "linux", "cpu": "x64" }, "sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.8", "", { "os": "win32", "cpu": "x64" }, "sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w=="], + + "@clack/core": ["@clack/core@0.5.0", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], + + "@clack/prompts": ["@clack/prompts@0.11.0", "", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + "@effect/cli": ["@effect/cli@0.72.1", "", { "dependencies": { "ini": "^4.1.3", "toml": "^3.0.0", "yaml": "^2.5.0" }, "peerDependencies": { "@effect/platform": "^0.93.0", "@effect/printer": "^0.47.0", "@effect/printer-ansi": "^0.47.0", "effect": "^3.19.3" } }, "sha512-HGDMGD23TxFW9tCSX6g+M2u0robikMA0mP0SqeJMj7FWXTdcQ+cQsJE99bxi9iu+5YID7MIrVJMs8TUwXUV2sg=="], "@effect/cluster": ["@effect/cluster@0.54.0", "", { "dependencies": { "kubernetes-types": "^1.30.0" }, "peerDependencies": { "@effect/platform": "^0.93.5", "@effect/rpc": "^0.72.2", "@effect/sql": "^0.48.5", "@effect/workflow": "^0.14.0", "effect": "^3.19.8" } }, "sha512-Hpxn+z1NaDIN+USM3ml7lp3AQtQHN/VRUfiTzyRJp6nVdUVZRylz8PggEq+O9E1TIeG+TXHtv7/Jq7ME2Ahbdg=="], @@ -44,6 +73,20 @@ "@effect/workflow": ["@effect/workflow@0.14.0", "", { "peerDependencies": { "@effect/experimental": "^0.57.7", "@effect/platform": "^0.93.5", "@effect/rpc": "^0.72.2", "effect": "^3.19.8" } }, "sha512-NPJqScwqe0szAl9IOYNIYnTR7cN00UiMWgOlLD6500ejnjgsaXYnZIWSQZHK54zkOMfsAVVyfuZ0wgVq/K2zMw=="], + "@glideapps/ts-necessities": ["@glideapps/ts-necessities@2.4.0", "", {}, "sha512-mDC+qosuNa4lxR3ioMBb6CD0XLRsQBplU+zRPUYiMLXKeVPZ6UYphdNG/EGReig0YyfnVlBKZEXl1wzTotYmPA=="], + + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@mark.probst/typescript-json-schema": ["@mark.probst/typescript-json-schema@0.55.0", "", { "dependencies": { "@types/json-schema": "^7.0.9", "@types/node": "^16.9.2", "glob": "^7.1.7", "path-equal": "^1.1.2", "safe-stable-stringify": "^2.2.0", "ts-node": "^10.9.1", "typescript": "4.9.4", "yargs": "^17.1.1" }, "bin": { "typescript-json-schema": "bin/typescript-json-schema" } }, "sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ=="], + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], @@ -86,36 +129,174 @@ "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + "@trpc/server": ["@trpc/server@11.7.2", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-AgB26PXY69sckherIhCacKLY49rxE2XP5h38vr/KMZTbLCL1p8IuIoKPjALTcugC2kbyQ7Lbqo2JDVfRSmPmfQ=="], + + "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="], + + "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], + + "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], + + "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + "@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], + "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20251130.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251130.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251130.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20251130.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251130.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20251130.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251130.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20251130.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-0DcbBJM5xMvbUWl5ZNprFno6ZlGmkI1RHN4hW1jJza7D5Um0kSs4CU0fx2Z4uNxhY7a37Y6px5LkM3WF6gePQg=="], + + "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20251130.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-j0h3dgtd/te0r6CKiJWxkb/hrtudWjEbTpuxF3Iki1E87oPtig0mNJyzTgzZFLLWaXM16Iuwb/6Y79j/dWwWmw=="], + + "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20251130.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZjKkYNjzw8XJtai/R7eUIlRA1MK3xleNEHn+lrI5WJjZqzmOeKHc0xhbzW3E9aIDTd1/9cyt9AcPLvrx5FFvMw=="], + + "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20251130.1", "", { "os": "linux", "cpu": "arm" }, "sha512-ovlaIVqiJqtuXaP4R/o+ljcFA3pIIMHJ1LN2bqEQYhJJR3nTbx/xvmGtXG2EC3xzrZCgEMY974izascjaziqEg=="], + + "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20251130.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-FLsbHH4ZqjdZ9t6zawbvt0zx/4YO+XB3+eGBkorTY6uhK66UKkXn4ar9k7ovLjRf1C6Ozjb6qvptf0k9mEJl0Q=="], + + "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20251130.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Z7qOyRxiyQUPaLPb6VA4FtXLkIj/AOSIgaP1zguaIYXJAkfMkQbhMaViLwFziMIxlH3ysr6jbZsBmsdYhVa9cQ=="], + + "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20251130.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-a3xBzkixBqg3a2KnYZLPvGlPEbxNXFdfFimiYXx4CJVeiXqJX5U9zhZ2uAxh3oMMW6pDzQmn87AfM4F3FyxDAA=="], + + "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20251130.1", "", { "os": "win32", "cpu": "x64" }, "sha512-1rJCAv76ScP7inMJPWTN28BuDe55po3BcjQR0/j07hViJPVMn4bI+VlgLV0oZpYOuaM9Uk0ex0e14mr0fwcgQA=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], + + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "browser-or-node": ["browser-or-node@3.0.0", "", {}, "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chalk-template": ["chalk-template@0.4.0", "", { "dependencies": { "chalk": "^4.1.2" } }, "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "collection-utils": ["collection-utils@1.0.1", "", {}, "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], + + "command-line-usage": ["command-line-usage@7.0.3", "", { "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", "table-layout": "^4.1.0", "typical": "^7.1.1" } }, "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q=="], + + "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], + + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + "effect": ["effect@3.19.8", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-OmLw8EfH02vdmyU2fO4uY9He/wepwKI5E/JNpE2pseaWWUbaYOK9UlxIiKP20ZEqQr+S/jSqRDGmpiqD/2DeCQ=="], + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="], + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "glob": ["glob@13.0.0", "", { "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA=="], + + "graphql": ["graphql@0.11.7", "", { "dependencies": { "iterall": "1.1.3" } }, "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-url": ["is-url@1.2.4", "", {}, "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="], + + "iterall": ["iterall@1.1.3", "", {}, "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ=="], + + "js-base64": ["js-base64@3.7.8", "", {}, "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="], + + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + "kubernetes-types": ["kubernetes-types@1.30.0", "", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], + "msgpackr": ["msgpackr@1.11.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA=="], "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], @@ -124,26 +305,170 @@ "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], + "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "path-equal": ["path-equal@1.2.5", "", {}, "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "quicktype": ["quicktype@23.2.6", "", { "dependencies": { "@glideapps/ts-necessities": "^2.2.3", "chalk": "^4.1.2", "collection-utils": "^1.0.1", "command-line-args": "^5.2.1", "command-line-usage": "^7.0.1", "cross-fetch": "^4.0.0", "graphql": "^0.11.7", "lodash": "^4.17.21", "moment": "^2.30.1", "quicktype-core": "23.2.6", "quicktype-graphql-input": "23.2.6", "quicktype-typescript-input": "23.2.6", "readable-stream": "^4.5.2", "stream-json": "1.8.0", "string-to-stream": "^3.0.1", "typescript": "~5.8.3" }, "bin": { "quicktype": "dist/index.js" } }, "sha512-rlD1jF71bOmDn6SQ/ToLuuRkMQ7maxo5oVTn5dPCl11ymqoJCFCvl7FzRfh+fkDFmWt2etl+JiIEdWImLxferA=="], + + "quicktype-core": ["quicktype-core@23.2.6", "", { "dependencies": { "@glideapps/ts-necessities": "2.2.3", "browser-or-node": "^3.0.0", "collection-utils": "^1.0.1", "cross-fetch": "^4.0.0", "is-url": "^1.2.4", "js-base64": "^3.7.7", "lodash": "^4.17.21", "pako": "^1.0.6", "pluralize": "^8.0.0", "readable-stream": "4.5.2", "unicode-properties": "^1.4.1", "urijs": "^1.19.1", "wordwrap": "^1.0.0", "yaml": "^2.4.1" } }, "sha512-asfeSv7BKBNVb9WiYhFRBvBZHcRutPRBwJMxW0pefluK4kkKu4lv0IvZBwFKvw2XygLcL1Rl90zxWDHYgkwCmA=="], + + "quicktype-graphql-input": ["quicktype-graphql-input@23.2.6", "", { "dependencies": { "collection-utils": "^1.0.1", "graphql": "^0.11.7", "quicktype-core": "23.2.6" } }, "sha512-jHQ8XrEaccZnWA7h/xqUQhfl+0mR5o91T6k3I4QhlnZSLdVnbycrMq4FHa9EaIFcai783JKwSUl1+koAdJq4pg=="], + + "quicktype-typescript-input": ["quicktype-typescript-input@23.2.6", "", { "dependencies": { "@mark.probst/typescript-json-schema": "0.55.0", "quicktype-core": "23.2.6", "typescript": "4.9.5" } }, "sha512-dCNMxR+7PGs9/9Tsth9H6LOQV1G+Tv4sUGT8ZUfDRJ5Hq371qOYLma5BnLX6VxkPu8JT7mAMpQ9VFlxstX6Qaw=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="], + + "stream-json": ["stream-json@1.8.0", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw=="], + + "string-to-stream": ["string-to-stream@3.0.1", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "table-layout": ["table-layout@4.1.1", "", { "dependencies": { "array-back": "^6.2.2", "wordwrapjs": "^5.1.0" } }, "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA=="], + + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "trpc-cli": ["trpc-cli@0.12.1", "", { "dependencies": { "commander": "^14.0.0" }, "peerDependencies": { "@orpc/server": "^1.0.0", "@trpc/server": "^10.45.2 || ^11.0.1", "@valibot/to-json-schema": "^1.1.0", "effect": "^3.14.2 || ^4.0.0", "valibot": "^1.1.0", "zod": "^3.24.0 || ^4.0.0" }, "optionalPeers": ["@orpc/server", "@trpc/server", "@valibot/to-json-schema", "effect", "valibot", "zod"], "bin": { "trpc-cli": "dist/bin.js" } }, "sha512-/D/mIQf3tUrS7ZKJZ1gmSPJn2psAABJfkC5Eevm55SZ4s6KwANOUNlwhAGXN9HT4VSJVfoF2jettevE9vHPQlg=="], + + "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + + "turbo": ["turbo@2.6.1", "", { "optionalDependencies": { "turbo-darwin-64": "2.6.1", "turbo-darwin-arm64": "2.6.1", "turbo-linux-64": "2.6.1", "turbo-linux-arm64": "2.6.1", "turbo-windows-64": "2.6.1", "turbo-windows-arm64": "2.6.1" }, "bin": { "turbo": "bin/turbo" } }, "sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.6.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.6.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw=="], + + "turbo-linux-64": ["turbo-linux-64@2.6.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.6.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA=="], + + "turbo-windows-64": ["turbo-windows-64@2.6.1", "", { "os": "win32", "cpu": "x64" }, "sha512-buq7/VAN7KOjMYi4tSZT5m+jpqyhbRU2EUTTvp6V0Ii8dAkY2tAAjQN1q5q2ByflYWKecbQNTqxmVploE0LVwQ=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.6.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], + + "ultracite": ["ultracite@6.3.8", "", { "dependencies": { "@clack/prompts": "^0.11.0", "@trpc/server": "^11.7.2", "deepmerge": "^4.3.1", "glob": "^13.0.0", "jsonc-parser": "^3.3.1", "nypm": "^0.6.2", "trpc-cli": "^0.12.1", "zod": "^4.1.13" }, "bin": { "ultracite": "dist/index.js" } }, "sha512-A7q1ubPt6DfNifjhPnK2uZjko2FM/Ic56Mn6toX8go6ZDDFUvg84HJoHkqco1F8Z0iiWmVj5W2tBpbIqmt0M8Q=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "unicode-properties": ["unicode-properties@1.4.1", "", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="], + + "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], + + "urijs": ["urijs@1.19.11", "", {}, "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wordwrapjs": ["wordwrapjs@5.1.1", "", {}, "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + + "zod": ["zod@4.1.13", "", {}, "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig=="], + + "@mark.probst/typescript-json-schema/@types/node": ["@types/node@16.18.126", "", {}, "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw=="], + + "@mark.probst/typescript-json-schema/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@mark.probst/typescript-json-schema/typescript": ["typescript@4.9.4", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="], + + "command-line-usage/array-back": ["array-back@6.2.2", "", {}, "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw=="], + + "command-line-usage/typical": ["typical@7.3.0", "", {}, "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw=="], + "node-gyp-build-optional-packages/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "quicktype/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "quicktype-core/@glideapps/ts-necessities": ["@glideapps/ts-necessities@2.2.3", "", {}, "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w=="], + + "quicktype-core/readable-stream": ["readable-stream@4.5.2", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g=="], + + "quicktype-typescript-input/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="], + + "string-to-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "table-layout/array-back": ["array-back@6.2.2", "", {}, "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw=="], + + "unicode-trie/pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], + + "@mark.probst/typescript-json-schema/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], } } diff --git a/package.json b/package.json index 3131036..ed9f790 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,16 @@ { "name": "winos-config", + "version": "0.0.1", "module": "index.ts", "type": "module", "private": true, + "packageManager": "bun@1.3.3", "scripts": { - "prepare": "effect-language-service patch" + "prepare": "effect-language-service patch", + "typecheck": "tsc --noEmit", + "lint:biome": "biome check . --write", + "lint:biome:unsafe": "biome check . --unsafe --write", + "lint:biome:check": "biome check ." }, "dependencies": { "@effect/cli": "^0.72.1", @@ -13,8 +19,12 @@ "effect": "^3.19.8" }, "devDependencies": { + "@biomejs/biome": "2.3.8", "@effect/language-service": "^0.57.1", "@types/bun": "latest", - "typescript": "^5.9.3" + "quicktype": "^23.2.6", + "turbo": "^2.6.1", + "typescript": "^5.9.3", + "ultracite": "6.3.8" } } diff --git a/scripts/gen-dsc-types.ts b/scripts/gen-dsc-types.ts new file mode 100644 index 0000000..73ae410 --- /dev/null +++ b/scripts/gen-dsc-types.ts @@ -0,0 +1,131 @@ +import { Command, FileSystem, Path } from '@effect/platform'; +import { BunContext, BunRuntime } from '@effect/platform-bun'; +import { Effect, Logger, LogLevel, pipe, Stream, String } from 'effect'; +import { convertFromString } from './json-schema-to-effect'; + +// Helper function to collect stream output as a string +const runString = ( + stream: Stream.Stream, +): Effect.Effect => + stream.pipe(Stream.decodeText(), Stream.runFold(String.empty, String.concat)); + +const runCommand = (command: Command.Command) => + pipe( + Command.start(command), + Effect.flatMap((process) => + Effect.all( + [ + process.exitCode, + runString(process.stdout), + runString(process.stderr), + ], + { concurrency: 3 }, + ), + ), + Effect.map(([exitCode, stdout, stderr]) => ({ exitCode, stdout, stderr })), + ); + +const getDscJsonSchema = (schemaType: string) => + Effect.gen(function* () { + const commandParts = ['dsc', 'schema', '--type', schemaType] as const; + yield* Effect.logDebug(`Running command: ${commandParts.join(' ')}`); + const schemaString = yield* Command.make(...commandParts).pipe( + Command.string, + ); + return schemaString.trim(); + }); + +const getPossibleDscSchemaTypes = () => + Effect.gen(function* () { + yield* Effect.logDebug('Getting possible DSC schema types...'); + + const brokenCommand = Command.make( + 'dsc', + 'schema', + '--type', + 'something-that-hopefully-never-exists', + ); + + const { stderr: brokenCommandOutput } = yield* runCommand(brokenCommand); + + const possibleTypes = brokenCommandOutput + .split('\n') + .filter((line) => line.includes('possible values:')) + .map((line) => { + const values = line.match(/\[possible values: (.+)\]/)?.[1]; + return values?.split(', ') ?? []; + })[0]; + + if (!possibleTypes) return yield* Effect.die('No possible types found'); + + yield* Effect.logDebug(`Found ${possibleTypes.length} schema types`); + return possibleTypes; + }); + +const jsonSchemaToEffectSchema = (params: { + jsonSchema: string; + name: string; +}) => + Effect.gen(function* () { + yield* Effect.logDebug(`Converting schema: ${params.name}`); + + const result = convertFromString(params.jsonSchema, params.name); + + yield* Effect.logDebug( + `Converted "${params.name}" - types: ${result.typeNames.join(', ')}`, + ); + + if (result.recursiveTypes.length > 0) { + yield* Effect.logInfo( + `Recursive types in ${params.name}: ${result.recursiveTypes.join(', ')}`, + ); + } + + return result.code; + }); + +const genDscTypes = Effect.gen(function* () { + yield* Effect.log('Starting DSC types generation...'); + + const possibleTypes = yield* getPossibleDscSchemaTypes(); + yield* Effect.log(`Found schema types: ${possibleTypes.join(', ')}`); + + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + + const outputDir = path.join(process.cwd(), 'src', 'dsc-schema-types'); + + yield* Effect.logDebug(`Output directory: ${outputDir}`); + + if (yield* fs.exists(outputDir)) { + yield* Effect.log('Removing existing output directory...'); + yield* fs.remove(outputDir, { recursive: true, force: true }); + } + + yield* fs.makeDirectory(outputDir, { recursive: true }); + + for (const schemaType of possibleTypes) { + yield* Effect.logDebug(`Processing: ${schemaType}`); + + const jsonSchema = yield* getDscJsonSchema(schemaType); + const effectSchema = yield* jsonSchemaToEffectSchema({ + jsonSchema, + name: schemaType, + }); + + const outputPath = path.join(outputDir, `${schemaType}.gen.ts`); + yield* fs.writeFileString(outputPath, effectSchema); + + yield* Effect.log(`Generated: ${schemaType}.gen.ts`); + } + + yield* Effect.log('DSC types generation complete!'); +}); + +BunRuntime.runMain( + genDscTypes.pipe( + Effect.provide(BunContext.layer), + Logger.withMinimumLogLevel(LogLevel.Debug), + Effect.scoped, + ), +); diff --git a/scripts/json-schema-to-effect.ts b/scripts/json-schema-to-effect.ts new file mode 100644 index 0000000..11e44d2 --- /dev/null +++ b/scripts/json-schema-to-effect.ts @@ -0,0 +1,672 @@ +/** + * JSON Schema to Effect Schema Converter + * + * Converts JSON Schema to Effect Schema TypeScript code with proper + * handling of recursive types using S.suspend() and interface definitions. + */ + +// ============================================================================ +// Types +// ============================================================================ + +type JsonSchema = { + $ref?: string; + $defs?: Record; + definitions?: Record; + type?: string | Array; + properties?: Record; + required?: Array; + items?: JsonSchema; + enum?: Array; + const?: unknown; + oneOf?: Array; + anyOf?: Array; + allOf?: Array; + additionalProperties?: boolean | JsonSchema; + title?: string; + description?: string; + default?: unknown; + nullable?: boolean; +}; + +type TypeDefinition = { + name: string; + schema: JsonSchema; + isRecursive: boolean; + dependencies: Set; +}; + +type ConversionContext = { + definitions: Map; + recursiveTypes: Set; + currentPath: Array; +}; + +// ============================================================================ +// Utilities +// ============================================================================ + +/** + * Convert a string to PascalCase for type names + */ +function toPascalCase(str: string): string { + return str + .split(/[-_\s]+/) + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(''); +} + +/** + * Extract the definition name from a $ref + */ +function getRefName(ref: string): string { + const parts = ref.split('/'); + return parts.at(-1) ?? ''; +} + +/** + * Check if a schema is nullable (has null in type array, nullable: true, or null in oneOf/anyOf) + */ +function isNullable(schema: JsonSchema): boolean { + if (schema.nullable) return true; + if (Array.isArray(schema.type) && schema.type.includes('null')) return true; + // Check for null in oneOf/anyOf + const items = schema.oneOf || schema.anyOf; + if (items) { + return items.some( + (s) => s.type === 'null' || ('const' in s && s.const === null), + ); + } + return false; +} + +/** + * Get the non-null type from a schema + */ +function getNonNullType(schema: JsonSchema): string | undefined { + if (Array.isArray(schema.type)) { + const nonNull = schema.type.filter((t) => t !== 'null'); + return nonNull.length === 1 ? nonNull[0] : undefined; + } + return schema.type; +} + +// ============================================================================ +// Schema Analysis +// ============================================================================ + +/** + * Collect all definitions from the schema + */ +function collectDefinitions(schema: JsonSchema): Map { + const definitions = new Map(); + const defs = schema.$defs || schema.definitions || {}; + + for (const [name, defSchema] of Object.entries(defs)) { + definitions.set(name, { + name: toPascalCase(name), + schema: defSchema, + isRecursive: false, + dependencies: new Set(), + }); + } + + return definitions; +} + +/** + * Find all $ref dependencies in a schema + */ +function findDependencies(schema: JsonSchema): Set { + const deps = new Set(); + + function traverse(s: JsonSchema): void { + if (s.$ref) { + deps.add(getRefName(s.$ref)); + } + + if (s.properties) { + for (const propSchema of Object.values(s.properties)) { + traverse(propSchema); + } + } + + if (s.items) { + traverse(s.items); + } + + if (s.oneOf) { + for (const item of s.oneOf) { + traverse(item); + } + } + + if (s.anyOf) { + for (const item of s.anyOf) { + traverse(item); + } + } + + if (s.allOf) { + for (const item of s.allOf) { + traverse(item); + } + } + + if (typeof s.additionalProperties === 'object' && s.additionalProperties) { + traverse(s.additionalProperties); + } + } + + traverse(schema); + return deps; +} + +/** + * Detect recursive types using DFS cycle detection + */ +function detectRecursiveTypes( + definitions: Map, +): Set { + const recursiveTypes = new Set(); + + // Build dependency graph + for (const [, def] of definitions) { + def.dependencies = findDependencies(def.schema); + } + + // DFS to detect cycles + function hasCycle( + name: string, + visiting: Set, + visited: Set, + ): boolean { + if (visiting.has(name)) { + return true; + } + if (visited.has(name)) { + return false; + } + + visiting.add(name); + + const def = definitions.get(name); + if (def) { + for (const dep of def.dependencies) { + if (hasCycle(dep, visiting, visited)) { + recursiveTypes.add(name); + recursiveTypes.add(dep); + } + } + } + + visiting.delete(name); + visited.add(name); + return false; + } + + // Check each definition for cycles + for (const name of definitions.keys()) { + hasCycle(name, new Set(), new Set()); + } + + // Also check for direct self-references + for (const [name, def] of definitions) { + if (def.dependencies.has(name)) { + recursiveTypes.add(name); + def.isRecursive = true; + } + } + + // Mark all recursive types + for (const name of recursiveTypes) { + const def = definitions.get(name); + if (def) { + def.isRecursive = true; + } + } + + return recursiveTypes; +} + +/** + * Topologically sort definitions (dependencies first) + */ +function sortDefinitions( + definitions: Map, + recursiveTypes: Set, +): Array { + const sorted: Array = []; + const visited = new Set(); + + function visit(name: string): void { + if (visited.has(name)) return; + visited.add(name); + + const def = definitions.get(name); + if (!def) return; + + // Visit non-recursive dependencies first + for (const dep of def.dependencies) { + if (!(recursiveTypes.has(dep) && recursiveTypes.has(name))) { + visit(dep); + } + } + + sorted.push(def); + } + + for (const name of definitions.keys()) { + visit(name); + } + + return sorted; +} + +// ============================================================================ +// Code Generation +// ============================================================================ + +/** + * Generate TypeScript type for a JSON Schema (used for recursive type declarations) + */ +function generateTsType(schema: JsonSchema, _ctx: ConversionContext): string { + if (schema.$ref) { + const refName = getRefName(schema.$ref); + const pascalName = toPascalCase(refName); + return pascalName; + } + + const type = getNonNullType(schema); + + if (schema.enum) { + return schema.enum.map((v) => JSON.stringify(v)).join(' | '); + } + + if (schema.const !== undefined) { + return JSON.stringify(schema.const); + } + + if (schema.oneOf || schema.anyOf) { + const items = schema.oneOf || schema.anyOf || []; + const types = items + .filter((s) => s.type !== 'null' && !('const' in s && s.const === null)) + .map((s) => generateTsType(s, _ctx)); + return types.join(' | '); + } + + switch (type) { + case 'string': + return 'string'; + case 'number': + case 'integer': + return 'number'; + case 'boolean': + return 'boolean'; + case 'null': + return 'null'; + case 'array': + if (schema.items) { + return `ReadonlyArray<${generateTsType(schema.items, _ctx)}>`; + } + return 'ReadonlyArray'; + case 'object': + if (schema.properties) { + const props = Object.entries(schema.properties) + .map(([key, propSchema]) => { + const isRequired = schema.required?.includes(key) ?? false; + const nullable = isNullable(propSchema); + const tsType = generateTsType(propSchema, _ctx); + const nullSuffix = nullable ? ' | null' : ''; + const optionalMark = isRequired ? '' : '?'; + return ` readonly "${key}"${optionalMark}: ${tsType}${nullSuffix}`; + }) + .join(';\n'); + return `{\n${props}\n}`; + } + if ( + schema.additionalProperties === true || + typeof schema.additionalProperties === 'object' + ) { + const valueType = + typeof schema.additionalProperties === 'object' + ? generateTsType(schema.additionalProperties, _ctx) + : 'unknown'; + return `Record`; + } + return 'Record'; + default: + return 'unknown'; + } +} + +/** + * Generate TypeScript interface/type declaration for a recursive type + */ +function generateTypeDeclaration( + name: string, + schema: JsonSchema, + ctx: ConversionContext, +): string { + const tsType = generateTsType(schema, ctx); + if (tsType.startsWith('{')) { + return `interface ${name} ${tsType}`; + } + return `type ${name} = ${tsType}`; +} + +/** + * Generate Effect Schema code for a JSON Schema + */ +function generateEffectSchema( + schema: JsonSchema, + ctx: ConversionContext, +): string { + // Handle $ref + if (schema.$ref) { + const refName = getRefName(schema.$ref); + const pascalName = toPascalCase(refName); + + // Check if this is a recursive reference - use S.suspend with explicit return type + if (ctx.recursiveTypes.has(refName)) { + return `S.suspend((): S.Schema<${pascalName}> => ${pascalName})`; + } + return pascalName; + } + + // Handle nullable types + const nullable = isNullable(schema); + const type = getNonNullType(schema); + + // Handle enum + if (schema.enum) { + const literals = schema.enum.map((v) => JSON.stringify(v)).join(', '); + const result = `S.Literal(${literals})`; + return nullable ? `S.NullOr(${result})` : result; + } + + // Handle const + if (schema.const !== undefined) { + const result = `S.Literal(${JSON.stringify(schema.const)})`; + return nullable ? `S.NullOr(${result})` : result; + } + + // Handle oneOf / anyOf (union) + if (schema.oneOf || schema.anyOf) { + const items = schema.oneOf || schema.anyOf || []; + const nonNullItems = items.filter( + (s) => s.type !== 'null' && !('const' in s && s.const === null), + ); + + if (nonNullItems.length === 0) { + return 'S.Null'; + } + + if (nonNullItems.length === 1) { + const firstItem = nonNullItems[0]; + if (!firstItem) return 'S.Unknown'; + const innerSchema = generateEffectSchema(firstItem, ctx); + const hasNull = items.some( + (s) => s.type === 'null' || ('const' in s && s.const === null), + ); + return hasNull ? `S.NullOr(${innerSchema})` : innerSchema; + } + + const members = nonNullItems + .map((s) => generateEffectSchema(s, ctx)) + .join(', '); + const hasNull = items.some( + (s) => s.type === 'null' || ('const' in s && s.const === null), + ); + return hasNull ? `S.Union(${members}, S.Null)` : `S.Union(${members})`; + } + + // Handle allOf (intersection - we merge properties) + if (schema.allOf) { + // For simplicity, merge all schemas' properties + const merged: JsonSchema = { type: 'object', properties: {}, required: [] }; + for (const item of schema.allOf) { + if (item.properties) { + merged.properties = { ...merged.properties, ...item.properties }; + } + if (item.required) { + merged.required = [...(merged.required || []), ...item.required]; + } + } + return generateEffectSchema(merged, ctx); + } + + // Handle by type + switch (type) { + case 'string': { + const result = 'S.String'; + return nullable ? `S.NullOr(${result})` : result; + } + case 'number': + case 'integer': { + const result = 'S.Number'; + return nullable ? `S.NullOr(${result})` : result; + } + case 'boolean': { + const result = 'S.Boolean'; + return nullable ? `S.NullOr(${result})` : result; + } + case 'null': + return 'S.Null'; + case 'array': { + const itemSchema = schema.items + ? generateEffectSchema(schema.items, ctx) + : 'S.Unknown'; + const result = `S.Array(${itemSchema})`; + return nullable ? `S.NullOr(${result})` : result; + } + case 'object': { + if (schema.properties) { + const props = Object.entries(schema.properties) + .map(([key, propSchema]) => { + const isRequired = schema.required?.includes(key) ?? false; + const propNullable = isNullable(propSchema); + let propCode = generateEffectSchema(propSchema, ctx); + + // Wrap in optional if not required + if (!isRequired) { + if (propNullable && !propCode.startsWith('S.NullOr(')) { + propCode = `S.NullOr(${propCode})`; + } + propCode = `S.optional(${propCode})`; + } + + return ` "${key}": ${propCode}`; + }) + .join(',\n'); + const result = `S.Struct({\n${props}\n})`; + return nullable ? `S.NullOr(${result})` : result; + } + if ( + schema.additionalProperties === true || + typeof schema.additionalProperties === 'object' + ) { + const valueSchema = + typeof schema.additionalProperties === 'object' + ? generateEffectSchema(schema.additionalProperties, ctx) + : 'S.Unknown'; + const result = `S.Record({ key: S.String, value: ${valueSchema} })`; + return nullable ? `S.NullOr(${result})` : result; + } + // Empty object or any object + const result = 'S.Record({ key: S.String, value: S.Unknown })'; + return nullable ? `S.NullOr(${result})` : result; + } + default: + // Unknown or any type + return nullable ? 'S.NullOr(S.Unknown)' : 'S.Unknown'; + } +} + +/** + * Generate non-recursive schema definition (schema + derived type) + */ +function generateNonRecursiveDefinition( + def: TypeDefinition, + ctx: ConversionContext, +): string { + const lines: Array = []; + const { name, schema } = def; + + // Add description as JSDoc comment + if (schema.description) { + lines.push(`/** ${schema.description} */`); + } + + // Check if it's an enum type + if (schema.enum) { + const literals = schema.enum.map((v) => JSON.stringify(v)).join(',\n '); + lines.push(`export const ${name} = S.Literal(\n ${literals}\n);`); + lines.push(`export type ${name} = S.Schema.Type;`); + return lines.join('\n'); + } + + // Generate the schema + const schemaCode = generateEffectSchema(schema, ctx); + lines.push(`export const ${name} = ${schemaCode};`); + lines.push(`export type ${name} = S.Schema.Type;`); + + return lines.join('\n'); +} + +/** + * Generate recursive schema definition (schema with type assertion to bypass structural checks) + */ +function generateRecursiveSchemaDefinition( + def: TypeDefinition, + ctx: ConversionContext, +): string { + const lines: Array = []; + const { name, schema } = def; + + // Add description as JSDoc comment + if (schema.description) { + lines.push(`/** ${schema.description} */`); + } + + // Generate the schema with double type assertion to bypass structural checking + const schemaCode = generateEffectSchema(schema, ctx); + lines.push( + `export const ${name} = ${schemaCode} as unknown as S.Schema<${name}>;`, + ); + + return lines.join('\n'); +} + +// ============================================================================ +// Main Conversion Function +// ============================================================================ + +export type ConvertOptions = { + /** The JSON Schema to convert */ + schema: JsonSchema; + /** The name for the root type (if the schema has no $ref) */ + rootName?: string; +}; + +export type ConvertResult = { + /** The generated TypeScript code */ + code: string; + /** Names of all generated types */ + typeNames: Array; + /** Names of recursive types */ + recursiveTypes: Array; +}; + +/** + * Convert a JSON Schema to Effect Schema TypeScript code + */ +export function convert(options: ConvertOptions): ConvertResult { + const { schema, rootName = 'Root' } = options; + + // Collect all definitions + const definitions = collectDefinitions(schema); + + // If the root schema is not a $ref, add it as a definition + if (!schema.$ref && (schema.type === 'object' || schema.properties)) { + definitions.set(rootName, { + name: toPascalCase(rootName), + schema, + isRecursive: false, + dependencies: new Set(), + }); + } + + // Detect recursive types + const recursiveTypes = detectRecursiveTypes(definitions); + + // Create conversion context + const ctx: ConversionContext = { + definitions, + recursiveTypes, + currentPath: [], + }; + + // Sort definitions topologically + const sorted = sortDefinitions(definitions, recursiveTypes); + + // Split into non-recursive and recursive definitions + const nonRecursive = sorted.filter((d) => !recursiveTypes.has(d.name)); + const recursive = sorted.filter((d) => recursiveTypes.has(d.name)); + + // Generate code + const lines: Array = [ + '// This file is auto-generated. Do not edit manually.', + "import * as S from 'effect/Schema';", + '', + ]; + + // 1. Generate non-recursive definitions (schema + type) + for (const def of nonRecursive) { + lines.push(generateNonRecursiveDefinition(def, ctx)); + lines.push(''); + } + + // 2. Generate type declarations for recursive types (before schemas) + if (recursive.length > 0) { + lines.push('// Recursive type declarations'); + for (const def of recursive) { + lines.push(generateTypeDeclaration(def.name, def.schema, ctx)); + } + lines.push(''); + + // 3. Generate schema definitions for recursive types + lines.push('// Recursive schema definitions'); + for (const def of recursive) { + lines.push(generateRecursiveSchemaDefinition(def, ctx)); + lines.push(''); + } + } + + // Handle root $ref + if (schema.$ref) { + const refName = toPascalCase(getRefName(schema.$ref)); + const exportName = toPascalCase(rootName); + if (refName !== exportName) { + lines.push(`export { ${refName} as ${exportName} };`); + lines.push(''); + } + } + + return { + code: lines.join('\n'), + typeNames: sorted.map((d) => d.name), + recursiveTypes: Array.from(recursiveTypes).map(toPascalCase), + }; +} + +/** + * Convert a JSON Schema string to Effect Schema TypeScript code + */ +export function convertFromString( + jsonSchemaString: string, + rootName = 'Root', +): ConvertResult { + const schema = JSON.parse(jsonSchemaString) as JsonSchema; + return convert({ schema, rootName }); +} diff --git a/src/bin.ts b/src/bin.ts index b32f3d1..ee3b926 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -1,17 +1,31 @@ -import { Command } from "@effect/cli" -import { BunContext, BunRuntime } from "@effect/platform-bun" -import { Console, Effect } from "effect" +import { Command } from '@effect/cli'; +import { BunContext, BunRuntime } from '@effect/platform-bun'; +import { Effect } from 'effect'; +import pkg from '../package.json' with { type: 'json' }; -// Define the top-level command -const command = Command.make("hello-world", {}, () => - Console.log("Hello World") -) +const diffCommand = Command.make('diff', {}, () => + Effect.gen(function* () { + yield* Effect.log('diff'); + yield* Effect.log('diff2'); + }), +); -// Set up the CLI application -const cli = Command.run(command, { - name: "Hello World CLI", - version: "v1.0.0" -}) +const applyCommand = Command.make('apply', {}, () => + Effect.gen(function* () { + yield* Effect.log('apply'); + yield* Effect.log('apply2'); + }), +); -// Prepare and run the CLI application -cli(process.argv).pipe(Effect.provide(BunContext.layer), BunRuntime.runMain) \ No newline at end of file +const cliName = 'winos-config'; + +const app = Command.make(cliName, {}).pipe( + Command.withDescription('NixOS-like tool for windows'), + Command.withSubcommands([diffCommand, applyCommand]), +); + +const cli = Command.run(app, { + name: cliName, + version: pkg.version, +}); +cli(process.argv).pipe(Effect.provide(BunContext.layer), BunRuntime.runMain); diff --git a/src/cli.ts b/src/cli.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/dsc-schema-types/configuration-get-result.gen.ts b/src/dsc-schema-types/configuration-get-result.gen.ts new file mode 100644 index 0000000..d5a5a49 --- /dev/null +++ b/src/dsc-schema-types/configuration-get-result.gen.ts @@ -0,0 +1,81 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +export const ResourceGetResponse = S.Struct({ + actualState: S.Unknown, +}); +export type ResourceGetResponse = S.Schema.Type; + +export const MessageLevel = S.Literal('error', 'warning', 'information'); +export type MessageLevel = S.Schema.Type; + +export const ResourceMessage = S.Struct({ + name: S.String, + type: S.String, + message: S.String, + level: MessageLevel, +}); +export type ResourceMessage = S.Schema.Type; + +export const ConfigurationGetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + results: S.Array( + S.suspend((): S.Schema => ResourceGetResult), + ), + messages: S.Array(ResourceMessage), + hadErrors: S.Boolean, +}); +export type ConfigurationGetResult = S.Schema.Type< + typeof ConfigurationGetResult +>; + +// Recursive type declarations +type ResourceGetResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: GetResult; +}; +type GetResult = ResourceGetResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceGetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => GetResult), +}) as unknown as S.Schema; + +export const GetResult = S.Union( + ResourceGetResponse, + S.Array(S.suspend((): S.Schema => ResourceGetResult)), +) as unknown as S.Schema; diff --git a/src/dsc-schema-types/configuration-set-result.gen.ts b/src/dsc-schema-types/configuration-set-result.gen.ts new file mode 100644 index 0000000..f399a0b --- /dev/null +++ b/src/dsc-schema-types/configuration-set-result.gen.ts @@ -0,0 +1,83 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +export const ResourceSetResponse = S.Struct({ + beforeState: S.Unknown, + afterState: S.Unknown, + changedProperties: S.optional(S.NullOr(S.Array(S.String))), +}); +export type ResourceSetResponse = S.Schema.Type; + +export const MessageLevel = S.Literal('error', 'warning', 'information'); +export type MessageLevel = S.Schema.Type; + +export const ResourceMessage = S.Struct({ + name: S.String, + type: S.String, + message: S.String, + level: MessageLevel, +}); +export type ResourceMessage = S.Schema.Type; + +export const ConfigurationSetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + results: S.Array( + S.suspend((): S.Schema => ResourceSetResult), + ), + messages: S.Array(ResourceMessage), + hadErrors: S.Boolean, +}); +export type ConfigurationSetResult = S.Schema.Type< + typeof ConfigurationSetResult +>; + +// Recursive type declarations +type ResourceSetResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: SetResult; +}; +type SetResult = ResourceSetResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceSetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => SetResult), +}) as unknown as S.Schema; + +export const SetResult = S.Union( + ResourceSetResponse, + S.Array(S.suspend((): S.Schema => ResourceSetResult)), +) as unknown as S.Schema; diff --git a/src/dsc-schema-types/configuration-test-result.gen.ts b/src/dsc-schema-types/configuration-test-result.gen.ts new file mode 100644 index 0000000..5dcc0c3 --- /dev/null +++ b/src/dsc-schema-types/configuration-test-result.gen.ts @@ -0,0 +1,84 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +export const ResourceTestResponse = S.Struct({ + desiredState: S.Unknown, + actualState: S.Unknown, + inDesiredState: S.Boolean, + differingProperties: S.Array(S.String), +}); +export type ResourceTestResponse = S.Schema.Type; + +export const MessageLevel = S.Literal('error', 'warning', 'information'); +export type MessageLevel = S.Schema.Type; + +export const ResourceMessage = S.Struct({ + name: S.String, + type: S.String, + message: S.String, + level: MessageLevel, +}); +export type ResourceMessage = S.Schema.Type; + +export const ConfigurationTestResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + results: S.Array( + S.suspend((): S.Schema => ResourceTestResult), + ), + messages: S.Array(ResourceMessage), + hadErrors: S.Boolean, +}); +export type ConfigurationTestResult = S.Schema.Type< + typeof ConfigurationTestResult +>; + +// Recursive type declarations +type ResourceTestResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: TestResult; +}; +type TestResult = ResourceTestResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceTestResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => TestResult), +}) as unknown as S.Schema; + +export const TestResult = S.Union( + ResourceTestResponse, + S.Array(S.suspend((): S.Schema => ResourceTestResult)), +) as unknown as S.Schema; diff --git a/src/dsc-schema-types/configuration.gen.ts b/src/dsc-schema-types/configuration.gen.ts new file mode 100644 index 0000000..d2d263f --- /dev/null +++ b/src/dsc-schema-types/configuration.gen.ts @@ -0,0 +1,99 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const DataType = S.Literal( + 'string', + 'secureString', + 'int', + 'bool', + 'object', + 'secureObject', + 'array', +); +export type DataType = S.Schema.Type; + +export const Parameter = S.Struct({ + type: DataType, + defaultValue: S.optional(S.Unknown), + allowedValues: S.optional(S.NullOr(S.Array(S.Unknown))), + minValue: S.optional(S.NullOr(S.Number)), + maxValue: S.optional(S.NullOr(S.Number)), + minLength: S.optional(S.NullOr(S.Number)), + maxLength: S.optional(S.NullOr(S.Number)), + description: S.optional(S.NullOr(S.String)), + metadata: S.optional(S.NullOr(S.Record({ key: S.String, value: S.Unknown }))), +}); +export type Parameter = S.Schema.Type; + +export const Resource = S.Struct({ + type: S.String, + name: S.String, + dependsOn: S.optional(S.NullOr(S.Array(S.String))), + properties: S.optional( + S.NullOr(S.Record({ key: S.String, value: S.Unknown })), + ), + metadata: S.optional(S.NullOr(S.Record({ key: S.String, value: S.Unknown }))), +}); +export type Resource = S.Schema.Type; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +export const Configuration = S.Struct({ + $schema: S.Literal( + 'https://aka.ms/dsc/schemas/v3/bundled/config/document.json', + 'https://aka.ms/dsc/schemas/v3.0/bundled/config/document.json', + 'https://aka.ms/dsc/schemas/v3.0.0/bundled/config/document.json', + 'https://aka.ms/dsc/schemas/v3/bundled/config/document.vscode.json', + 'https://aka.ms/dsc/schemas/v3.0/bundled/config/document.vscode.json', + 'https://aka.ms/dsc/schemas/v3.0.0/bundled/config/document.vscode.json', + 'https://aka.ms/dsc/schemas/v3/config/document.json', + 'https://aka.ms/dsc/schemas/v3.0/config/document.json', + 'https://aka.ms/dsc/schemas/v3.0.0/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/bundled/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/bundled/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/bundled/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/bundled/config/document.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/bundled/config/document.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/bundled/config/document.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/config/document.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/config/document.json', + ), + contentVersion: S.optional(S.NullOr(S.String)), + parameters: S.optional( + S.NullOr(S.Record({ key: S.String, value: Parameter })), + ), + variables: S.optional( + S.NullOr(S.Record({ key: S.String, value: S.Unknown })), + ), + resources: S.Array(Resource), + metadata: S.optional(S.NullOr(Metadata)), +}); +export type Configuration = S.Schema.Type; diff --git a/src/dsc-schema-types/dsc-resource.gen.ts b/src/dsc-schema-types/dsc-resource.gen.ts new file mode 100644 index 0000000..b70a335 --- /dev/null +++ b/src/dsc-schema-types/dsc-resource.gen.ts @@ -0,0 +1,42 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Kind = S.Literal( + 'adapter', + 'exporter', + 'group', + 'importer', + 'resource', +); +export type Kind = S.Schema.Type; + +export const Capability = S.Union( + S.Literal('get'), + S.Literal('set'), + S.Literal('setHandlesExist'), + S.Literal('whatIf'), + S.Literal('test'), + S.Literal('delete'), + S.Literal('export'), + S.Literal('resolve'), +); +export type Capability = S.Schema.Type; + +export const ImplementedAs = S.NullOr(S.String); +export type ImplementedAs = S.Schema.Type; + +export const DscResource = S.Struct({ + type: S.String, + kind: S.Struct({}), + version: S.String, + capabilities: S.Array(Capability), + path: S.String, + description: S.optional(S.NullOr(S.String)), + directory: S.String, + implementedAs: S.Struct({}), + author: S.optional(S.NullOr(S.String)), + properties: S.Array(S.String), + requireAdapter: S.optional(S.NullOr(S.String)), + manifest: S.optional(S.Unknown), +}); +export type DscResource = S.Schema.Type; diff --git a/src/dsc-schema-types/get-result.gen.ts b/src/dsc-schema-types/get-result.gen.ts new file mode 100644 index 0000000..fdf3caa --- /dev/null +++ b/src/dsc-schema-types/get-result.gen.ts @@ -0,0 +1,58 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const ResourceGetResponse = S.Struct({ + actualState: S.Unknown, +}); +export type ResourceGetResponse = S.Schema.Type; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +// Recursive type declarations +type ResourceGetResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: GetResult; +}; +type GetResult = ResourceGetResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceGetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => GetResult), +}) as unknown as S.Schema; + +export const GetResult = S.Union( + ResourceGetResponse, + S.Array(S.suspend((): S.Schema => ResourceGetResult)), +) as unknown as S.Schema; diff --git a/src/dsc-schema-types/include.gen.ts b/src/dsc-schema-types/include.gen.ts new file mode 100644 index 0000000..c4480b4 --- /dev/null +++ b/src/dsc-schema-types/include.gen.ts @@ -0,0 +1,12 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Include = S.Union( + S.Struct({ + configurationFile: S.String, + }), + S.Struct({ + configurationContent: S.String, + }), +); +export type Include = S.Schema.Type; diff --git a/src/dsc-schema-types/resolve-result.gen.ts b/src/dsc-schema-types/resolve-result.gen.ts new file mode 100644 index 0000000..1913702 --- /dev/null +++ b/src/dsc-schema-types/resolve-result.gen.ts @@ -0,0 +1,10 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const ResolveResult = S.Struct({ + configuration: S.Unknown, + parameters: S.optional( + S.NullOr(S.Record({ key: S.String, value: S.Unknown })), + ), +}); +export type ResolveResult = S.Schema.Type; diff --git a/src/dsc-schema-types/resource-manifest.gen.ts b/src/dsc-schema-types/resource-manifest.gen.ts new file mode 100644 index 0000000..a1d7f0a --- /dev/null +++ b/src/dsc-schema-types/resource-manifest.gen.ts @@ -0,0 +1,153 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const Kind = S.Literal( + 'adapter', + 'exporter', + 'group', + 'importer', + 'resource', +); +export type Kind = S.Schema.Type; + +export const ArgKind = S.Union( + S.String, + S.Struct({ + jsonInputArg: S.String, + mandatory: S.optional(S.NullOr(S.Boolean)), + }), +); +export type ArgKind = S.Schema.Type; + +export const InputKind = S.Union(S.Literal('env'), S.Literal('stdin')); +export type InputKind = S.Schema.Type; + +export const GetMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), +}); +export type GetMethod = S.Schema.Type; + +export const ReturnKind = S.Union( + S.Literal('state'), + S.Literal('stateAndDiff'), +); +export type ReturnKind = S.Schema.Type; + +export const SetMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), + implementsPretest: S.optional(S.NullOr(S.Boolean)), + handlesExist: S.optional(S.NullOr(S.Boolean)), + return: S.optional(S.NullOr(ReturnKind)), +}); +export type SetMethod = S.Schema.Type; + +export const TestMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), + return: S.optional(S.NullOr(ReturnKind)), +}); +export type TestMethod = S.Schema.Type; + +export const DeleteMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), +}); +export type DeleteMethod = S.Schema.Type; + +export const ExportMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), +}); +export type ExportMethod = S.Schema.Type; + +export const ResolveMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), +}); +export type ResolveMethod = S.Schema.Type; + +export const ValidateMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(ArgKind))), + input: S.optional(S.NullOr(InputKind)), +}); +export type ValidateMethod = S.Schema.Type; + +export const ListMethod = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(S.String))), +}); +export type ListMethod = S.Schema.Type; + +export const ConfigKind = S.Union(S.Literal('full'), S.Literal('sequence')); +export type ConfigKind = S.Schema.Type; + +export const Adapter = S.Struct({ + list: S.Struct({}), + config: S.Struct({}), +}); +export type Adapter = S.Schema.Type; + +export const SchemaCommand = S.Struct({ + executable: S.String, + args: S.optional(S.NullOr(S.Array(S.String))), +}); +export type SchemaCommand = S.Schema.Type; + +export const SchemaKind = S.Union( + S.Struct({ + command: SchemaCommand, + }), + S.Struct({ + embedded: S.Unknown, + }), +); +export type SchemaKind = S.Schema.Type; + +export const ResourceManifest = S.Struct({ + $schema: S.Literal( + 'https://aka.ms/dsc/schemas/v3/bundled/resource/manifest.json', + 'https://aka.ms/dsc/schemas/v3.0/bundled/resource/manifest.json', + 'https://aka.ms/dsc/schemas/v3.0.0/bundled/resource/manifest.json', + 'https://aka.ms/dsc/schemas/v3/bundled/resource/manifest.vscode.json', + 'https://aka.ms/dsc/schemas/v3.0/bundled/resource/manifest.vscode.json', + 'https://aka.ms/dsc/schemas/v3.0.0/bundled/resource/manifest.vscode.json', + 'https://aka.ms/dsc/schemas/v3/resource/manifest.json', + 'https://aka.ms/dsc/schemas/v3.0/resource/manifest.json', + 'https://aka.ms/dsc/schemas/v3.0.0/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/bundled/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/bundled/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/bundled/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/bundled/resource/manifest.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/bundled/resource/manifest.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/bundled/resource/manifest.vscode.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0/resource/manifest.json', + 'https://raw.githubusercontent.com/PowerShell/DSC/main/schemas/v3.0.0/resource/manifest.json', + ), + type: S.String, + kind: S.optional(S.NullOr(Kind)), + version: S.String, + description: S.optional(S.NullOr(S.String)), + tags: S.optional(S.NullOr(S.Array(S.String))), + get: S.optional(S.NullOr(GetMethod)), + set: S.optional(S.NullOr(SetMethod)), + whatIf: S.optional(S.NullOr(SetMethod)), + test: S.optional(S.NullOr(TestMethod)), + delete: S.optional(S.NullOr(DeleteMethod)), + export: S.optional(S.NullOr(ExportMethod)), + resolve: S.optional(S.NullOr(ResolveMethod)), + validate: S.optional(S.NullOr(ValidateMethod)), + adapter: S.optional(S.NullOr(Adapter)), + exitCodes: S.optional(S.NullOr(S.Record({ key: S.String, value: S.String }))), + schema: S.optional(S.NullOr(SchemaKind)), +}); +export type ResourceManifest = S.Schema.Type; diff --git a/src/dsc-schema-types/set-result.gen.ts b/src/dsc-schema-types/set-result.gen.ts new file mode 100644 index 0000000..c9c7741 --- /dev/null +++ b/src/dsc-schema-types/set-result.gen.ts @@ -0,0 +1,60 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const ResourceSetResponse = S.Struct({ + beforeState: S.Unknown, + afterState: S.Unknown, + changedProperties: S.optional(S.NullOr(S.Array(S.String))), +}); +export type ResourceSetResponse = S.Schema.Type; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +// Recursive type declarations +type ResourceSetResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: SetResult; +}; +type SetResult = ResourceSetResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceSetResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => SetResult), +}) as unknown as S.Schema; + +export const SetResult = S.Union( + ResourceSetResponse, + S.Array(S.suspend((): S.Schema => ResourceSetResult)), +) as unknown as S.Schema; diff --git a/src/dsc-schema-types/test-result.gen.ts b/src/dsc-schema-types/test-result.gen.ts new file mode 100644 index 0000000..9260d67 --- /dev/null +++ b/src/dsc-schema-types/test-result.gen.ts @@ -0,0 +1,61 @@ +// This file is auto-generated. Do not edit manually. +import * as S from 'effect/Schema'; + +export const ResourceTestResponse = S.Struct({ + desiredState: S.Unknown, + actualState: S.Unknown, + inDesiredState: S.Boolean, + differingProperties: S.Array(S.String), +}); +export type ResourceTestResponse = S.Schema.Type; + +export const Operation = S.Literal('get', 'set', 'test', 'export'); +export type Operation = S.Schema.Type; + +export const ExecutionKind = S.Literal('actual', 'whatIf'); +export type ExecutionKind = S.Schema.Type; + +export const SecurityContextKind = S.Literal( + 'current', + 'elevated', + 'restricted', +); +export type SecurityContextKind = S.Schema.Type; + +export const MicrosoftDscMetadata = S.Struct({ + version: S.optional(S.NullOr(S.String)), + operation: S.optional(S.NullOr(Operation)), + executionType: S.optional(S.NullOr(ExecutionKind)), + startDatetime: S.optional(S.NullOr(S.String)), + endDatetime: S.optional(S.NullOr(S.String)), + duration: S.optional(S.NullOr(S.String)), + securityContext: S.optional(S.NullOr(SecurityContextKind)), +}); +export type MicrosoftDscMetadata = S.Schema.Type; + +export const Metadata = S.Struct({ + 'Microsoft.DSC': S.optional(S.NullOr(MicrosoftDscMetadata)), +}); +export type Metadata = S.Schema.Type; + +// Recursive type declarations +type ResourceTestResult = { + readonly metadata?: Metadata | null; + readonly name: string; + readonly type: string; + readonly result: TestResult; +}; +type TestResult = ResourceTestResponse | ReadonlyArray; + +// Recursive schema definitions +export const ResourceTestResult = S.Struct({ + metadata: S.optional(S.NullOr(Metadata)), + name: S.String, + type: S.String, + result: S.suspend((): S.Schema => TestResult), +}) as unknown as S.Schema; + +export const TestResult = S.Union( + ResourceTestResponse, + S.Array(S.suspend((): S.Schema => ResourceTestResult)), +) as unknown as S.Schema; diff --git a/tsconfig.json b/tsconfig.json index c6cb0ec..22113f6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,30 +1,22 @@ { "compilerOptions": { - // Environment setup & latest features - "lib": [ - "ESNext" - ], + "lib": ["ESNext"], "target": "ESNext", "module": "Preserve", "moduleDetection": "force", "jsx": "react-jsx", "allowJs": true, - // Bundler mode "moduleResolution": "bundler", "allowImportingTsExtensions": true, "verbatimModuleSyntax": true, "noEmit": true, - // Best practices "strict": true, "skipLibCheck": true, "noFallthroughCasesInSwitch": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true, - // Some stricter flags "noUnusedParameters": true, "noPropertyAccessFromIndexSignature": true, - // Effect-ts - // https://www.effect.solutions/tsconfig "plugins": [ { "name": "@effect/language-service" @@ -34,6 +26,8 @@ "exactOptionalPropertyTypes": true, "noUnusedLocals": true, "sourceMap": true, - "resolveJsonModule": true - } -} \ No newline at end of file + "resolveJsonModule": true, + "strictNullChecks": true + }, + "exclude": ["node_modules", "dist", "docs"] +} diff --git a/turbo.jsonc b/turbo.jsonc new file mode 100644 index 0000000..d10362a --- /dev/null +++ b/turbo.jsonc @@ -0,0 +1,12 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "ui": "tui", + "tasks": { + "lint": { + "with": ["lint:biome", "typecheck"] + }, + "typecheck": {}, + "lint:biome": {}, + "lint:biome:check": {} + } +}