diff --git a/.changeset/config.json b/.changeset/config.json index 74116b20d97..4fa89d13f9b 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -115,8 +115,7 @@ "@object-ui/providers", "@object-ui/react", "@object-ui/react-runtime", - "@object-ui/types", - "object-ui" + "@object-ui/types" ] ], "linked": [], diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b6cc68be5a..fa7514e4d0d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -288,7 +288,7 @@ use as a few-shot corpus. Neither declares a `dev` script. | Path | Purpose | | --- | --- | -| `ui/packages/*` | The published `@object-ui/*` packages, plus the private `vscode-extension`, `test-support` (test-only, never released), `runner` (workspace demo app, never released) and `app-shell` (the Console's shell and views, no longer published after 18.2.0) | +| `ui/packages/*` | The published `@object-ui/*` packages, plus the private `test-support` (test-only, never released), `runner` (workspace demo app, never released) and `app-shell` (the Console's shell and views, no longer published after 18.2.0) | | `ui/apps/console` | The Console app (Vite + React), which `pnpm console:build` builds into the `@objectstack/console` package | | `ui/apps/site` | The public docs site at (fumadocs) | | `ui/examples/*` | The snippet and the schema catalog, see [UI examples](#ui-examples) | @@ -513,7 +513,6 @@ Atoms and fields stay light; heavy widgets live in lazy-loaded plugins. | [`@object-ui/create-plugin`](ui/packages/create-plugin) | Scaffold a new Object UI plugin | | [`@object-ui/runner`](ui/packages/runner) | Universal application runner for testing schemas (private workspace app, not published) | | [`@object-ui/react-runtime`](ui/packages/react-runtime) | Trusted runtime execution for `kind: 'react'` pages | -| [`vscode-extension`](ui/packages/vscode-extension) | IntelliSense and live preview for schema files | diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b44c28a798..c3f0955c638 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6092,34 +6092,6 @@ importers: specifier: ^4.1.10 version: 4.1.12(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(@vitest/coverage-v8@4.1.12)(@vitest/ui@4.1.10)(happy-dom@21.0.4)(jsdom@30.1.1(@noble/hashes@2.4.0))(msw@2.15.0(@types/node@26.6.5)(typescript@6.0.3))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15(patch_hash=4d1d35da1809be2a945519cb26890e48107810b9b66c6913a6a89abb5ad6a1e6))(yaml@2.9.1)) - ui/packages/vscode-extension: - dependencies: - '@object-ui/core': - specifier: workspace:* - version: link:../core - '@object-ui/types': - specifier: workspace:* - version: link:../types - devDependencies: - '@types/node': - specifier: ^26.6.5 - version: 26.6.5 - '@types/vscode': - specifier: ^1.140.0 - version: 1.140.0 - '@vscode/vsce': - specifier: ^3.9.2 - version: 3.9.2 - tsup: - specifier: ^8.5.1 - version: 8.5.1(patch_hash=d1c8d6bd9db5a776a639cd37b802f8b962f7846a6e3758af4478b0e0bde082e4)(@microsoft/api-extractor@7.58.2(@types/node@26.6.5))(@swc/core@1.15.33(@swc/helpers@0.5.23))(jiti@2.7.0)(postcss@8.5.31)(tsx@4.23.15(patch_hash=4d1d35da1809be2a945519cb26890e48107810b9b66c6913a6a89abb5ad6a1e6))(typescript@6.0.3)(yaml@2.9.1) - typescript: - specifier: ^6.0.3 - version: 6.0.3 - vitest: - specifier: ^4.1.10 - version: 4.1.12(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(@vitest/coverage-v8@4.1.12)(@vitest/ui@4.1.10)(happy-dom@21.0.4)(jsdom@30.1.1(@noble/hashes@2.4.0))(msw@2.15.0(@types/node@26.6.5)(typescript@6.0.3))(vite@8.3.5(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15(patch_hash=4d1d35da1809be2a945519cb26890e48107810b9b66c6913a6a89abb5ad6a1e6))(yaml@2.9.1)) - packages: '@adobe/css-tools@4.5.0': @@ -6263,12 +6235,6 @@ packages: resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} - '@azu/format-text@1.0.2': - resolution: {integrity: sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==} - - '@azu/style-format@1.0.1': - resolution: {integrity: sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==} - '@azure-rest/core-client@2.8.0': resolution: {integrity: sha512-F1ybHeN+++QhyFCF/ehLUEvrOB6fehPdFBFtGdj0C3B2lpQ9zkPiO5JDgsqc6IfjuUe6b3dAbXK0a7+VgSGfhw==} engines: {node: '>=22.0.0'} @@ -8446,51 +8412,6 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@secretlint/config-creator@10.2.2': - resolution: {integrity: sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==} - engines: {node: '>=20.0.0'} - - '@secretlint/config-loader@10.2.2': - resolution: {integrity: sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==} - engines: {node: '>=20.0.0'} - - '@secretlint/core@10.2.2': - resolution: {integrity: sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==} - engines: {node: '>=20.0.0'} - - '@secretlint/formatter@10.2.2': - resolution: {integrity: sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==} - engines: {node: '>=20.0.0'} - - '@secretlint/node@10.2.2': - resolution: {integrity: sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==} - engines: {node: '>=20.0.0'} - - '@secretlint/profiler@10.2.2': - resolution: {integrity: sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==} - - '@secretlint/resolver@10.2.2': - resolution: {integrity: sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==} - - '@secretlint/secretlint-formatter-sarif@10.2.2': - resolution: {integrity: sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==} - - '@secretlint/secretlint-rule-no-dotenv@10.2.2': - resolution: {integrity: sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==} - engines: {node: '>=20.0.0'} - - '@secretlint/secretlint-rule-preset-recommend@10.2.2': - resolution: {integrity: sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==} - engines: {node: '>=20.0.0'} - - '@secretlint/source-creator@10.2.2': - resolution: {integrity: sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==} - engines: {node: '>=20.0.0'} - - '@secretlint/types@10.2.2': - resolution: {integrity: sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==} - engines: {node: '>=20.0.0'} - '@sentry/browser-utils@10.70.0': resolution: {integrity: sha512-IvjhafF5NFXrPCg5EHbAPGDwIhHxgUcLlHTklZ3DAdA6ky88BJYMfevbcnOEmgavf4nylhCaquRUFNB5+szj+A==} engines: {node: '>=18'} @@ -8572,10 +8493,6 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -8876,21 +8793,6 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@textlint/ast-node-types@15.7.1': - resolution: {integrity: sha512-Wii5UgUKFEh9Uv6wbq1zr4/Kf+dtjiUuzPrrXzKp8H+ifkvKNzi23V4Nz+6wVyHQn5T28AFuc8VH8OtzvGYecA==} - - '@textlint/linter-formatter@15.7.1': - resolution: {integrity: sha512-TdwZ/debWYFD05K3CcoHtwvnCrza29wZxD+BjDTk/V5N7iRqkK1dTTHSD4A8AIgROLiDkHJmIKQbasbmsg8AvA==} - - '@textlint/module-interop@15.7.1': - resolution: {integrity: sha512-Jg+sQW2L/cRJypk59wtcMUVVpt8vmit5ZMT3gUnFwevP3A6Qp1HfOtUy9ObT4hBX3lOSGT/ekcCDxR1pL7uH1g==} - - '@textlint/resolver@15.7.1': - resolution: {integrity: sha512-8XnO0pgF6mXnm41VvWmBbEIdGPhiCUt31uLZkOis1ECeg/1SoUcIT6Mx/F0e1rukq8l0UlOSeY9a31CsvRMK0g==} - - '@textlint/types@15.7.1': - resolution: {integrity: sha512-Vye/GmFNBTgVzZFtIFJTmLB+s2A7oIADxNG6r9UhfPuY+Czv0z5G3xeyFZZudPlfxURsKUyPIU5XsjOFqVp33A==} - '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} @@ -9113,9 +9015,6 @@ packages: '@types/node@26.6.5': resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/pg@8.23.1': resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==} @@ -9146,9 +9045,6 @@ packages: '@types/readable-stream@4.0.24': resolution: {integrity: sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg==} - '@types/sarif@2.1.7': - resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} - '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -9182,9 +9078,6 @@ packages: '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@types/vscode@1.140.0': - resolution: {integrity: sha512-KAB5RBZIgnUhpp4mKsVJPPHLOQKu6WtGy2xpfWjaajEXO4xIIC+UESAXLiQ9ewx6QD1uBmvC/S8BJzkbvv4bRA==} - '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} @@ -9361,59 +9254,6 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - '@vscode/vsce-sign-alpine-arm64@2.0.6': - resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} - cpu: [arm64] - os: [alpine] - - '@vscode/vsce-sign-alpine-x64@2.0.6': - resolution: {integrity: sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==} - cpu: [x64] - os: [alpine] - - '@vscode/vsce-sign-darwin-arm64@2.0.6': - resolution: {integrity: sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==} - cpu: [arm64] - os: [darwin] - - '@vscode/vsce-sign-darwin-x64@2.0.6': - resolution: {integrity: sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==} - cpu: [x64] - os: [darwin] - - '@vscode/vsce-sign-linux-arm64@2.0.6': - resolution: {integrity: sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==} - cpu: [arm64] - os: [linux] - - '@vscode/vsce-sign-linux-arm@2.0.6': - resolution: {integrity: sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==} - cpu: [arm] - os: [linux] - - '@vscode/vsce-sign-linux-x64@2.0.6': - resolution: {integrity: sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==} - cpu: [x64] - os: [linux] - - '@vscode/vsce-sign-win32-arm64@2.0.6': - resolution: {integrity: sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==} - cpu: [arm64] - os: [win32] - - '@vscode/vsce-sign-win32-x64@2.0.6': - resolution: {integrity: sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==} - cpu: [x64] - os: [win32] - - '@vscode/vsce-sign@2.0.9': - resolution: {integrity: sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==} - - '@vscode/vsce@3.9.2': - resolution: {integrity: sha512-XSxMosEEDO6vLxELAHVkwmhC0qe0ijZni2jB9Rcs8kQsW4lhTDQ/wMzmwFs/buotAWSnpmUp/dRWD2ufG3UYKA==} - engines: {node: '>= 20'} - hasBin: true - '@workflow/serde@4.1.0': resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} @@ -9587,10 +9427,6 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -9679,10 +9515,6 @@ packages: ast-v8-to-istanbul@1.0.5: resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -9722,9 +9554,6 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - azure-devops-node-api@12.5.0: - resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} - b4a@1.9.0: resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} peerDependencies: @@ -9866,10 +9695,6 @@ packages: binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - binaryextensions@6.11.0: - resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} - engines: {node: '>=4'} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -9887,12 +9712,6 @@ packages: resolution: {integrity: sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==} engines: {node: '>=18'} - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boundary@2.0.0: - resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} - bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} @@ -9997,10 +9816,6 @@ packages: chainsaw@0.1.0: resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -10021,13 +9836,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.2.0: - resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} - engines: {node: '>=20.18.1'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -10036,9 +9844,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -10095,10 +9900,6 @@ packages: resolution: {integrity: sha512-rH0jBKeLkVrK7NsZ5Ba2l7WdMBmm1k0FMpABeXUU1PgTUxbz3261gEuCSsrYuXo4BwAe3yCcIbQ93YyS52lOGQ==} hasBin: true - cockatiel@3.2.1: - resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} - engines: {node: '>=16'} - code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} @@ -10130,10 +9931,6 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -10249,17 +10046,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -10480,10 +10270,6 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -10492,10 +10278,6 @@ packages: babel-plugin-macros: optional: true - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -10575,22 +10357,9 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dompurify@3.4.17: resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -10620,10 +10389,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - editions@6.22.0: - resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} - engines: {ecmascript: '>= es5', node: '>=4'} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -10658,9 +10423,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -10692,10 +10454,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -10882,10 +10640,6 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -11348,9 +11102,6 @@ packages: getopts@2.3.0: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -11380,10 +11131,6 @@ packages: resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==} engines: {node: '>=18'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -11487,14 +11234,6 @@ packages: hookified@2.2.0: resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -11515,9 +11254,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -11598,10 +11334,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - index-to-position@1.2.0: - resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} - engines: {node: '>=18'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -11609,9 +11341,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -11806,10 +11535,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - istextorbinary@9.5.0: - resolution: {integrity: sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==} - engines: {node: '>=4'} - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -11840,10 +11565,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} - hasBin: true - js-yaml@5.4.2: resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==} hasBin: true @@ -11926,9 +11647,6 @@ packages: kdbush@4.1.0: resolution: {integrity: sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==} - keytar@7.9.0: - resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} - keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} @@ -11997,10 +11715,6 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -12249,9 +11963,6 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} @@ -12278,9 +11989,6 @@ packages: lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.3: resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} @@ -12587,10 +12295,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -12609,9 +12313,6 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -12731,9 +12432,6 @@ packages: murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mute-stream@3.0.0: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -12765,9 +12463,6 @@ packages: resolution: {integrity: sha512-E0SrU7uLV/k4E6YbBIpQNDnRj00vgE5wlutM1sYVSAXDtHQosiRCGS9eKMKyiGg4ChXfDiJmTB+NCR3yXr6UAw==} engines: {node: ^20.0.0 || >=22.0.0} - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - native-duplexpair@1.0.0: resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} @@ -12813,13 +12508,6 @@ packages: sass: optional: true - node-abi@3.92.0: - resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} - engines: {node: '>=10'} - - node-addon-api@4.3.0: - resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - node-addon-api@8.9.2: resolution: {integrity: sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==} engines: {node: ^18 || ^20 || >= 21} @@ -12831,18 +12519,10 @@ packages: node-rsa@1.1.1: resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} - node-sarif-builder@3.4.0: - resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} - engines: {node: '>=20'} - nodemailer@10.2.1: resolution: {integrity: sha512-ZrDNsPFoDMwefNs7sJwrYiEJ/CG4ClJWDZv05iNJsEBWa8GRDry1QJHTJxsuTAY9eDDKjX4k+q3SxslXJOao7w==} engines: {node: '>=20.0.0'} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -12859,9 +12539,6 @@ packages: resolution: {integrity: sha512-K1HmQeZT2HrjpsR6KgqbN2FAXL2NrJJmNUSD9ck7HGTVu1JKXox8n9SB+tjbU8m8JGLF4OscrroPepew/L7/Xw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12942,10 +12619,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -12959,23 +12632,10 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-json@8.3.0: - resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} - engines: {node: '>=18'} - parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse-semver@1.1.1: - resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} - - parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - - parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -13032,10 +12692,6 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -13129,13 +12785,6 @@ packages: engines: {node: '>=20'} hasBin: true - pluralize@2.0.0: - resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -13210,12 +12859,6 @@ packages: resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} engines: {node: '>=20'} - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -13259,9 +12902,6 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -13318,13 +12958,6 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - rc-config-loader@4.1.4: - resolution: {integrity: sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-day-picker@10.0.1: resolution: {integrity: sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==} engines: {node: '>=18'} @@ -13477,14 +13110,6 @@ packages: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} - read-pkg@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} - - read@1.0.7: - resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} - engines: {node: '>=0.8'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -13718,10 +13343,6 @@ packages: samlify@2.13.1: resolution: {integrity: sha512-vdYr/zohDGBbfWNU4miEzc1jmWOtkLySPViapC6nfGkv9KxzLq4UlGkKyryzwLw4jVlZk88Rw93HaCRVpe+t+g==} - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} - engines: {node: '>=11.0.0'} - saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -13736,15 +13357,6 @@ packages: scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - secretlint@10.2.2: - resolution: {integrity: sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==} - engines: {node: '>=20.0.0'} - hasBin: true - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -13860,12 +13472,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -13873,14 +13479,6 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -13933,18 +13531,6 @@ packages: sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -14054,10 +13640,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -14065,9 +13647,6 @@ packages: strnum@2.4.1: resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} - structured-source@4.0.0: - resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} - style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -14107,10 +13686,6 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-hyperlinks@3.2.0: - resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} - engines: {node: '>=14.18'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -14133,10 +13708,6 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} - tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -14156,9 +13727,6 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-fs@2.1.5: - resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} - tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} @@ -14180,20 +13748,9 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terminal-link@4.0.0: - resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} - engines: {node: '>=18'} - text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - textextensions@6.11.0: - resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} - engines: {node: '>=4'} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -14331,13 +13888,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - turbo@2.11.10: resolution: {integrity: sha512-3GJYwig8ygEI89oaOZdduJX8/aw6O9eRPYHoIt6T3FZl9hkKjiyIspufJoVgqXihPoJu8M5CSV0DlZvzfohBCw==} hasBin: true @@ -14366,9 +13916,6 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - typed-rest-client@1.8.11: - resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typedoc-plugin-markdown@4.14.1: resolution: {integrity: sha512-24XX0oqyBsjBIBNoSH4wbgQkouci/CmgmO1ZBSaVkrcflqXFL2PQ5zFOpkz+Ewow5xQ3q2You+wrcmilNepRKg==} engines: {node: '>= 18'} @@ -14411,9 +13958,6 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - underscore@1.13.8: - resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} - undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} @@ -14425,10 +13969,6 @@ packages: resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} engines: {node: '>=22.19.0'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -14521,9 +14061,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -14565,9 +14102,6 @@ packages: resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -14582,10 +14116,6 @@ packages: react: 19.3.0 react-dom: 19.3.0 - version-range@4.15.0: - resolution: {integrity: sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==} - engines: {node: '>=4'} - vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -14734,19 +14264,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -14846,17 +14367,9 @@ packages: resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} engines: {node: '>=16.0.0'} - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - xml@1.0.1: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -14926,9 +14439,6 @@ packages: resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} engines: {node: '>=12'} - yazl@2.5.1: - resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -15241,12 +14751,6 @@ snapshots: '@aws/lambda-invoke-store@0.3.0': {} - '@azu/format-text@1.0.2': {} - - '@azu/style-format@1.0.1': - dependencies: - '@azu/format-text': 1.0.2 - '@azure-rest/core-client@2.8.0': dependencies: '@azure/abort-controller': 2.2.0 @@ -17457,103 +16961,29 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@secretlint/config-creator@10.2.2': + '@sentry/browser-utils@10.70.0': dependencies: - '@secretlint/types': 10.2.2 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 - '@secretlint/config-loader@10.2.2': + '@sentry/browser@10.70.0': dependencies: - '@secretlint/profiler': 10.2.2 - '@secretlint/resolver': 10.2.2 - '@secretlint/types': 10.2.2 - ajv: 8.20.0 - debug: 4.4.3(supports-color@8.1.1) - rc-config-loader: 4.1.4 - transitivePeerDependencies: - - supports-color + '@sentry/browser-utils': 10.70.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.70.0 + '@sentry/feedback': 10.70.0 + '@sentry/replay': 10.70.0 + '@sentry/replay-canvas': 10.70.0 - '@secretlint/core@10.2.2': - dependencies: - '@secretlint/profiler': 10.2.2 - '@secretlint/types': 10.2.2 - debug: 4.4.3(supports-color@8.1.1) - structured-source: 4.0.0 - transitivePeerDependencies: - - supports-color + '@sentry/conventions@0.16.0': {} - '@secretlint/formatter@10.2.2': + '@sentry/core@10.70.0': dependencies: - '@secretlint/resolver': 10.2.2 - '@secretlint/types': 10.2.2 - '@textlint/linter-formatter': 15.7.1 - '@textlint/module-interop': 15.7.1 - '@textlint/types': 15.7.1 - chalk: 5.6.2 - debug: 4.4.3(supports-color@8.1.1) - pluralize: 8.0.0 - strip-ansi: 7.2.0 - table: 6.9.0 - terminal-link: 4.0.0 - transitivePeerDependencies: - - supports-color + '@sentry/conventions': 0.16.0 - '@secretlint/node@10.2.2': + '@sentry/feedback@10.70.0': dependencies: - '@secretlint/config-loader': 10.2.2 - '@secretlint/core': 10.2.2 - '@secretlint/formatter': 10.2.2 - '@secretlint/profiler': 10.2.2 - '@secretlint/source-creator': 10.2.2 - '@secretlint/types': 10.2.2 - debug: 4.4.3(supports-color@8.1.1) - p-map: 7.0.4 - transitivePeerDependencies: - - supports-color - - '@secretlint/profiler@10.2.2': {} - - '@secretlint/resolver@10.2.2': {} - - '@secretlint/secretlint-formatter-sarif@10.2.2': - dependencies: - node-sarif-builder: 3.4.0 - - '@secretlint/secretlint-rule-no-dotenv@10.2.2': - dependencies: - '@secretlint/types': 10.2.2 - - '@secretlint/secretlint-rule-preset-recommend@10.2.2': {} - - '@secretlint/source-creator@10.2.2': - dependencies: - '@secretlint/types': 10.2.2 - istextorbinary: 9.5.0 - - '@secretlint/types@10.2.2': {} - - '@sentry/browser-utils@10.70.0': - dependencies: - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - - '@sentry/browser@10.70.0': - dependencies: - '@sentry/browser-utils': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/feedback': 10.70.0 - '@sentry/replay': 10.70.0 - '@sentry/replay-canvas': 10.70.0 - - '@sentry/conventions@0.16.0': {} - - '@sentry/core@10.70.0': - dependencies: - '@sentry/conventions': 0.16.0 - - '@sentry/feedback@10.70.0': - dependencies: - '@sentry/core': 10.70.0 + '@sentry/core': 10.70.0 '@sentry/react@10.70.0(react@19.3.0)': dependencies: @@ -17658,8 +17088,6 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@sindresorhus/merge-streams@4.0.0': {} '@smithy/core@3.29.5': @@ -17922,35 +17350,6 @@ snapshots: dependencies: '@testing-library/dom': 10.4.2 - '@textlint/ast-node-types@15.7.1': {} - - '@textlint/linter-formatter@15.7.1': - dependencies: - '@azu/format-text': 1.0.2 - '@azu/style-format': 1.0.1 - '@textlint/module-interop': 15.7.1 - '@textlint/resolver': 15.7.1 - '@textlint/types': 15.7.1 - chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) - js-yaml: 4.3.2 - lodash: 4.18.1 - pluralize: 2.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - table: 6.9.0 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - '@textlint/module-interop@15.7.1': {} - - '@textlint/resolver@15.7.1': {} - - '@textlint/types@15.7.1': - dependencies: - '@textlint/ast-node-types': 15.7.1 - '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 @@ -18198,8 +17597,6 @@ snapshots: dependencies: undici-types: 8.9.0 - '@types/normalize-package-data@2.4.4': {} - '@types/pg@8.23.1': dependencies: '@types/node': 26.6.5 @@ -18238,8 +17635,6 @@ snapshots: dependencies: '@types/node': 26.6.5 - '@types/sarif@2.1.7': {} - '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 @@ -18279,8 +17674,6 @@ snapshots: '@types/validate-npm-package-name@4.0.2': {} - '@types/vscode@1.140.0': {} - '@types/webidl-conversions@7.0.3': {} '@types/whatwg-mimetype@3.0.2': {} @@ -18508,81 +17901,6 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vscode/vsce-sign-alpine-arm64@2.0.6': - optional: true - - '@vscode/vsce-sign-alpine-x64@2.0.6': - optional: true - - '@vscode/vsce-sign-darwin-arm64@2.0.6': - optional: true - - '@vscode/vsce-sign-darwin-x64@2.0.6': - optional: true - - '@vscode/vsce-sign-linux-arm64@2.0.6': - optional: true - - '@vscode/vsce-sign-linux-arm@2.0.6': - optional: true - - '@vscode/vsce-sign-linux-x64@2.0.6': - optional: true - - '@vscode/vsce-sign-win32-arm64@2.0.6': - optional: true - - '@vscode/vsce-sign-win32-x64@2.0.6': - optional: true - - '@vscode/vsce-sign@2.0.9': - optionalDependencies: - '@vscode/vsce-sign-alpine-arm64': 2.0.6 - '@vscode/vsce-sign-alpine-x64': 2.0.6 - '@vscode/vsce-sign-darwin-arm64': 2.0.6 - '@vscode/vsce-sign-darwin-x64': 2.0.6 - '@vscode/vsce-sign-linux-arm': 2.0.6 - '@vscode/vsce-sign-linux-arm64': 2.0.6 - '@vscode/vsce-sign-linux-x64': 2.0.6 - '@vscode/vsce-sign-win32-arm64': 2.0.6 - '@vscode/vsce-sign-win32-x64': 2.0.6 - - '@vscode/vsce@3.9.2': - dependencies: - '@azure/identity': 4.13.1 - '@secretlint/node': 10.2.2 - '@secretlint/secretlint-formatter-sarif': 10.2.2 - '@secretlint/secretlint-rule-no-dotenv': 10.2.2 - '@secretlint/secretlint-rule-preset-recommend': 10.2.2 - '@vscode/vsce-sign': 2.0.9 - azure-devops-node-api: 12.5.0 - chalk: 4.1.2 - cheerio: 1.2.0 - cockatiel: 3.2.1 - commander: 12.1.0 - form-data: 4.0.6 - glob: 13.0.6 - hosted-git-info: 4.1.0 - jsonc-parser: 3.3.1 - leven: 3.1.0 - markdown-it: 14.3.3 - mime: 1.6.0 - minimatch: 10.2.6 - parse-semver: 1.1.1 - read: 1.0.7 - secretlint: 10.2.2 - semver: 7.8.5 - tmp: 0.2.7 - typed-rest-client: 1.8.11 - url-join: 4.0.1 - xml2js: 0.5.0 - yauzl: 3.4.0 - yazl: 2.5.1 - optionalDependencies: - keytar: 7.9.0 - transitivePeerDependencies: - - supports-color - '@workflow/serde@4.1.0': {} '@xmldom/is-dom-node@1.0.1': {} @@ -18710,10 +18028,6 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -18809,8 +18123,6 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - astral-regex@2.0.0: {} - astring@1.9.0: {} async-mutex@0.5.0: @@ -18848,11 +18160,6 @@ snapshots: axobject-query@4.1.0: {} - azure-devops-node-api@12.5.0: - dependencies: - tunnel: 0.0.6 - typed-rest-client: 1.8.11 - b4a@1.9.0: {} bail@2.0.2: {} @@ -18947,10 +18254,6 @@ snapshots: buffers: 0.1.1 chainsaw: 0.1.0 - binaryextensions@6.11.0: - dependencies: - editions: 6.22.0 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -18997,10 +18300,6 @@ snapshots: transitivePeerDependencies: - supports-color - boolbase@1.0.0: {} - - boundary@2.0.0: {} - bowser@2.14.1: {} brace-expansion@5.0.12: @@ -19099,11 +18398,6 @@ snapshots: dependencies: traverse: 0.3.9 - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.6.2: {} chalk@6.0.1: {} @@ -19116,29 +18410,6 @@ snapshots: character-reference-invalid@2.0.1: {} - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.2.2 - css-what: 6.2.2 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - - cheerio@1.2.0: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - encoding-sniffer: 0.2.1 - htmlparser2: 10.1.0 - parse5: 7.3.0 - parse5-htmlparser2-tree-adapter: 7.1.0 - parse5-parser-stream: 7.1.2 - undici: 7.30.1 - whatwg-mimetype: 4.0.0 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -19147,9 +18418,6 @@ snapshots: dependencies: readdirp: 5.0.0 - chownr@1.1.4: - optional: true - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -19208,8 +18476,6 @@ snapshots: cnfast@0.1.0: {} - cockatiel@3.2.1: {} - code-block-writer@13.0.3: {} collapse-white-space@2.1.0: {} @@ -19232,8 +18498,6 @@ snapshots: commander@11.1.0: {} - commander@12.1.0: {} - commander@14.0.3: {} commander@15.0.0: {} @@ -19336,21 +18600,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.2 - css-what@6.2.2: {} - css.escape@1.5.1: {} cssesc@3.0.0: {} @@ -19580,16 +18834,8 @@ snapshots: dependencies: character-entities: 2.0.2 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - optional: true - dedent@1.7.2: {} - deep-extend@0.6.0: - optional: true - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -19641,28 +18887,10 @@ snapshots: dom-accessibility-api@0.6.3: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - dompurify@3.4.17: optionalDependencies: '@types/trusted-types': 2.0.7 - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-prop@6.0.1: dependencies: is-obj: 2.0.0 @@ -19691,10 +18919,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - editions@6.22.0: - dependencies: - version-range: 4.15.0 - ee-first@1.1.1: {} ejs@6.0.1: {} @@ -19719,11 +18943,6 @@ snapshots: encodeurl@2.0.0: {} - encoding-sniffer@0.2.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding: 3.1.1 - end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -19748,8 +18967,6 @@ snapshots: env-paths@2.2.1: {} - environment@1.1.0: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -20011,9 +19228,6 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.2.0 - expand-template@2.0.3: - optional: true - expect-type@1.4.0: {} express-rate-limit@8.6.2(express@4.22.2): @@ -20573,9 +19787,6 @@ snapshots: getopts@2.3.0: {} - github-from-package@0.0.0: - optional: true - github-slugger@2.0.0: {} gl-matrix@3.4.4: {} @@ -20607,15 +19818,6 @@ snapshots: globals@17.13.0: {} - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.6 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -20807,14 +20009,6 @@ snapshots: hookified@2.2.0: {} - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.4.3 - html-encoding-sniffer@6.0.0(@noble/hashes@2.4.0): dependencies: '@exodus/bytes': 1.16.0(@noble/hashes@2.4.0) @@ -20835,13 +20029,6 @@ snapshots: html-void-elements@3.0.0: {} - htmlparser2@10.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -20912,8 +20099,6 @@ snapshots: indent-string@4.0.0: {} - index-to-position@1.2.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -20921,9 +20106,6 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: - optional: true - inline-style-parser@0.2.7: {} input-otp@1.4.2(react-dom@19.3.0(react@19.3.0))(react@19.3.0): @@ -21072,12 +20254,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - istextorbinary@9.5.0: - dependencies: - binaryextensions: 6.11.0 - editions: 6.22.0 - textextensions: 6.11.0 - jiti@2.7.0: {} jju@1.4.0: {} @@ -21104,10 +20280,6 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.3.2: - dependencies: - argparse: 2.0.1 - js-yaml@5.4.2: dependencies: argparse: 2.0.1 @@ -21228,12 +20400,6 @@ snapshots: kdbush@4.1.0: {} - keytar@7.9.0: - dependencies: - node-addon-api: 4.3.0 - prebuild-install: 7.1.3 - optional: true - keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -21285,8 +20451,6 @@ snapshots: dependencies: readable-stream: 2.3.8 - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -21476,8 +20640,6 @@ snapshots: lodash.once@4.1.1: {} - lodash.truncate@4.4.2: {} - lodash.union@4.6.0: {} lodash.uniq@4.5.0: {} @@ -21503,8 +20665,6 @@ snapshots: devlop: 1.1.0 highlight.js: 11.11.1 - lru-cache@10.4.3: {} - lru-cache@11.5.3: {} lru-cache@5.1.1: @@ -21514,6 +20674,7 @@ snapshots: lru-cache@6.0.0: dependencies: yallist: 4.0.0 + optional: true lru.min@1.1.5: {} @@ -22085,9 +21246,6 @@ snapshots: mimic-function@5.0.1: {} - mimic-response@3.1.0: - optional: true - min-indent@1.0.1: {} mingo@7.2.4: {} @@ -22100,9 +21258,6 @@ snapshots: minipass@7.1.3: {} - mkdirp-classic@0.5.3: - optional: true - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -22234,8 +21389,6 @@ snapshots: murmurhash-js@1.0.0: {} - mute-stream@0.0.8: {} - mute-stream@3.0.0: optional: true @@ -22266,9 +21419,6 @@ snapshots: nanostores@1.5.0: {} - napi-build-utils@2.0.0: - optional: true - native-duplexpair@1.0.0: {} natural-compare@1.4.0: {} @@ -22317,14 +21467,6 @@ snapshots: - '@types/node' - babel-plugin-macros - node-abi@3.92.0: - dependencies: - semver: 7.8.5 - optional: true - - node-addon-api@4.3.0: - optional: true - node-addon-api@8.9.2: {} node-releases@2.0.60: {} @@ -22333,19 +21475,8 @@ snapshots: dependencies: asn1: 0.2.6 - node-sarif-builder@3.4.0: - dependencies: - '@types/sarif': 2.1.7 - fs-extra: 11.4.0 - nodemailer@10.2.1: {} - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.8.5 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} npm-run-path@4.0.1: @@ -22359,10 +21490,6 @@ snapshots: npm-to-yarn@3.2.0: {} - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -22461,8 +21588,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.4: {} - p-try@2.2.0: {} package-manager-detector@1.8.0: {} @@ -22479,27 +21604,8 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@8.3.0: - dependencies: - '@babel/code-frame': 7.29.7 - index-to-position: 1.2.0 - type-fest: 4.41.0 - parse-ms@4.0.0: {} - parse-semver@1.1.1: - dependencies: - semver: 5.7.2 - - parse5-htmlparser2-tree-adapter@7.1.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.3.0 - - parse5-parser-stream@7.1.2: - dependencies: - parse5: 7.3.0 - parse5@7.3.0: dependencies: entities: 6.0.1 @@ -22540,8 +21646,6 @@ snapshots: path-to-regexp@8.4.2: {} - path-type@6.0.0: {} - pathe@2.0.3: {} pbf@5.1.2: @@ -22625,10 +21729,6 @@ snapshots: dependencies: playwright-core: 1.63.0 - pluralize@2.0.0: {} - - pluralize@8.0.0: {} - pngjs@5.0.0: {} points-on-curve@0.2.0: {} @@ -22683,22 +21783,6 @@ snapshots: powershell-utils@0.2.1: {} - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.1.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.92.0 - pump: 3.0.4 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.5 - tunnel-agent: 0.6.0 - optional: true - prelude-ls@1.2.1: {} pretty-format@27.5.1: @@ -22739,12 +21823,6 @@ snapshots: proxy-from-env@2.1.0: {} - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - optional: true - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -22802,23 +21880,6 @@ snapshots: iconv-lite: 0.7.3 unpipe: 1.0.0 - rc-config-loader@4.1.4: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - js-yaml: 4.3.2 - json5: 2.2.3 - require-from-string: 2.0.2 - transitivePeerDependencies: - - supports-color - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - optional: true - react-day-picker@10.0.1(@types/react@19.3.0)(react@19.3.0): dependencies: '@date-fns/tz': 1.5.0 @@ -22962,18 +22023,6 @@ snapshots: react@19.3.0: {} - read-pkg@9.0.1: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 8.3.0 - type-fest: 4.41.0 - unicorn-magic: 0.1.0 - - read@1.0.7: - dependencies: - mute-stream: 0.0.8 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -23344,8 +22393,6 @@ snapshots: xml-escape: 1.1.0 xpath: 0.0.34 - sax@1.6.0: {} - saxes@5.0.1: dependencies: xmlchars: 2.2.0 @@ -23360,20 +22407,6 @@ snapshots: dependencies: compute-scroll-into-view: 3.1.1 - secretlint@10.2.2: - dependencies: - '@secretlint/config-creator': 10.2.2 - '@secretlint/formatter': 10.2.2 - '@secretlint/node': 10.2.2 - '@secretlint/profiler': 10.2.2 - debug: 4.4.3(supports-color@8.1.1) - globby: 14.1.0 - read-pkg: 9.0.1 - transitivePeerDependencies: - - supports-color - - semver@5.7.2: {} - semver@6.3.1: {} semver@7.5.4: @@ -23586,16 +22619,6 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: - optional: true - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -23604,14 +22627,6 @@ snapshots: sisteransi@1.0.5: {} - slash@5.1.0: {} - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - smart-buffer@4.2.0: {} socks@2.8.9: @@ -23653,20 +22668,6 @@ snapshots: dependencies: memory-pager: 1.5.0 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - split-string@3.1.0: dependencies: extend-shallow: 3.0.2 @@ -23788,9 +22789,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: - optional: true - strip-json-comments@3.1.1: optional: true @@ -23798,10 +22796,6 @@ snapshots: dependencies: anynum: 1.0.1 - structured-source@4.0.0: - dependencies: - boundary: 2.0.0 - style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -23837,11 +22831,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.2.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} svelte@5.57.1(@typescript-eslint/types@8.72.1): @@ -23874,14 +22863,6 @@ snapshots: systeminformation@5.33.1: {} - table@6.9.0: - dependencies: - ajv: 8.20.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tagged-tag@1.0.0: optional: true @@ -23895,14 +22876,6 @@ snapshots: tapable@2.3.3: {} - tar-fs@2.1.5: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.4 - tar-stream: 2.2.0 - optional: true - tar-mini@0.2.0: {} tar-stream@2.2.0: @@ -23948,23 +22921,12 @@ snapshots: - bare-abort-controller - react-native-b4a - terminal-link@4.0.0: - dependencies: - ansi-escapes: 7.3.0 - supports-hyperlinks: 3.2.0 - text-decoder@1.2.7: dependencies: b4a: 1.9.0 transitivePeerDependencies: - react-native-b4a - text-table@0.2.0: {} - - textextensions@6.11.0: - dependencies: - editions: 6.22.0 - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -24092,13 +23054,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - - tunnel@0.0.6: {} - turbo@2.11.10: optionalDependencies: '@turbo/darwin-64': 2.11.10 @@ -24132,12 +23087,6 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 - typed-rest-client@1.8.11: - dependencies: - qs: 6.16.0 - tunnel: 0.0.6 - underscore: 1.13.8 - typedoc-plugin-markdown@4.14.1(typedoc@0.28.20(typescript@6.0.3)): dependencies: typedoc: 0.28.20(typescript@6.0.3) @@ -24177,16 +23126,12 @@ snapshots: ufo@1.6.4: {} - underscore@1.13.8: {} - undici-types@8.9.0: {} undici@7.30.1: {} undici@8.12.3: {} - unicorn-magic@0.1.0: {} - unicorn-magic@0.3.0: {} unified@11.0.5: @@ -24301,8 +23246,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-join@4.0.1: {} - use-callback-ref@1.3.3(@types/react@19.3.0)(react@19.3.0): dependencies: react: 19.3.0 @@ -24332,11 +23275,6 @@ snapshots: uuid@11.1.1: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validate-npm-package-name@7.0.2: {} vary@1.1.2: {} @@ -24350,8 +23288,6 @@ snapshots: - '@types/react' - '@types/react-dom' - version-range@4.15.0: {} - vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -24524,14 +23460,8 @@ snapshots: webpack-virtual-modules@0.6.2: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: {} - whatwg-mimetype@5.0.0: {} whatwg-url@14.2.0: @@ -24626,15 +23556,8 @@ snapshots: xml-naming@0.3.0: {} - xml2js@0.5.0: - dependencies: - sax: 1.6.0 - xmlbuilder: 11.0.1 - xml@1.0.1: {} - xmlbuilder@11.0.1: {} - xmlchars@2.2.0: {} xpath@0.0.32: {} @@ -24651,7 +23574,8 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} + yallist@4.0.0: + optional: true yaml@2.9.1: {} @@ -24712,10 +23636,6 @@ snapshots: dependencies: pend: 1.2.0 - yazl@2.5.1: - dependencies: - buffer-crc32: 0.2.13 - yocto-queue@0.1.0: {} yocto-spinner@1.2.2: diff --git a/scripts/check-changeset-fixed.mjs b/scripts/check-changeset-fixed.mjs index d2294d8cbfb..6d05ee6a94f 100644 --- a/scripts/check-changeset-fixed.mjs +++ b/scripts/check-changeset-fixed.mjs @@ -35,18 +35,14 @@ const repoRoot = resolve(__dirname, '..'); * Private workspace packages that belong in the `fixed` group anyway, each with * the reason it is there. Every other name in the group must be public. * - * `object-ui` is the VS Code extension (`ui/packages/vscode-extension`). It is - * never published to npm, but it ships at the release's version: Tesla's ruling - * of 2026-10-25 (decision 17b, ruling B, objectstack#25711) keeps it in the one - * version group 「同一个版本号组」 the objectui merge created, as objectui's own - * group had. A private package outside this list is still refused in the group, - * so a package marked private by mistake cannot hide in it. + * Empty today: its one row, the VS Code extension, left the workspace under + * objectstack#25910's ruling. A private package outside this list is refused in + * the group, so a package marked private by mistake cannot hide in it; a new + * row needs its reason and the ruling that put it there. * * @type {Readonly>} */ -export const PRIVATE_FIXED_MEMBERS = Object.freeze({ - 'object-ui': 'the VS Code extension: never on npm, versioned with the release (decision 17b, objectstack#25711)', -}); +export const PRIVATE_FIXED_MEMBERS = Object.freeze({}); /** * Names of all non-private workspace packages. diff --git a/ui/content/docs/guide/architecture.md b/ui/content/docs/guide/architecture.md index 470a391a35f..0d7bf6e7568 100644 --- a/ui/content/docs/guide/architecture.md +++ b/ui/content/docs/guide/architecture.md @@ -107,7 +107,6 @@ Development tools and integration utilities: - `@object-ui/create-plugin` - Interactive plugin scaffolder - `@object-ui/runner` - Universal runtime for testing and demos - `@object-ui/data-objectstack` - ObjectStack data backend adapter -- `vscode-extension` - VS Code extension for schema development [Learn more about utilities →](/docs/utilities) diff --git a/ui/content/docs/utilities/index.md b/ui/content/docs/utilities/index.md index ac6a3c1fce0..84fb6fa7524 100644 --- a/ui/content/docs/utilities/index.md +++ b/ui/content/docs/utilities/index.md @@ -21,10 +21,6 @@ Browse available utilities: - **[ObjectStack Adapter](/docs/utilities/data-objectstack)** - Connect to ObjectStack backend -### Editor Extensions - -- **[VS Code Extension](/docs/utilities/vscode-extension)** - Schema editor and IntelliSense - ## Official Utilities ### CLI @@ -98,26 +94,6 @@ npm install @object-ui/data-objectstack @objectstack/client --- -### VS Code Extension - -**[object-ui](/docs/utilities/vscode-extension)** - Visual Studio Code extension for ObjectUI schema development. - -- Schema preview -- JSON validation -- IntelliSense and auto-completion -- Syntax highlighting -- Export to React components -- Schema formatting - -```bash -# Install from VS Code Marketplace -code --install-extension objectui.object-ui -``` - -[Read full documentation →](/docs/utilities/vscode-extension) - ---- - ## How Utilities Work ### CLI Workflow @@ -212,7 +188,6 @@ All ObjectUI utilities share these characteristics: - **[CLI Documentation](/docs/utilities/cli)** - Learn how to use the ObjectUI CLI - **[Create Plugin Guide](/docs/utilities/create-plugin)** - Build your first plugin -- **[VS Code Extension](/docs/utilities/vscode-extension)** - Set up your development environment - **[Plugin Concepts](/docs/guide/plugins)** - Learn how plugins work in detail ## Need Help? diff --git a/ui/content/docs/utilities/meta.json b/ui/content/docs/utilities/meta.json index d989b6b9543..445f733c014 100644 --- a/ui/content/docs/utilities/meta.json +++ b/ui/content/docs/utilities/meta.json @@ -3,7 +3,6 @@ "cli", "create-plugin", "runner", - "data-objectstack", - "vscode-extension" + "data-objectstack" ] } diff --git a/ui/content/docs/utilities/vscode-extension.mdx b/ui/content/docs/utilities/vscode-extension.mdx deleted file mode 100644 index e5f7a53ef24..00000000000 --- a/ui/content/docs/utilities/vscode-extension.mdx +++ /dev/null @@ -1,502 +0,0 @@ ---- -title: "VS Code Extension" -description: "Visual Studio Code extension for ObjectUI schema development" ---- - -# ObjectUI VS Code Extension - -The ObjectUI VS Code extension provides a comprehensive development environment for creating and editing ObjectUI schemas. It includes schema preview, validation, IntelliSense, syntax highlighting, and powerful productivity features. - -## Installation - -### From VS Code Marketplace - -1. Open VS Code -2. Go to Extensions (Ctrl+Shift+X / Cmd+Shift+X) -3. Search for "ObjectUI" -4. Click Install - -### From Command Line - -```bash -code --install-extension objectui.object-ui -``` - -### Manual Installation - -Download the `.vsix` file from the releases page and install it. The file name carries -the package name and the version you downloaded: - -```bash -code --install-extension object-ui-.vsix -``` - -## Features - -- 🔍 **Schema Preview** - Live preview of your UI schemas -- ✅ **JSON Validation** - Real-time schema validation -- 💡 **IntelliSense** - Auto-completion for schema properties -- 🎨 **Syntax Highlighting** - Enhanced JSON highlighting for ObjectUI -- 📝 **Snippets** - Quick schema templates -- 🔧 **Commands** - Useful schema manipulation commands -- 🚀 **Export to React** - Convert schemas to React components -- 📋 **Format Schema** - Auto-format your schema files - -## Commands - -Access commands via Command Palette (Ctrl+Shift+P / Cmd+Shift+P): - -### `Object UI: Open Preview` - -Opens a live preview of your schema in the first editor column. Its sibling -`Object UI: Open Preview to the Side` opens the same panel beside the editor -instead. - -**Usage:** -1. Open a `.json` or `.objectui.json` file -2. Press `Ctrl+Shift+P` (Windows/Linux) or `Cmd+Shift+P` (Mac) -3. Type "Object UI: Open Preview" -4. Preview opens in a panel - -### `Object UI: Validate Schema` - -Validates the current schema against ObjectUI schema definitions. - -**Usage:** -1. Open a schema file -2. Run command -3. View validation errors in Problems panel - -### `Object UI: Export to React Component` - -Converts the schema to a React component. - -**Usage:** -1. Open a schema file -2. Run command -3. The generated component opens in a **new untitled editor tab**, with its - language set to `typescriptreact` -4. VS Code shows `React component generated! Save it to a .tsx file.` — nothing - is written to disk and nothing is put on your clipboard, so save that tab - yourself - -**Output Example:** - -This is the file the command produces — your exported schema comes back verbatim -as the `schema` constant, and both imports are part of the output. -`import '@object-ui/components'` is load-bearing: importing the package is what -registers the default renderers, so a file that drops it renders nothing. -The constant is typed as `SchemaRendererProps['schema']`, the schema -`SchemaRenderer` takes, so the compiler checks your schema where it is written: -each node's `type` stays a literal and is checked against the node types the -prop accepts, and a schema it does not accept is refused on that line. - -```typescript -// No React import: under the automatic JSX runtime ("jsx": "react-jsx", -// what a new Vite or Next project is configured with) nothing here reads that -// identifier, so it compiles as an unused local. Add the import back only if -// this file is built with the classic "jsx": "react" transform. -import { SchemaRenderer, type SchemaRendererProps } from '@object-ui/react'; -// Importing the package registers every default renderer as a side effect — -// there is no separate registration call. -import '@object-ui/components'; - -// Typed as the schema SchemaRenderer takes, so each "type" below stays a literal -// and the compiler checks the schema against the node types it accepts. -const schema: SchemaRendererProps['schema'] = { - "type": "div", - "className": "p-4", - "children": [ - { - "type": "h1", - "children": "Hello World" - } - ] -}; - -export default function GeneratedComponent() { - return ; -} -``` - -### `Object UI: Format Schema` - -Formats the schema JSON with consistent indentation and ordering. - -**Usage:** -1. Open a schema file -2. Run command -3. Schema is auto-formatted - -### `Object UI: Create New Schema` - -Creates a new schema file from a template. - -**Usage:** -1. Run command -2. Select a template — `Empty Schema`, `Simple Form`, `Dashboard`, `Card Layout` or `Data Table` -3. New file is created with template content - -## Language Support - -### File Associations - -The extension recognizes these file patterns: - -- `*.objectui.json` - ObjectUI schema files -- `schema.json` - Schema files in specific directories -- Any `.json` file with `"type": "app"` or component types - -### Syntax Highlighting - -Enhanced JSON highlighting for ObjectUI-specific properties: - -- **Component Types** - Highlighted in blue -- **Actions** - Highlighted in green -- **Data Sources** - Highlighted in purple -- **Expressions** - Highlighted in orange - -## IntelliSense - -### Auto-completion - -Type-ahead suggestions for: - -- Component types (`div`, `button`, `form`, `data-table`, etc.) -- Schema properties (`className`, `dataSource`, `children`, etc.) -- Action types (`navigate`, `submit`, `ajax`, etc.) -- Data source types (`api`, `objectstack`, `value`, etc.) - -**Example:** - -Type `"type": "` and get suggestions: -- `button` -- `card` -- `data-table` -- `form` -- `grid` -- And 100+ more... - -### Hover Information - -Hover over properties to see: - -- Property description -- Expected type -- Example values -- Link to documentation - -### Validation - -Real-time validation flags a value the extension knows to be out of range — an `input`'s -`inputType` or a `button`'s `variant` outside its set — and suggests a `label` on `input`, -`textarea` and `select` nodes: - -{/* doc-json: fragment — a deliberately refused node: it shows the out-of-range `variant` the extension warns about */} -```jsonc -{ - "type": "button", - "label": "Save", - "variant": "primary" // ⚠️ Invalid variant "primary". Must be one of: default, destructive, outline, secondary, ghost, link -} -``` - -It does not flag a key no schema declares. `objectui validate` does: it judges a document through -the strict authoring face and refuses an undeclared key by name (see the [CLI](/docs/utilities/cli)). - -## Snippets - -Type `oui-` and press Tab to insert one of the templates the extension ships, defined in -`packages/vscode-extension/snippets/objectui.json`: - -| Prefix | Inserts | -|--------|---------| -| `oui-empty` | a node with a `className` and an empty `children` slot | -| `oui-form` | a card holding a labelled `input` and a `button` | -| `oui-card` | a `card` with a `title`, a `description` and a `children` slot | -| `oui-input` | an `input` with a `label`, a `placeholder`, an `inputType` and `required` | -| `oui-textarea` | a `textarea` with a `label`, a `placeholder` and `rows` | -| `oui-button` | a `button` with a `label` and a `variant` | -| `oui-text` | a `text` node with `content` | -| `oui-grid` | a responsive grid `div` | -| `oui-dashboard` | a dashboard `div` with a heading and a metric card | -| `oui-separator` | a `separator` | -| `oui-container` | a centred container `div` | -| `oui-flex` | a flex `div` | - -`oui-form`, with its placeholders left at their defaults, inserts: - -```json -{ - "type": "div", - "className": "max-w-2xl mx-auto p-6", - "children": { - "type": "card", - "title": "Form Title", - "children": { - "type": "div", - "className": "space-y-4", - "children": [ - { - "type": "input", - "label": "Name", - "placeholder": "Enter your name", - "required": true - }, - { - "type": "button", - "label": "Submit" - } - ] - } - } -} -``` - -## Configuration - -Configure the extension via Settings (Ctrl+, / Cmd+,): - -### `objectui.preview.port` - -Port for preview server (default: `3000`) - -```json -{ - "objectui.preview.port": 3000 -} -``` - -### `objectui.preview.autoRefresh` - -Auto-refresh preview on save (default: `true`) - -```json -{ - "objectui.preview.autoRefresh": true -} -``` - -### `objectui.validation.enabled` - -Enable real-time validation (default: `true`) - -```json -{ - "objectui.validation.enabled": true -} -``` - -### `objectui.validation.severity` - -Validation severity level (default: `error`) - -Options: `error`, `warning`, `info` - -```json -{ - "objectui.validation.severity": "warning" -} -``` - -### `objectui.completion.enabled` - -Enable auto-completion (default: `true`) - -```json -{ - "objectui.completion.enabled": true -} -``` - -### `objectui.snippets.enabled` - -Enable code snippets (default: `true`) - -```json -{ - "objectui.snippets.enabled": true -} -``` - -## Workspace Settings - -Create `.vscode/settings.json` in your project: - -```json -{ - "objectui.preview.port": 3000, - "objectui.preview.autoRefresh": true, - "objectui.validation.enabled": true, - "objectui.completion.enabled": true, - "files.associations": { - "*.schema.json": "objectui-json", - "ui.json": "objectui-json" - } -} -``` - -## Keyboard Shortcuts - -**The extension ships no default keyboard shortcuts.** Its manifest has no -`contributes.keybindings` block, so no command arrives bound to a chord — run them -from the Command Palette or the context menus above, or bind the ones you use. - -### Bind a command yourself - -Open the Keyboard Shortcuts editor (Ctrl+K Ctrl+S / Cmd+K Cmd+S), search for the -command by its name, and assign a chord. To write the binding by hand instead, open -`keybindings.json` from that editor and add an entry naming the command id: - -```json -{ - "key": "ctrl+alt+shift+f19", - "command": "objectui.preview", - "when": "editorLangId == json" -} -``` - -The `key` above is a stand-in, not a proposal — a deliberately far-fetched chord -that nothing binds, there to show the shape of an entry. Pick your own, and pick one -you are not already using: an entry in your `keybindings.json` overrides VS Code's -default for that chord, and the `when` clause only narrows *where* your entry -applies (here, JSON editors) — it does not decide whether your entry wins. Binding -`ctrl+shift+p`, for instance, would take the Command Palette away from you in JSON -files, which is where your schemas are open and where this page keeps sending you -for these commands. - -Every command the extension contributes, with the id to bind: - -| Command | Command id | -|---------|------------| -| Object UI: Open Preview | `objectui.preview` | -| Object UI: Open Preview to the Side | `objectui.previewToSide` | -| Object UI: Validate Schema | `objectui.validate` | -| Object UI: Format Schema | `objectui.format` | -| Object UI: Export to React Component | `objectui.exportToReact` | -| Object UI: Create New Schema | `objectui.newSchema` | - -## Context Menus - -Right-click a `.objectui.json` or `.oui.json` file to access — the entries are -contributed for those two extensions only: - -### Editor Context Menu - -- **Object UI: Open Preview** - Open live preview -- **Object UI: Validate Schema** - Run validation -- **Object UI: Export to React Component** - Convert to React component - -### Explorer Context Menu - -- **Object UI: Open Preview** - Preview selected file - -## Preview Features - -The preview panel includes: - -- **Live Rendering** - See changes immediately -- **Interactive UI** - Test interactions -- **Device Toggle** - Mobile/tablet/desktop views -- **Dark Mode Toggle** - Test light/dark themes -- **Refresh Button** - Manual refresh -- **Console** - View errors and logs - -## Development Workflow - -### Typical Workflow - -1. **Create Schema** - Use snippet or command -2. **Edit Schema** - IntelliSense helps with completion -3. **Preview** - Open live preview -4. **Validate** - Check for errors -5. **Test** - Interact with preview -6. **Export** - Convert to React - -### Tips - -- **Split Editor** - Keep schema and preview side-by-side -- **Auto Save** - Enable auto-save for instant preview updates -- **Multi-root Workspace** - Work on multiple schema projects -- **Git Integration** - Track schema changes - -## Package Information - -**Extension ID:** `objectui.object-ui` -**License:** MIT - -## Extension Dependencies - -The extension bundles: - -- **JSON Language Server** - For validation and IntelliSense -- **Schema Definitions** - ObjectUI type definitions -- **Preview Server** - Built-in Vite server - -## Troubleshooting - -### Preview Not Working - -1. Check preview port is available: - ```bash - # Change port in settings - "objectui.preview.port": 5174 - ``` - -2. Check firewall settings -3. Reload window (Ctrl+R) - -### Validation Not Working - -1. Check file is recognized as ObjectUI schema -2. Verify `objectui.validation.enabled` is `true` -3. Reload window - -### IntelliSense Not Showing - -1. Verify `objectui.completion.enabled` is `true` -2. Check file language mode is JSON -3. Reload window - -### Extension Not Loading - -1. Check extension is enabled -2. Check for extension errors in Output panel -3. Reinstall extension - -## Updates - -The extension auto-updates via VS Code's extension manager. - -### Manual Update - -```bash -code --install-extension objectui.object-ui --force -``` - -### Check Version - -1. Go to Extensions -2. Find ObjectUI extension -3. Check version number - -## Contributing - -The extension is open source. Contribute on GitHub: - -- **Repository:** [objectstack-ai/objectui](https://github.com/objectstack-ai/objectui) -- **Issues:** [Report bugs or request features](https://github.com/objectstack-ai/objectui/issues) -- **Pull Requests:** [Contribute code](https://github.com/objectstack-ai/objectui/pulls) - -## Next Steps - -- **[Schema Overview](/docs/guide/schema-overview)** - Learn the schema format -- **[CLI](/docs/utilities/cli)** - Use CLI for development -- **[Plugins](/docs/plugins)** - Explore available plugins -- **[Examples](https://github.com/objectstack-ai/objectui/tree/main/examples)** - See example schemas - -## Need Help? - -- [GitHub Issues](https://github.com/objectstack-ai/objectui/issues) -- [Documentation](https://www.objectui.org) -- [VS Code Extension Documentation](https://code.visualstudio.com/docs/editor/extension-marketplace) diff --git a/ui/packages/core/src/utils/dataset-format.ts b/ui/packages/core/src/utils/dataset-format.ts index dac3448eede..85797da91fb 100644 --- a/ui/packages/core/src/utils/dataset-format.ts +++ b/ui/packages/core/src/utils/dataset-format.ts @@ -305,7 +305,7 @@ function formatMeasureDate(v: unknown, format: string | undefined, locale: strin * lived in `@object-ui/i18n`, which depends on `i18next`/`react-i18next` and * peer-depends on React, while this package is the React-free engine (AGENTS.md * §3: "No UI-lib deps. Logic only.") and a runtime dependency of React-FREE - * consumers — the `object-ui` VS Code extension and `@object-ui/data-objectstack`. + * consumers — `@object-ui/data-objectstack`, and then the VS Code extension too. * * #4576 removed the boundary rather than working around it: `formatDisplayNumber` * is pure, so it moved DOWN into this package (`./number-display.ts`) and diff --git a/ui/packages/core/src/utils/number-display.ts b/ui/packages/core/src/utils/number-display.ts index 3aab3ffb333..9ed0512cad6 100644 --- a/ui/packages/core/src/utils/number-display.ts +++ b/ui/packages/core/src/utils/number-display.ts @@ -32,8 +32,8 @@ * It used to live in `@object-ui/i18n`, and that home cost the repo a real * defect. `@object-ui/core`'s `utils/dataset-format.ts` could not import it — * `core` is the React-free engine (AGENTS.md §3: "No UI-lib deps. Logic only.") - * and is a runtime dependency of React-FREE consumers (the `object-ui` VS Code - * extension, `@object-ui/data-objectstack`), while `i18n` depends on + * and is a runtime dependency of React-FREE consumers (`@object-ui/data-objectstack`, + * and then the VS Code extension too), while `i18n` depends on * `i18next`/`react-i18next` and peer-depends on React. So `formatMeasure` kept * a parallel `Intl` implementation, the two drifted, and a German session read * `1.234,5 %` from a list cell beside `1.234,5%` from a dashboard measure diff --git a/ui/packages/types/src/__tests__/package-exports-manifest.test.ts b/ui/packages/types/src/__tests__/package-exports-manifest.test.ts index 46fc72929be..c391458d604 100644 --- a/ui/packages/types/src/__tests__/package-exports-manifest.test.ts +++ b/ui/packages/types/src/__tests__/package-exports-manifest.test.ts @@ -20,10 +20,11 @@ * `require` condition rather than adding a second build format — is the * contract-honest fix; see the PR body for the full premise verification * (nothing in-repo `require()`s this package, and the one in-repo CJS-format - * bundle consumer, `packages/vscode-extension` via `tsup --format cjs` with - * `noExternal: ['@object-ui/types', ...]`, builds byte-identically with the - * condition present or absent — it resolves the value imports it re-exports - * via the `import` condition regardless of its own output format). + * bundle consumer of the time, the VS Code extension via `tsup --format cjs` + * with `noExternal: ['@object-ui/types', ...]`, built byte-identically with the + * condition present or absent — it resolved the value imports it re-exported + * via the `import` condition regardless of its own output format; that + * package has since left the workspace, objectstack#25910). * * ## What this test is, and is not * diff --git a/ui/packages/types/src/zod/form.zod.ts b/ui/packages/types/src/zod/form.zod.ts index 1de880ba7e1..6e1da44a529 100644 --- a/ui/packages/types/src/zod/form.zod.ts +++ b/ui/packages/types/src/zod/form.zod.ts @@ -987,9 +987,9 @@ export const CommandSchema = BaseSchema.extend({ * the author shipped the bad metadata anyway. * * This is deliberately NOT an answer to "which validator is canonical" - * (objectui#5449, objectui#4631): a third hand-rolled implementation lives in - * `packages/vscode-extension/src/providers/SchemaValidator.ts`, and whether - * the end state is one canonical validator or a contract the others defer to + * (objectui#5449, objectui#4631): a third hand-rolled implementation lived in + * the VS Code extension's `SchemaValidator.ts` until objectstack#25910 removed + * that package, and whether the end state is one canonical validator or a contract the others defer to * is a maintainer architecture call. Closing the authoring-time gap is not, * and is all that happens here. */ diff --git a/ui/packages/vscode-extension/.gitignore b/ui/packages/vscode-extension/.gitignore deleted file mode 100644 index a10c717416d..00000000000 --- a/ui/packages/vscode-extension/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -*.vsix -.vscode-test -*.log -.DS_Store diff --git a/ui/packages/vscode-extension/.vscodeignore b/ui/packages/vscode-extension/.vscodeignore deleted file mode 100644 index d6d5d07a9af..00000000000 --- a/ui/packages/vscode-extension/.vscodeignore +++ /dev/null @@ -1,10 +0,0 @@ -.vscode -.vscode-test -src -tsconfig.json -tsup.config.ts -node_modules -*.md -!README.md -.gitignore -*.log diff --git a/ui/packages/vscode-extension/CHANGELOG.md b/ui/packages/vscode-extension/CHANGELOG.md deleted file mode 100644 index ed55af3017e..00000000000 --- a/ui/packages/vscode-extension/CHANGELOG.md +++ /dev/null @@ -1,2125 +0,0 @@ -# Changelog - -## 18.2.0 - -### Patch Changes - -- Updated dependencies [dc71845] -- Updated dependencies [9a0af4e] -- Updated dependencies [ef025fe] -- Updated dependencies [1bbb7bf] -- Updated dependencies [e843b5b] -- Updated dependencies [4f48d2b] -- Updated dependencies [0b76a1f] -- Updated dependencies [14b5597] -- Updated dependencies [6ea429d] -- Updated dependencies [48a9d9d] - - @object-ui/types@18.2.0 - - @object-ui/core@18.2.0 - -## 18.1.0 - -### Patch Changes - -- Updated dependencies [8556295] -- Updated dependencies [cd14d8e] -- Updated dependencies [49a536d] -- Updated dependencies [8e90779] -- Updated dependencies [f1a4b08] -- Updated dependencies [7f60e9d] -- Updated dependencies [1d178e0] -- Updated dependencies [6fb31dc] - - @object-ui/types@18.1.0 - - @object-ui/core@18.1.0 - -## 18.0.0 - -### Major Changes - -- 6f3299f: objectui moves to major 18, following `@objectstack/*` from 17 to 18 (objectui#12334). objectui's major is not a count of its own breaking changes: it tracks the major of the `@objectstack/spec` its packages depend on, so that the same major means compatible across the two projects. These packages already declare `@objectstack/*` on the 18 line (objectui#12030), so every package in the fixed release group crosses to 18 together. It is the one `major` that rule admits: objectui's own breaking changes ship as `minor`, described in their entries. - - The 18 line is released from Changesets pre mode on the `next` tag (`.changeset/pre.json`), as `@objectstack/*` 18 is: these releases are `18.0.0-next.N` on the npm `next` dist-tag, and they do not move `latest`. The first `18.0.0` on `latest` comes when `@objectstack` 18 is generally available and this repository leaves pre mode. - - What a consumer must do to take it is in the `@objectstack/*` 18 entry of this release (objectui#12030): move its own `@objectstack/*` packages to the 18 line at the same time. - -### Patch Changes - -- Updated dependencies [18d7b48] -- Updated dependencies [172acc3] -- Updated dependencies [f0496bd] -- Updated dependencies [c4c506b] -- Updated dependencies [9db9ff3] -- Updated dependencies [b10c68e] -- Updated dependencies [bdc9049] -- Updated dependencies [2e818d0] -- Updated dependencies [8b14aec] -- Updated dependencies [2abec3a] -- Updated dependencies [9dfaca6] -- Updated dependencies [e6dcd85] -- Updated dependencies [96fcf30] -- Updated dependencies [d50f724] -- Updated dependencies [17acfbb] -- Updated dependencies [89cc738] -- Updated dependencies [c0862c1] -- Updated dependencies [c0862c1] -- Updated dependencies [c0862c1] -- Updated dependencies [c0862c1] -- Updated dependencies [4c0de52] -- Updated dependencies [a80fef7] -- Updated dependencies [f34e877] -- Updated dependencies [f34e877] -- Updated dependencies [aaba865] -- Updated dependencies [45d5853] -- Updated dependencies [2312bd9] -- Updated dependencies [c5406c2] -- Updated dependencies [d99b731] -- Updated dependencies [2a48bd4] -- Updated dependencies [c7b30bd] -- Updated dependencies [69bca0a] -- Updated dependencies [023f00d] -- Updated dependencies [158c75d] -- Updated dependencies [7525045] -- Updated dependencies [5af42db] -- Updated dependencies [5f75cfa] -- Updated dependencies [c0c2f79] -- Updated dependencies [0665c3b] -- Updated dependencies [d2500d8] -- Updated dependencies [b231607] -- Updated dependencies [466a219] -- Updated dependencies [6fb281d] -- Updated dependencies [334f0cf] -- Updated dependencies [c08c933] -- Updated dependencies [c4dd707] -- Updated dependencies [923504f] -- Updated dependencies [10aba37] -- Updated dependencies [5d3f437] -- Updated dependencies [7af0ab3] -- Updated dependencies [fd4872f] -- Updated dependencies [f0532d8] -- Updated dependencies [3092aca] -- Updated dependencies [82e5f53] -- Updated dependencies [d81e460] -- Updated dependencies [8106db1] -- Updated dependencies [093d55b] -- Updated dependencies [a8051d6] -- Updated dependencies [524136e] -- Updated dependencies [6f3299f] -- Updated dependencies [f2b17c6] -- Updated dependencies [52d6194] -- Updated dependencies [23bf859] -- Updated dependencies [1c72d77] -- Updated dependencies [2b4d3f1] -- Updated dependencies [d75f212] -- Updated dependencies [ff9df88] -- Updated dependencies [a2225f9] -- Updated dependencies [21f9577] -- Updated dependencies [3eb3ec1] -- Updated dependencies [619e3f7] -- Updated dependencies [f62b6ff] -- Updated dependencies [d66d7e8] -- Updated dependencies [15d8ca6] -- Updated dependencies [378896d] -- Updated dependencies [4839f5c] -- Updated dependencies [c999d4c] -- Updated dependencies [260ef71] -- Updated dependencies [26323c4] -- Updated dependencies [c219165] -- Updated dependencies [fb501bc] -- Updated dependencies [30083da] -- Updated dependencies [025130c] -- Updated dependencies [8aa8e3e] -- Updated dependencies [2493e85] -- Updated dependencies [a928aaa] -- Updated dependencies [61ed5ad] -- Updated dependencies [1b94d50] -- Updated dependencies [fb85637] -- Updated dependencies [9f1dd79] -- Updated dependencies [df71568] -- Updated dependencies [cbac9d7] -- Updated dependencies [616df65] -- Updated dependencies [daeb77f] -- Updated dependencies [eb4552e] -- Updated dependencies [3c3115e] -- Updated dependencies [55e90fd] -- Updated dependencies [9b75509] -- Updated dependencies [b13ea3c] -- Updated dependencies [d7e9e9a] -- Updated dependencies [cf62edf] -- Updated dependencies [0253416] -- Updated dependencies [5d77c09] -- Updated dependencies [3fd8625] -- Updated dependencies [1473757] -- Updated dependencies [d73d987] -- Updated dependencies [12ff256] -- Updated dependencies [26b0bd2] -- Updated dependencies [d328698] -- Updated dependencies [d328698] -- Updated dependencies [b4e0787] -- Updated dependencies [088e0f7] -- Updated dependencies [78b07f4] -- Updated dependencies [b403bb3] -- Updated dependencies [12dc7b4] - - @object-ui/types@18.0.0 - - @object-ui/core@18.0.0 - -## 17.7.0 - -### Minor Changes - -- 2acd8e1: **BREAKING (authoring surface): `body` is no longer a child-list key. Author `children`.** - - `BaseSchema` declared two spellings of one concept — `body` and `children` — and left the - choice per component. **Thirteen** registrations read `body` and nothing else, so it was - their ONLY door — the twelve the ruling enumerated plus `tooltip`, which it did not, and - which is the count the committed instrument carries (`BODY_ONLY` plus - `BODY_ONLY_UNRULED` in `scripts/body-dialect-census.mjs`). `div`, `card`, `page`, - `button`, `aspect-ratio`, the seven sectioning tags and the safe-HTML tag factory read - `children || body` and took either. The authoring tier only ever knew `children`, so - an author writing the one spelling that resolved got `unknown-prop` — the same warning a - typo draws, on the tier built to accept AI-authored pages, where the diagnostic **is** the - contract (objectui#6771). - - Ruled 2026-09-01: one concept, one spelling, and the spelling is `children`. - - ## What changed - - - **Renderers.** `alert`, `badge`, `tooltip` and the `sidebar-*` family read `children`. - Every `children || body` fallback drops its `body` arm **except the four `page:*` - reads named below** — `div`, `card`, `button`, `aspect-ratio`, the sectioning tags, - the safe-HTML tag factory behind ~36 tags, `page`'s flat content list, and - `@object-ui/core`'s recursive `validateSchema`. - - **Item-level `body` is a DIFFERENT key and is untouched.** At this change, `list` - draws each entry as `item.content || renderChildren(item.body)` and `tabs` as - `item.content || item.body`, both filed under the ITEM type rather than the node, - and `tabs` still ships `body` inside its own `defaultProps`. ⛔ Neither is this - spelling and neither is refused here: the node-level retirement does not reach a - member of a declared `items` array. Retiring the item-level dialect is - objectui#9590's card, and the two named above are recorded on it. - ⚠️ **Dated note, 2026-09-25 — neither half of this bullet holds any longer — objectui#9590.** - objectui#9941 respelled the `tabs` `defaultProps` items to `content`, and - objectui#9590 retired both item-level reads: a `list` item and a `tabs` item draw - `content` and nothing else, and both item faces now refuse `body` by name, - pointing at `content`. The rest of this bullet is kept as the reading of this change. - - **What still reads `body` at NODE level, and why.** Four renderer reads, all `page:*`: `page:card` - (renderer and Studio canvas) and the three thin `page:section` / `page:footer` / - `page:sidebar` containers. ⛔ Authoring the key is refused on them as it is - everywhere else; only the READ survives, for documents already STORED under it. - `@objectstack/spec` states the ground on `PageContainerProps` itself: «The renderers - keep reading `body` as a back-compat fallback for stored documents; that fallback is - objectui's to retire on its own schedule, and it is not a second authorable - spelling.» ⚠️ What separates the two halves is a CONVERSION, not a ground: the spec's - registry carries `page-card-body-to-children` (`toMajor: 17`, surface - `page.component.page:card.body`, shipped `retiredFromLoadPath: true` in spec 17.0.0) - and carries none for the other three — so a stored row under their key has no - migration path at all. Nothing in this repository authors any of them, and the - committed census over those keys is how to see that rather than take it on trust: - `node scripts/body-dialect-census.mjs --keys page:section,page:footer,page:sidebar,page:card,card`. - ⚠️ This sentence used to restate that table's answer instead of pointing at it, and - the very commit that edited the sentence moved the figure — a count copied into prose - is what AGENTS.md #9 forbids, so the instrument replaces the number. Read the table - for three things: `card` + `body` is a control that FIRES on the head that ships (so - a zero elsewhere is a reading, not a blind spot), every node still carrying `body` - under these keys falls in the `test` bucket, and `page:section` is a LIT zero — 6 - nodes resolved, 0 `body`, 4 `children` — rather than a key nobody asked about. - Retiring the THREE THIN reads is objectui#9916, - which asks for the stored-corpus reading they turn on; `page:card`'s read is not - that card's either — it is objectui's own, grounded by objectstack#5775 / - ADR-0087 D2 rather than owned by it, and it ends when the stored rows have been - replayed through the conversion that already shipped for it. - - **The published type.** `BaseSchema.body` is `never` on the TypeScript face and an - alias refusal naming `children` on the Zod mirror, as are the four per-component - redeclarations (`CardSchema`, `AspectRatioSchema`, `PageNodeSchema`, `TooltipSchema`). - ⚠️ Refused **by name**, not deleted: `BaseSchema` carries an index signature and the - mirror ends `.passthrough()`, so a deleted member would be accepted silently and - rendered by nothing — the exact silence this retirement ends. - - **The VS Code extension (`object-ui`) changes behaviour, not just teaching.** Its - preview no longer draws a `body`-spelled document — the node renders empty, the way - the runtime renders it — and its validator now emits a warning naming `children` at - the key's own position. That warning is skipped for node types that declare their - own `body` input (`record:alert`), so a declared translation-map `body` is not - reported as the retired spelling. - - **Two new `@object-ui/sdui-parser` exports.** `RETIRED_CHILD_LIST_KEY` (the retired - spelling, so a consumer names it once) and `checkRetiredBodyDialect` (the diagnostic - the tier substitutes for `unknown-prop` on that key). - - **The authoring tier.** `sdui-parser` answers an authored `body` with the replacement - named, instead of the bare "has no prop" every typo gets — and a `body` child list - under a non-container draws the same containment code the `children` spelling draws. - - **Corpus and teaching, in the same change.** 114 authored nodes across the docs site, - the schema catalog, five package READMEs and the VS Code extension's snippets, JSON - schema, syntax map, hovers and completions. The platform does not refuse a spelling it - still ships. - - ## Migrating - - Rename the key. `{ "type": "card", "body": [...] }` becomes - `{ "type": "card", "children": [...] }`; both faces now name `children` in the refusal, - and `pnpm census:body-dialect` reports where the dialect still lives in a tree. - - ⚠️ **Four renderer reads are deliberately untouched, all in the `page:*` namespace** — - `page:card` and the three thin `page:section` / `page:footer` / `page:sidebar` - containers. They are read-only back-compat paths for STORED documents, not a second - authoring face: `@objectstack/spec`'s `PageContainerProps` says so itself — `children` - is canonical, `body` is deliberately not declared, and «the renderers keep reading - `body` as a back-compat fallback for stored documents; that fallback is objectui's to - retire on its own schedule». - - ⛔ **Authoring `body` on them is still refused**, on both published faces and at the - authoring tier, exactly as everywhere else. What survives is the READ. - - ⚠️ The two halves are not in the same state. `page:card` has a migration path — the - spec's conversions registry carries `page-card-body-to-children` (`toMajor: 17`, - surface `page.component.page:card.body`), which shipped with `retiredFromLoadPath: true` - in spec 17.0.0. The other three have **no conversion at all**, so a stored row under - their key has nowhere to be migrated to. ⇒ the two halves are tracked separately, and - the pointer is not one card: retiring the three thin reads is objectui#9916, whose - question is the stored corpus; retiring `page:card`'s read was **grounded by** - objectstack#5775 / ADR-0087 D2, whose conversion has already shipped and whose - remaining condition is replayed rows. ⚠️ Grounded by, not owned by — the distinction - is the point. objectstack#5775 is CLOSED and its body is a props-declaration audit - that carries no such step, so a reader sent there for the action finds none. The - action is objectui's, on the spec's own terms quoted above: «that fallback is - objectui's to retire on its own schedule.» - - **Non-rendering readers keep their arm on the same rule**, and none of them renders - anything: while a renderer still reaches stored `body` content, a reader that must see - the SAME content keeps its arm, or the renderer draws what the reader cannot find. - Those are the two tab-subtree walkers in `renderers/layout/containers.tsx`, - `app-shell`'s `pageSchemaIntrospect` (`CONTAINER_KEYS`) and `PageBlockInspector` - (`STRUCTURAL_PROP_KEYS`, the inspector half of a stored `properties.body`), and the - CLI's `OBJECTUI_STRUCTURAL_KEYS` — a file-IDENTIFICATION marker, where keeping `body` is - what lets an old file still be recognised as an ObjectUI node and therefore refused, - instead of silently not judged. - - ⚠️ **Dated note, 2026-10-02 — the `sidebar-*` parts are retired — objectui#10859.** - Later in this same release objectui#10859 batch 8 (phase 2d) unregistered the ten `sidebar-*` part keys. Of the - family the **Renderers** line names, only `sidebar` remains, and it reads `children`. The rest of this entry is - kept as the reading of this change. -- 4b5bb95: The VS Code extension no longer ignores a child list spelled `children`, and everything - the platform scaffolds now emits that spelling (objectui#7181). - - ## The defect, and who it hit - - `children` is the spelling ObjectUI declares on four faces: the `BaseSchema` TypeScript - declaration and its zod mirror in `@object-ui/types`, `validateSchema` in - `@object-ui/core`, and the authoring tier's `BASE_PROPS` in `@object-ui/sdui-parser` - (which accepts `children` and does **not** list `body`). - - Both readers in the VS Code extension honoured only `body`. So an author who wrote the - spelling the platform blesses got, from the tool meant to be teaching them the format: - - - **a blank preview** — `Object UI: Open Preview` rendered the node as an empty card or - container, with no error and no diagnostic; and - - **children that were never validated** — the validator's recursion never reached them, - so a child missing its required `type` drew no warning at all. - - Both failures were silent in both directions: nothing told the author their file was - being skipped, and nothing told them it was fine. Metadata written to a file by one - party and re-authored by another was simply dropped by the reader. - - Both readers now read `children` first and **keep** `body`, so every existing - `body`-spelled document behaves exactly as it did. Nothing is removed and no accepted - spelling is narrowed. The extension's validator also reports diagnostics at the key the - document actually used, instead of addressing them to `.body[...]` in a file that - contains no such key. - - ## Scaffolders and shipped defaults now emit `children` - - The same dialect was being *produced* into files users own, and into components' own - declared defaults: - - - `objectui init` — the `app.json` written for every template - - `Object UI: Create New Schema` — every template the VS Code extension writes - - `carousel`, `resizable` and `scroll-area` — the child lists inside their shipped - `defaultProps` - - the runner's "no index page found" fallback page - - Every node type involved already read `children`, so rendering is unchanged; what moves - is the spelling users are handed as their starting point. - - ⚠️ This is a change to what those tools *emit*, not to what ObjectUI accepts: `body` - remains readable everywhere it was readable before, and a project scaffolded by an - earlier version needs no edit. Retiring the `body` arm is a separate, already-ruled - step and is not part of this release. `pnpm census:body-dialect` is the instrument that - reports where the dialect still lives. - - Scaffolded output and shipped defaults are now pinned by tests that discover the - template population from the code, so a template added later is covered without anyone - remembering to extend them. - -### Patch Changes - -- fc7db05: The VS Code extension's **Export to React** command types the `schema` constant it emits as `SchemaRendererProps['schema']`, imported type-only from `@object-ui/react` beside `SchemaRenderer` (objectui#11515). - - Unannotated, every `type` in the constant widened to `string`. A `SchemaRenderer` prop that discriminates on the literal `type` refuses such a value, so the generated file stopped compiling as soon as the prop is narrowed to the declared node types (objectui#11466). Annotated, each `type` stays a literal and the schema is checked where it is written: a schema the prop does not accept is refused on the constant's own line. Measured with `tsc` against the built packages, the emitted file compiles today and with objectui#11466 applied. - - `SchemaNode` was the annotation first proposed, and it does not fit: it also admits `number` and `boolean`, which the prop leaves out, so every generated file was refused at its one JSX line. - - The compile pin gains a leg against the real prop type, read from `SchemaRenderer.tsx`, with a positive control. The two documented copies of the preamble (`DESIGN.md` and the docs page) follow it. The docs page's sample keeps its `h1` node: `h1` is a declared type (`HtmlElementSchema`), and the annotated sample compiles both today and with objectui#11466 applied. -- 744c25e: Fix the phantom import the VS Code extension's **Export to React** command wrote into - every file it generated (objectui#7837). - - `generateReactComponent()` emitted a preamble that imported `registerDefaultRenderers` - from `@object-ui/components` and then called it. That symbol is on **no export** of - that package: its built `dist/index.d.ts` carries exactly one `register*` name, - `registerPlaceholders`, and `registerDefaultRenderers` appears **0 times** in either - `dist/index.d.ts` or `dist/index.js`. So every file the command produced failed to - compile with `TS2305` naming a symbol the user never typed. - - `@object-ui/components` registers its renderers as an **import side effect** — - `sideEffects: true` in its manifest, `import './renderers'` in its barrel under the - comment `Register all ObjectUI renderers (side-effects)`, and **114 `register(` call - sites** at module scope in the built `dist/index.js`. There is no registration function - to call, so the generated preamble now imports the package for the side effect and says - why. Same spelling the root README landed for objectui#7417. - - `packages/vscode-extension/DESIGN.md`, which documented the identical two lines, is - corrected in the same commit so the design record does not freeze the defect. - - No public surface moved: no export added, no signature changed. -- f98e73b: Drop the unused `import React from 'react'` the VS Code extension's **Export to React** - command wrote into every file it generated (objectui#7862). - - The generated file's only JSX is a single SchemaRenderer element, so under the automatic - JSX runtime — `"jsx": "react-jsx"`, what a new Vite or Next project is configured with — - the `React` identifier was never read. Measured on this branch against the built - `dist/index.d.ts` of `@object-ui/react` and `@object-ui/components`, TypeScript 6.0.3: - the emitted file compiled clean under `react-jsx` + `strict` (exit 0), and under the same - config plus `noUnusedLocals: true` it failed with - `TS6133: 'React' is declared but its value is never read` — so a consumer with that - option on could not compile the file the command had just handed them. - - The preamble now says in a comment that it assumes the automatic runtime and that the - import goes back only on the classic `"jsx": "react"` transform, which is the one - configuration this costs: measured, that file reports one diagnostic about `React` being - out of scope. Nothing in the extension emits or promises a `jsx` setting — the string - does not occur anywhere in the package — and the published docs page for the command - already showed the output without the import. - - A new pin, `src/__tests__/export-to-react-compiles.test.ts`, now extracts the template's - PRODUCT and compiles it under `noUnusedLocals`, rather than matching substrings in the - generator. The sibling objectui#7837 pin was green for the whole life of this line - because it never named it; a compile closes the class instead of one member of it. Its - positive control runs on every invocation: re-adding the import must report TS6133, so - the harness cannot go quietly, permanently green. - - `packages/vscode-extension/DESIGN.md`, whose section 4 hand-mirrors this preamble, is - corrected in the same commit so the design record does not freeze the defect — the - spelling objectui#7837 landed for the same file. What binds the two copies together is - still nothing, and objectui#7976 holds that question. - - No public surface moved: no export added, no signature changed. -- Updated dependencies [97abedc] -- Updated dependencies [b46c58f] -- Updated dependencies [ad694ac] -- Updated dependencies [6f96fca] -- Updated dependencies [c131d9e] -- Updated dependencies [5f00ff4] -- Updated dependencies [c9e073a] -- Updated dependencies [7b395d8] -- Updated dependencies [0879812] -- Updated dependencies [8cedb0d] -- Updated dependencies [6cc910b] -- Updated dependencies [061f5e8] -- Updated dependencies [2dd4d3f] -- Updated dependencies [4ab4f1b] -- Updated dependencies [e3ea4f9] -- Updated dependencies [8b1f066] -- Updated dependencies [af243c1] -- Updated dependencies [961ceaa] -- Updated dependencies [f3f4e4c] -- Updated dependencies [a05c350] -- Updated dependencies [8c10f4f] -- Updated dependencies [90dac98] -- Updated dependencies [6096f20] -- Updated dependencies [544aca2] -- Updated dependencies [ea02938] -- Updated dependencies [a14fb23] -- Updated dependencies [ae98f1d] -- Updated dependencies [f98eddf] -- Updated dependencies [ce6bd99] -- Updated dependencies [a5b08c9] -- Updated dependencies [86982ac] -- Updated dependencies [ff14e29] -- Updated dependencies [9b28151] -- Updated dependencies [64563a9] -- Updated dependencies [1a5003f] -- Updated dependencies [8acc51b] -- Updated dependencies [3261e64] -- Updated dependencies [d22b37b] -- Updated dependencies [1daf477] -- Updated dependencies [6c2f3c5] -- Updated dependencies [fb13e85] -- Updated dependencies [c2d8659] -- Updated dependencies [e0f8202] -- Updated dependencies [c3a26cc] -- Updated dependencies [a66e58e] -- Updated dependencies [d89492c] -- Updated dependencies [9a5f998] -- Updated dependencies [9327397] -- Updated dependencies [17cc3a3] -- Updated dependencies [4758b33] -- Updated dependencies [9c78ebe] -- Updated dependencies [12809a5] -- Updated dependencies [f9c06ef] -- Updated dependencies [5ad3b88] -- Updated dependencies [f9d772b] -- Updated dependencies [97b6c21] -- Updated dependencies [baac95a] -- Updated dependencies [29b45f6] -- Updated dependencies [39b8d51] -- Updated dependencies [17b323e] -- Updated dependencies [b956e69] -- Updated dependencies [33e58d8] -- Updated dependencies [256b4c9] -- Updated dependencies [fec3b1a] -- Updated dependencies [b8e0941] -- Updated dependencies [0c50f18] -- Updated dependencies [1dae95a] -- Updated dependencies [e32dae1] -- Updated dependencies [30b11ad] -- Updated dependencies [4aebea0] -- Updated dependencies [f976774] -- Updated dependencies [3d6badf] -- Updated dependencies [25cb364] -- Updated dependencies [c6678b1] -- Updated dependencies [0638322] -- Updated dependencies [e3782d2] -- Updated dependencies [db0beb2] -- Updated dependencies [997ce38] -- Updated dependencies [ae0b9d3] -- Updated dependencies [3b469c8] -- Updated dependencies [990a2d6] -- Updated dependencies [6650259] -- Updated dependencies [4f8b7f8] -- Updated dependencies [9e6619f] -- Updated dependencies [f6ae5e2] -- Updated dependencies [7343376] -- Updated dependencies [b2683a2] -- Updated dependencies [dded788] -- Updated dependencies [b45d463] -- Updated dependencies [54a7830] -- Updated dependencies [f3135a4] -- Updated dependencies [b5696d3] -- Updated dependencies [3f9d926] -- Updated dependencies [e978ed5] -- Updated dependencies [6a7f24e] -- Updated dependencies [b3c96d6] -- Updated dependencies [8d0ca91] -- Updated dependencies [c30c8dd] -- Updated dependencies [328abeb] -- Updated dependencies [24d3e65] -- Updated dependencies [95a7c8d] -- Updated dependencies [e227156] -- Updated dependencies [cc4e476] -- Updated dependencies [92970c4] -- Updated dependencies [d570eaa] -- Updated dependencies [42687ba] -- Updated dependencies [6cd8f66] -- Updated dependencies [24a0f14] -- Updated dependencies [797a30f] -- Updated dependencies [b4075c0] -- Updated dependencies [9b85600] -- Updated dependencies [99878d8] -- Updated dependencies [3c13675] -- Updated dependencies [63ab761] -- Updated dependencies [0eb9f36] -- Updated dependencies [ae582b7] -- Updated dependencies [db11afd] -- Updated dependencies [154075a] -- Updated dependencies [582edef] -- Updated dependencies [19f484f] -- Updated dependencies [0a78a20] -- Updated dependencies [615346d] -- Updated dependencies [75dcc81] -- Updated dependencies [55a12a8] -- Updated dependencies [edfcf5a] -- Updated dependencies [0a3e540] -- Updated dependencies [f61dab1] -- Updated dependencies [b0a05dd] -- Updated dependencies [dd5ff19] -- Updated dependencies [81f8498] -- Updated dependencies [a782fa7] -- Updated dependencies [76e9df0] -- Updated dependencies [6158e4c] -- Updated dependencies [c27b575] -- Updated dependencies [0e6e76b] -- Updated dependencies [bf43afa] -- Updated dependencies [858eafb] -- Updated dependencies [cd5b19a] -- Updated dependencies [17dc167] -- Updated dependencies [20d23be] -- Updated dependencies [20d23be] -- Updated dependencies [e6bc087] -- Updated dependencies [a7557a7] -- Updated dependencies [7d074ba] -- Updated dependencies [6158e4c] -- Updated dependencies [6158e4c] -- Updated dependencies [52aad5c] -- Updated dependencies [58da8ae] -- Updated dependencies [138ad45] -- Updated dependencies [138ad45] -- Updated dependencies [5262f7d] -- Updated dependencies [6aa029b] -- Updated dependencies [770cc5b] -- Updated dependencies [1a88ce2] -- Updated dependencies [a1a44d6] -- Updated dependencies [e0a9c67] -- Updated dependencies [5638529] -- Updated dependencies [5638529] -- Updated dependencies [c476be0] -- Updated dependencies [c82ff39] -- Updated dependencies [6c3da53] -- Updated dependencies [31987bd] -- Updated dependencies [3c3ce15] -- Updated dependencies [063119f] -- Updated dependencies [e100589] -- Updated dependencies [304f611] -- Updated dependencies [e46ee77] -- Updated dependencies [f9c8c4e] -- Updated dependencies [6e9c8d2] -- Updated dependencies [9547063] -- Updated dependencies [3f6efd6] -- Updated dependencies [c4ab6d0] -- Updated dependencies [0e9058b] -- Updated dependencies [5988b6b] -- Updated dependencies [00ccdf7] -- Updated dependencies [9d9ed54] -- Updated dependencies [ca3de72] -- Updated dependencies [83e3f83] -- Updated dependencies [401611b] -- Updated dependencies [2c0ddf2] -- Updated dependencies [4abc0aa] -- Updated dependencies [f560ded] -- Updated dependencies [2b188fa] -- Updated dependencies [f68e0a0] -- Updated dependencies [aea682a] -- Updated dependencies [fcdc8ec] -- Updated dependencies [2d576e4] -- Updated dependencies [8366acc] -- Updated dependencies [95e58a3] -- Updated dependencies [9d7419b] -- Updated dependencies [fc7db05] -- Updated dependencies [9ed8d0f] -- Updated dependencies [c73cdb5] -- Updated dependencies [6f5719e] -- Updated dependencies [64dae8e] -- Updated dependencies [06a8af5] -- Updated dependencies [6a91586] -- Updated dependencies [a04d7c6] -- Updated dependencies [f3c2bb0] -- Updated dependencies [9801765] -- Updated dependencies [9cebfca] -- Updated dependencies [460575f] -- Updated dependencies [d88e20f] -- Updated dependencies [2d7304d] -- Updated dependencies [636b236] -- Updated dependencies [d6d8fb9] -- Updated dependencies [64d624d] -- Updated dependencies [053fdc8] -- Updated dependencies [ae476b8] -- Updated dependencies [95bad12] -- Updated dependencies [d2fb6ef] -- Updated dependencies [fda49e5] -- Updated dependencies [490d9a9] -- Updated dependencies [fc62bb4] -- Updated dependencies [41df893] -- Updated dependencies [0cba1b7] -- Updated dependencies [00f3eb5] -- Updated dependencies [1ec291c] -- Updated dependencies [453dbaa] -- Updated dependencies [69a2163] -- Updated dependencies [24e027e] -- Updated dependencies [2c3cd1b] -- Updated dependencies [90665e0] -- Updated dependencies [7e19d03] -- Updated dependencies [1e946c9] -- Updated dependencies [546ddf7] -- Updated dependencies [864154e] -- Updated dependencies [b023625] -- Updated dependencies [75bd83d] -- Updated dependencies [44d075b] -- Updated dependencies [40c479a] -- Updated dependencies [971d387] -- Updated dependencies [ee851c3] -- Updated dependencies [6414dfd] -- Updated dependencies [a8d5c71] -- Updated dependencies [905b21f] -- Updated dependencies [88e9109] -- Updated dependencies [2c45966] -- Updated dependencies [db3a600] -- Updated dependencies [3a3db76] -- Updated dependencies [0d723a3] -- Updated dependencies [0c95d3d] -- Updated dependencies [3e4fa2c] -- Updated dependencies [b5b928a] -- Updated dependencies [52a43de] -- Updated dependencies [195052f] -- Updated dependencies [e4559d1] -- Updated dependencies [2c71482] -- Updated dependencies [a26b9e4] -- Updated dependencies [5ef9c4f] -- Updated dependencies [46f0bb4] -- Updated dependencies [06b82b8] -- Updated dependencies [6f81384] -- Updated dependencies [8f1d995] -- Updated dependencies [dddb942] -- Updated dependencies [29754cf] -- Updated dependencies [3c2b6f7] -- Updated dependencies [b84dc18] -- Updated dependencies [ac8abb0] -- Updated dependencies [9d86e1d] -- Updated dependencies [3a5817f] -- Updated dependencies [99a3c2d] -- Updated dependencies [5961030] -- Updated dependencies [c8ea8af] -- Updated dependencies [3190414] -- Updated dependencies [4e480f5] -- Updated dependencies [38a123c] -- Updated dependencies [299102e] -- Updated dependencies [d7acad6] -- Updated dependencies [45a9aeb] -- Updated dependencies [713db46] -- Updated dependencies [bf3a03c] -- Updated dependencies [cb55718] -- Updated dependencies [831be72] -- Updated dependencies [29cb85b] -- Updated dependencies [3e028c8] -- Updated dependencies [d0889e2] -- Updated dependencies [ce503e5] -- Updated dependencies [f20dcf0] -- Updated dependencies [4ca30d0] -- Updated dependencies [7a5da14] -- Updated dependencies [2c1c967] -- Updated dependencies [4d5f9b4] -- Updated dependencies [d6ceb8d] -- Updated dependencies [7977ff9] -- Updated dependencies [3beef6d] -- Updated dependencies [2acd8e1] -- Updated dependencies [045d20b] -- Updated dependencies [a2d2515] -- Updated dependencies [adb2a86] -- Updated dependencies [3619792] -- Updated dependencies [3561bd2] -- Updated dependencies [bf97b98] -- Updated dependencies [b0d308d] -- Updated dependencies [40f34b4] -- Updated dependencies [8063bcb] -- Updated dependencies [b74a859] -- Updated dependencies [d4493fd] -- Updated dependencies [240b80f] -- Updated dependencies [77cb489] -- Updated dependencies [bfaa158] -- Updated dependencies [777e5c6] -- Updated dependencies [0c386dd] -- Updated dependencies [9e37d9b] -- Updated dependencies [5ad86dd] -- Updated dependencies [16a725f] -- Updated dependencies [4dfdcc3] -- Updated dependencies [446d93d] -- Updated dependencies [ecd9cb2] -- Updated dependencies [98d4108] -- Updated dependencies [0e3b3be] -- Updated dependencies [a29ae2d] -- Updated dependencies [4388f71] -- Updated dependencies [0b1ac58] -- Updated dependencies [c93b4d5] -- Updated dependencies [c1fe272] -- Updated dependencies [8ad218d] -- Updated dependencies [3e41187] -- Updated dependencies [5f78953] -- Updated dependencies [639114c] -- Updated dependencies [1f31d3a] -- Updated dependencies [351eb31] -- Updated dependencies [20c04b2] -- Updated dependencies [48c19bd] -- Updated dependencies [a6d8b8d] -- Updated dependencies [b652514] -- Updated dependencies [adbda1b] -- Updated dependencies [e2b3826] -- Updated dependencies [2e32ed4] -- Updated dependencies [e75f4c9] -- Updated dependencies [19f1639] -- Updated dependencies [47547d0] -- Updated dependencies [1bee5d0] -- Updated dependencies [858cd72] -- Updated dependencies [cfc9b6d] -- Updated dependencies [554f2b6] -- Updated dependencies [669d71b] -- Updated dependencies [ed27d7c] -- Updated dependencies [52c8cf7] -- Updated dependencies [2ceb43a] -- Updated dependencies [7cdd2b9] -- Updated dependencies [52c8cf7] -- Updated dependencies [81a2eb1] -- Updated dependencies [caa0cd3] -- Updated dependencies [25c7d58] -- Updated dependencies [00d2fa6] -- Updated dependencies [c6198c2] -- Updated dependencies [721d1e0] -- Updated dependencies [1237ae4] -- Updated dependencies [51eb515] -- Updated dependencies [c354ce5] -- Updated dependencies [8fe8e5c] -- Updated dependencies [feac439] -- Updated dependencies [efbd566] -- Updated dependencies [9587fc9] -- Updated dependencies [e62c44e] -- Updated dependencies [5d0876c] -- Updated dependencies [b041b9c] -- Updated dependencies [ce2aaef] -- Updated dependencies [544ecba] -- Updated dependencies [bc640ec] -- Updated dependencies [1e215c4] -- Updated dependencies [da6e191] -- Updated dependencies [3e377c9] -- Updated dependencies [a3eb5d0] -- Updated dependencies [4ce14f1] -- Updated dependencies [aef97e5] -- Updated dependencies [2af1fa7] -- Updated dependencies [a137d0c] -- Updated dependencies [caf477f] -- Updated dependencies [f6375da] -- Updated dependencies [967e5d8] -- Updated dependencies [a4611b3] -- Updated dependencies [20316ba] -- Updated dependencies [d3499b3] -- Updated dependencies [309c75e] -- Updated dependencies [c9f9bae] -- Updated dependencies [18897a4] -- Updated dependencies [8b7ea39] -- Updated dependencies [dcbf0b2] -- Updated dependencies [52cac38] -- Updated dependencies [93fea2e] -- Updated dependencies [1422a92] -- Updated dependencies [d05fe17] -- Updated dependencies [a480f79] -- Updated dependencies [f08d1a8] -- Updated dependencies [64a252d] -- Updated dependencies [786bc91] -- Updated dependencies [75fca96] -- Updated dependencies [7ca6ddd] -- Updated dependencies [f1cd290] -- Updated dependencies [5a41ce7] -- Updated dependencies [8d50bc2] -- Updated dependencies [604476d] -- Updated dependencies [335abea] -- Updated dependencies [0f5cadf] -- Updated dependencies [4f9f1ee] -- Updated dependencies [66e8b2a] -- Updated dependencies [aa083cd] -- Updated dependencies [12b5992] -- Updated dependencies [b93e245] -- Updated dependencies [c842594] -- Updated dependencies [290de37] -- Updated dependencies [8c8da45] -- Updated dependencies [8cd8eb5] -- Updated dependencies [cf1d29e] -- Updated dependencies [1bd79c8] -- Updated dependencies [af9e957] -- Updated dependencies [c974edf] -- Updated dependencies [ad852b6] -- Updated dependencies [ee4d19f] -- Updated dependencies [496d31d] -- Updated dependencies [0ea7054] -- Updated dependencies [9a853f2] -- Updated dependencies [cb847fd] -- Updated dependencies [ee70287] -- Updated dependencies [3e98e13] -- Updated dependencies [fc32921] -- Updated dependencies [4eaa835] -- Updated dependencies [8f9d87a] -- Updated dependencies [b1777ae] -- Updated dependencies [24845c4] -- Updated dependencies [6f864cf] -- Updated dependencies [24d1edd] -- Updated dependencies [645087c] -- Updated dependencies [33f4a19] -- Updated dependencies [5323168] -- Updated dependencies [841dd2b] -- Updated dependencies [3014fc0] -- Updated dependencies [dacb402] -- Updated dependencies [846cec0] -- Updated dependencies [91facae] -- Updated dependencies [b38014e] -- Updated dependencies [474797d] -- Updated dependencies [704e695] -- Updated dependencies [a407bd6] -- Updated dependencies [317dbce] -- Updated dependencies [3a43a15] -- Updated dependencies [f76f436] -- Updated dependencies [ce45a03] -- Updated dependencies [421544b] -- Updated dependencies [fb01022] -- Updated dependencies [e9d9212] -- Updated dependencies [ecfb693] -- Updated dependencies [abc1b18] -- Updated dependencies [81a51db] -- Updated dependencies [67749c7] -- Updated dependencies [507b61b] -- Updated dependencies [512c84b] -- Updated dependencies [fb3a101] -- Updated dependencies [d4733f2] -- Updated dependencies [f391ede] -- Updated dependencies [f5cfbbd] -- Updated dependencies [f5cfbbd] -- Updated dependencies [8b532cb] -- Updated dependencies [64c3cdd] -- Updated dependencies [4d65991] -- Updated dependencies [c42554e] -- Updated dependencies [555b4ec] -- Updated dependencies [1ccfc23] -- Updated dependencies [542718f] -- Updated dependencies [7f27bc5] -- Updated dependencies [0a174f3] -- Updated dependencies [f95b140] -- Updated dependencies [541ce4e] -- Updated dependencies [6479086] -- Updated dependencies [d79f525] -- Updated dependencies [d1865d2] -- Updated dependencies [f1190b0] -- Updated dependencies [561abef] -- Updated dependencies [6a4680b] -- Updated dependencies [c3a4273] -- Updated dependencies [abf710d] -- Updated dependencies [093af32] -- Updated dependencies [1bd1be7] -- Updated dependencies [d234fa9] -- Updated dependencies [adf5812] -- Updated dependencies [5058336] -- Updated dependencies [2f6b2bf] -- Updated dependencies [2028b31] -- Updated dependencies [63601ab] -- Updated dependencies [c372b29] -- Updated dependencies [8693b85] -- Updated dependencies [58b7b3d] -- Updated dependencies [84defab] -- Updated dependencies [681d3f1] -- Updated dependencies [969d4f2] -- Updated dependencies [f3bc481] -- Updated dependencies [b79aac2] -- Updated dependencies [93fc0e7] -- Updated dependencies [a4b723f] -- Updated dependencies [2b10ca0] -- Updated dependencies [7db4a81] -- Updated dependencies [19a0b0e] -- Updated dependencies [526fc11] -- Updated dependencies [f8e3e9a] -- Updated dependencies [3b6bc69] -- Updated dependencies [6732df4] -- Updated dependencies [fe9e0d0] -- Updated dependencies [63fb72c] -- Updated dependencies [804831c] -- Updated dependencies [279e48e] -- Updated dependencies [8700d6d] -- Updated dependencies [8db2a0f] -- Updated dependencies [30443fb] -- Updated dependencies [da45e6b] -- Updated dependencies [835f0f3] -- Updated dependencies [ed35b44] -- Updated dependencies [729e851] -- Updated dependencies [96919a4] -- Updated dependencies [20b507a] -- Updated dependencies [2e471dc] -- Updated dependencies [be50942] -- Updated dependencies [775e079] -- Updated dependencies [7e8b3c0] -- Updated dependencies [53374dc] -- Updated dependencies [f6fb83f] -- Updated dependencies [2049b03] -- Updated dependencies [7cbc724] -- Updated dependencies [fb91ac9] -- Updated dependencies [8524372] -- Updated dependencies [7cbefa5] -- Updated dependencies [72d6587] -- Updated dependencies [a272a4f] -- Updated dependencies [55f39ee] -- Updated dependencies [0970a0e] -- Updated dependencies [e427e9c] -- Updated dependencies [bbc9dc3] -- Updated dependencies [02f1813] -- Updated dependencies [ba0b61a] -- Updated dependencies [ac716ff] -- Updated dependencies [f0f3cd5] -- Updated dependencies [ab856ed] -- Updated dependencies [20f3e65] -- Updated dependencies [bbba098] -- Updated dependencies [87af769] -- Updated dependencies [3be720e] -- Updated dependencies [43c0d17] -- Updated dependencies [c3df43a] -- Updated dependencies [d16d0e9] -- Updated dependencies [bbe57fd] -- Updated dependencies [272a530] -- Updated dependencies [1779e8d] -- Updated dependencies [f0f4d6c] -- Updated dependencies [4128188] -- Updated dependencies [b253c4e] -- Updated dependencies [78a9c67] -- Updated dependencies [4a7ef0d] -- Updated dependencies [dea17b4] -- Updated dependencies [89bb77a] -- Updated dependencies [06611e4] -- Updated dependencies [dc3893d] -- Updated dependencies [1bbaa16] -- Updated dependencies [6ee259a] -- Updated dependencies [e708426] -- Updated dependencies [3b6d53b] -- Updated dependencies [276d174] -- Updated dependencies [2982ed9] -- Updated dependencies [a8198de] -- Updated dependencies [05a49f2] -- Updated dependencies [a78cd37] -- Updated dependencies [5ea623e] -- Updated dependencies [5eabe86] -- Updated dependencies [ca5d671] -- Updated dependencies [32bf2d6] -- Updated dependencies [af4fb29] -- Updated dependencies [ff5ef1c] -- Updated dependencies [9a97800] -- Updated dependencies [6bca0e4] -- Updated dependencies [81c0bc4] -- Updated dependencies [60500cb] -- Updated dependencies [2fcefb9] -- Updated dependencies [b55a346] -- Updated dependencies [065bba7] -- Updated dependencies [6791717] -- Updated dependencies [100547e] -- Updated dependencies [6d1c155] -- Updated dependencies [d7573b3] -- Updated dependencies [bf3edfe] -- Updated dependencies [0e05aac] -- Updated dependencies [5aed9e4] -- Updated dependencies [83c77dc] -- Updated dependencies [18a8e7d] -- Updated dependencies [e7957ab] -- Updated dependencies [f7e34ca] -- Updated dependencies [e719ebd] -- Updated dependencies [516583b] -- Updated dependencies [f9e4f91] -- Updated dependencies [6ef48b1] -- Updated dependencies [fa429cf] -- Updated dependencies [ed8df3e] -- Updated dependencies [8b446f5] -- Updated dependencies [8e74b27] -- Updated dependencies [8ebd57f] -- Updated dependencies [617707a] -- Updated dependencies [7357447] -- Updated dependencies [199d31b] -- Updated dependencies [3e01cb5] -- Updated dependencies [7138bc1] -- Updated dependencies [cef27e2] -- Updated dependencies [4e8622b] -- Updated dependencies [dffd752] -- Updated dependencies [06973aa] -- Updated dependencies [50798f3] -- Updated dependencies [105f3c5] -- Updated dependencies [3ccd9e8] -- Updated dependencies [689b979] -- Updated dependencies [e546222] -- Updated dependencies [fd13f52] -- Updated dependencies [fb336df] -- Updated dependencies [0fce2ef] -- Updated dependencies [42df928] -- Updated dependencies [0e2ddd4] -- Updated dependencies [b7479ab] -- Updated dependencies [b2ea297] -- Updated dependencies [5b5a5c3] -- Updated dependencies [14582b8] -- Updated dependencies [51e144e] -- Updated dependencies [a691c0b] -- Updated dependencies [af3861f] -- Updated dependencies [515f171] -- Updated dependencies [1f4e029] -- Updated dependencies [258d264] -- Updated dependencies [c00bf28] -- Updated dependencies [93127bd] -- Updated dependencies [f2158ec] -- Updated dependencies [759606e] -- Updated dependencies [a51fa0c] -- Updated dependencies [51f3d8d] -- Updated dependencies [78cbdb5] -- Updated dependencies [b7543a9] -- Updated dependencies [6c6cee7] -- Updated dependencies [83fe6e7] -- Updated dependencies [d1ab06f] -- Updated dependencies [91783c4] -- Updated dependencies [ca39427] -- Updated dependencies [2d36552] -- Updated dependencies [c9327c9] -- Updated dependencies [920165d] -- Updated dependencies [968dc1e] -- Updated dependencies [3c73d99] -- Updated dependencies [ed71d9e] -- Updated dependencies [7776fc2] -- Updated dependencies [e76634c] -- Updated dependencies [1170ed1] -- Updated dependencies [92814db] -- Updated dependencies [4d73b07] - - @object-ui/core@17.7.0 - - @object-ui/types@17.7.0 - -## 17.6.0 - -### Patch Changes - -- 5607092: objectui#4029 — the repo root now lints `no-console` (`error`, allowing - `warn`/`error`) so a stray module- or function-scope `console.log`/`info`/ - `debug` fails CI instead of shipping silently (as `console.log('Registering - object-map...')` did in #7139, caught only by hand). Landing the rule meant - individually judging every real hit outside the tooling exemptions - (`scripts/**`, `**/examples/**`, test files, `packages/cli/src/**`, - `packages/create-plugin/src/**`) — this changeset covers the published - packages whose call sites changed: - - - `@object-ui/app-shell`: `ObjectDataPage`'s dropped-URL-filter message is a - real diagnostic (data silently discarded), so it moves from `console.debug` - to `console.warn` to match the house convention. - - `@object-ui/plugin-detail`: `DetailView`'s Web Share API failure now reports - via `console.error` (it is a real failure, not debug noise); a redundant - "Link copied to clipboard" success log is removed. - - `@object-ui/fields`: `MasterDetailField`'s `handleView` stub no longer logs - the item it does nothing with. - - `@object-ui/runner`: `App`'s loader-selection debug prints, `LayoutRenderer`'s - unused click-handler stub log, and `MockDataSource`'s per-call narration - (`find`/`create`/`getObjectSchema`) are removed — none diagnosed a problem, - they only echoed the happy path. - - `object-ui` (VS Code extension): the "extension is now active!" activation - log is removed. - - No behavior changes beyond console output. `@object-ui/core` and - `@object-ui/data-objectstack` also touch `no-console`-adjacent lines - (`debugLog`/`debugTime`/`debugTimeEnd`, `createQuietHttpLogger`) but only to - add `eslint-disable-next-line` documentation — those ARE the repo's - deliberate debug/logger infrastructure, not leaked residue, so their own - changeset carries empty frontmatter. -- Updated dependencies [88085e3] -- Updated dependencies [2533ec5] -- Updated dependencies [bbe8b86] -- Updated dependencies [8477be5] -- Updated dependencies [279fb13] -- Updated dependencies [ad07b65] -- Updated dependencies [41f498b] -- Updated dependencies [e1d4251] -- Updated dependencies [1184192] -- Updated dependencies [a2a9747] -- Updated dependencies [ac600e5] -- Updated dependencies [c1ef923] -- Updated dependencies [af5e292] -- Updated dependencies [7f96b10] -- Updated dependencies [167ec42] -- Updated dependencies [f1d4748] -- Updated dependencies [b1119ec] -- Updated dependencies [9f23d2b] -- Updated dependencies [578e025] -- Updated dependencies [af025ee] -- Updated dependencies [598c89a] -- Updated dependencies [b8b9af4] -- Updated dependencies [31676be] -- Updated dependencies [9ce096f] -- Updated dependencies [e05db88] -- Updated dependencies [5ffcc14] -- Updated dependencies [d971e51] -- Updated dependencies [97abb24] -- Updated dependencies [deb157a] -- Updated dependencies [d2ce342] -- Updated dependencies [9695da7] -- Updated dependencies [58b8346] -- Updated dependencies [dfc6975] -- Updated dependencies [3cf4de0] -- Updated dependencies [c9dc811] -- Updated dependencies [a0b9e91] -- Updated dependencies [99bd015] - - @object-ui/types@17.6.0 - - @object-ui/core@17.6.0 - -## 17.5.0 - -### Patch Changes - -- Updated dependencies [ee66e2e] -- Updated dependencies [ee26e65] -- Updated dependencies [5900ac5] -- Updated dependencies [f650253] -- Updated dependencies [3d9769a] -- Updated dependencies [3fc2971] -- Updated dependencies [aca27fa] -- Updated dependencies [dde7283] -- Updated dependencies [92876f0] -- Updated dependencies [f279deb] -- Updated dependencies [eb7f586] -- Updated dependencies [e901131] -- Updated dependencies [d9d3463] -- Updated dependencies [2a40f69] -- Updated dependencies [bec3e14] -- Updated dependencies [613b167] -- Updated dependencies [1f9b905] -- Updated dependencies [abb0f81] -- Updated dependencies [38ab505] -- Updated dependencies [7e4f0e5] -- Updated dependencies [92250d6] -- Updated dependencies [c1d939f] -- Updated dependencies [49ae9f4] -- Updated dependencies [2459a3e] -- Updated dependencies [d6aa172] -- Updated dependencies [fe52a04] -- Updated dependencies [bb68488] -- Updated dependencies [9461dd3] -- Updated dependencies [ab04728] - - @object-ui/core@17.5.0 - - @object-ui/types@17.5.0 - -## 17.4.0 - -### Patch Changes - -- Updated dependencies [6719877] -- Updated dependencies [56ff091] -- Updated dependencies [d229dfa] -- Updated dependencies [4bc6c23] -- Updated dependencies [c3b01a7] -- Updated dependencies [e06810e] -- Updated dependencies [ab3ad4f] -- Updated dependencies [c2fd122] -- Updated dependencies [48132f7] -- Updated dependencies [1d723e3] -- Updated dependencies [0109f54] -- Updated dependencies [7e5bb5d] -- Updated dependencies [fbc23e0] -- Updated dependencies [e6fdbdc] -- Updated dependencies [6bb454a] -- Updated dependencies [523be48] -- Updated dependencies [7e2b7e9] -- Updated dependencies [c1e1e6b] - - @object-ui/core@17.4.0 - - @object-ui/types@17.4.0 - -## 17.3.0 - -### Patch Changes - -- Updated dependencies [18cd432] -- Updated dependencies [d915c47] -- Updated dependencies [5781fb1] -- Updated dependencies [9e9e9a9] -- Updated dependencies [23018cc] -- Updated dependencies [d915c47] -- Updated dependencies [f44d872] -- Updated dependencies [509104a] -- Updated dependencies [a4cff5b] -- Updated dependencies [f833d3a] -- Updated dependencies [2a9513d] -- Updated dependencies [d22ae31] - - @object-ui/core@17.3.0 - - @object-ui/types@17.3.0 - -## 17.2.0 - -### Patch Changes - -- Updated dependencies [4ae0ac4] -- Updated dependencies [696e3c1] -- Updated dependencies [bca45cc] -- Updated dependencies [4bf612c] -- Updated dependencies [335041c] -- Updated dependencies [b414983] -- Updated dependencies [256f8cc] -- Updated dependencies [d9668a7] -- Updated dependencies [cb82705] -- Updated dependencies [f572849] -- Updated dependencies [d3584c6] -- Updated dependencies [a8ad6c0] -- Updated dependencies [444457c] -- Updated dependencies [850033c] -- Updated dependencies [022e4c3] -- Updated dependencies [009e25d] -- Updated dependencies [726b89c] - - @object-ui/types@17.2.0 - - @object-ui/core@17.2.0 - -## 17.1.0 - -### Patch Changes - -- Updated dependencies [62311b6] -- Updated dependencies [9e7349e] -- Updated dependencies [8864971] -- Updated dependencies [b41f401] -- Updated dependencies [19e9fa0] -- Updated dependencies [95b7214] -- Updated dependencies [7d9734d] -- Updated dependencies [6ae818e] -- Updated dependencies [746dd00] -- Updated dependencies [aebfa4f] -- Updated dependencies [38ca8be] -- Updated dependencies [4952edf] -- Updated dependencies [7f0252e] -- Updated dependencies [c4d7b20] -- Updated dependencies [7639a61] -- Updated dependencies [94e63ef] -- Updated dependencies [02aef0c] -- Updated dependencies [6f29aa5] -- Updated dependencies [c4db402] -- Updated dependencies [5319bf1] -- Updated dependencies [49e5671] -- Updated dependencies [b5b97e2] -- Updated dependencies [f59f2c1] -- Updated dependencies [4874117] -- Updated dependencies [ad0183a] -- Updated dependencies [ce08d55] -- Updated dependencies [aa1240a] -- Updated dependencies [2374a49] -- Updated dependencies [390c071] -- Updated dependencies [d10f526] -- Updated dependencies [2d5d594] -- Updated dependencies [ea7f477] -- Updated dependencies [7f23cd0] -- Updated dependencies [24e0e0a] -- Updated dependencies [3a6cf24] -- Updated dependencies [aa35561] -- Updated dependencies [03bd53b] -- Updated dependencies [3c1f321] -- Updated dependencies [a045a32] -- Updated dependencies [912496d] -- Updated dependencies [9867281] - - @object-ui/core@17.1.0 - - @object-ui/types@17.1.0 - -## 17.0.0 - -### Patch Changes - -- dc7a798: fix(plugin-grid,plugin-form,plugin-designer,cli,vscode-extension): type-check the last five unchecked packages, and fix the two runtime bugs that hid there (#2919) - - Closes the remaining `DEBT` entries from the #2911 sweep. Each package gains - `"type-check": "tsc --noEmit"` and loses its entry in - `scripts/check-type-check-coverage.mjs`; coverage goes 36 -> 41 of 45 and - outstanding errors 25 -> 5 (only #2916 `plugin-view` and #2918 `layout` remain). - - **Two of these were real bugs, not just type noise.** - - `@object-ui/cli` — `objectui validate` could never report a validation failure. - `ZodError.errors` was removed in Zod 4 (the repo is on 4.4.3), so `.errors` read - `undefined` and `.forEach` threw a `TypeError` that the enclosing `catch` - reported as `✗ Error reading or parsing schema file: Cannot read properties of -undefined` — swallowing the very errors the command exists to print. Now reads - `.issues`. Verified against the built CLI: an invalid schema now prints - `1. Invalid input / Code: invalid_union` and exits 1. - - `@object-ui/plugin-grid` — grouping a grid by a boolean column showed the raw - i18n key. `t('grid.booleanTrue', 'Yes')` asked for a key present in neither - `GRID_DEFAULT_TRANSLATIONS` nor any locale bundle, and passed the English - fallback as a bare second argument — which `createSafeTranslation`'s no-provider - translator reads as an _options object_, so the fallback never applied and the - header rendered the literal `grid.booleanTrue`. Switched to the `grid.yes` / - `grid.no` keys the boolean cell renderer (`ObjectGrid.tsx`) and - `BulkActionDialog` already use, with the fallback passed as `defaultValue`. - Covered by a new regression test, confirmed to fail against the old code. - - The rest are type-only corrections that preserve runtime behaviour exactly: - - - **plugin-grid** `importParsers.ts` — `scorePair`'s `score`/`reason` moved into - one `best` record. They were captured `let`s mutated only inside the `bump` - closure, which TypeScript's control-flow analysis does not track, so it still - believed `reason` was `'none'` at the type gate and flagged the comparisons as - non-overlapping (TS2367). The gate — which stops a text column being mapped - onto a number field — is unchanged; its two dedicated tests still pass. - - **plugin-form** — `SectionFieldsContext.fieldLabel` now requires `fallback`, - matching the `useSafeFieldLabel` producer in `@object-ui/i18n` (an omitted - fallback could not satisfy the `=> string` return, and all four call sites - already pass one). This one signature cleared six errors. - `MasterDetailFormSchema.recordId` widens to `string | number`, matching - `ObjectFormSchema` and the five envelopes that forward straight into it; - it is narrowed with `String()` only at the batch-transaction boundary, whose - `BatchTransactionOperation.id` is a string by protocol (the `isEdit` guard - already proves it non-null there). `deriveMasterDetail`'s column sort gets an - explicit `fillPriority` helper — `GridColumn.type` is optional, and a column - without one keeps sorting at priority 5 exactly as the old - `TYPE_FILL_PRIORITY[undefined] ?? 5` lookup put it. - - **plugin-designer** — unused `index` parameter prefixed `_`, matching the - `_entry` beside it. - - **cli** — a stale `@ts-expect-error` removed; `viteConfig` is typed `any`, so - the line it guarded had stopped erroring. - - **vscode-extension** (`object-ui`) — migrated off `moduleResolution: "node"`, - which is deprecated and stops working in TypeScript 7, to `node16` paired with - `module: "node16"` (the package has no `"type": "module"`, so node16 resolves - it as the CommonJS that tsup emits, and it gains the `exports`-map awareness - node10 lacks). Its error count was under-reported as 1: that TS5107 config - error masked four more. The package uses `console`/`Buffer` but sets - `lib: ["ES2020"]` with no DOM and never declared `@types/node` — added, with an - explicit `types: ["node", "vscode"]`. - - Also: `plugin-grid`, `plugin-form` and `plugin-designer` gain the `baseUrl` + - `paths` override their type-checked plugin peers already carry, and `cli` an - empty `paths`. Without it the inherited root `paths` point `@object-ui/*` at - sibling `src/`, which is outside each project's `rootDir` and produces the ~104 - spurious TS6059 errors noted in #2915; workspace deps instead resolve through - node_modules to built `.d.ts`, which `type-check`'s `dependsOn: ["^build"]` - guarantees exist. - - Verified the gate genuinely covers all five rather than trusting the green: - injecting a type error into each package makes `pnpm type-check --filter ` - fail, which was impossible before this change. - -- Updated dependencies [1767124] -- Updated dependencies [8ecf5a6] -- Updated dependencies [7b35e4b] -- Updated dependencies [e16ed2d] -- Updated dependencies [f9bbddb] -- Updated dependencies [dfd3705] -- Updated dependencies [2735de6] -- Updated dependencies [6dee2cb] -- Updated dependencies [c7cff19] -- Updated dependencies [cd09a7b] -- Updated dependencies [f1abf0e] -- Updated dependencies [f05b84e] -- Updated dependencies [662bdf9] -- Updated dependencies [059a052] -- Updated dependencies [53642d4] -- Updated dependencies [8aae006] -- Updated dependencies [d147a13] - - @object-ui/types@17.0.0 - - @object-ui/core@17.0.0 - -## 16.1.0 - -### Patch Changes - -- Updated dependencies [1c8935a] -- Updated dependencies [8b8b744] -- Updated dependencies [7cf4051] -- Updated dependencies [2e7d7f0] -- Updated dependencies [94d4876] -- Updated dependencies [2b17339] -- Updated dependencies [31b77d4] -- Updated dependencies [6d4fbe6] -- Updated dependencies [0a3710b] -- Updated dependencies [62b9ab5] -- Updated dependencies [1629313] -- Updated dependencies [29c6040] -- Updated dependencies [faebac3] -- Updated dependencies [2331ac9] -- Updated dependencies [199fa83] -- Updated dependencies [eee4ded] - - @object-ui/core@16.1.0 - - @object-ui/types@16.1.0 - -## 16.0.0 - -### Patch Changes - -- Updated dependencies [210806a] -- Updated dependencies [b4ef588] -- Updated dependencies [5534535] -- Updated dependencies [9b8f978] - - @object-ui/types@16.0.0 - - @object-ui/core@16.0.0 - -## 15.0.0 - -### Patch Changes - -- @object-ui/types@15.0.0 -- @object-ui/core@15.0.0 - -## 14.1.0 - -### Patch Changes - -- Updated dependencies [0890fa7] -- Updated dependencies [2ded18c] -- Updated dependencies [e628d1f] -- Updated dependencies [5523fc4] -- Updated dependencies [887062c] -- Updated dependencies [9e2d58f] -- Updated dependencies [dea65f7] -- Updated dependencies [d5b1bc0] -- Updated dependencies [f0f10f5] - - @object-ui/core@14.1.0 - - @object-ui/types@14.1.0 - -## 14.0.0 - -### Patch Changes - -- Updated dependencies [443360a] -- Updated dependencies [86c69c3] -- Updated dependencies [05e56ca] -- Updated dependencies [6a74160] - - @object-ui/core@14.0.0 - - @object-ui/types@14.0.0 - -## 13.2.0 - -### Patch Changes - -- @object-ui/types@13.2.0 -- @object-ui/core@13.2.0 - -## 13.1.0 - -### Patch Changes - -- @object-ui/types@13.1.0 -- @object-ui/core@13.1.0 - -## 13.0.0 - -### Patch Changes - -- Updated dependencies [619097e] - - @object-ui/types@13.0.0 - - @object-ui/core@13.0.0 - -## 12.1.0 - -### Patch Changes - -- Updated dependencies [c31874d] - - @object-ui/types@12.1.0 - - @object-ui/core@12.1.0 - -## 12.0.0 - -### Patch Changes - -- Updated dependencies [226fde9] -- Updated dependencies [e4de456] - - @object-ui/types@12.0.0 - - @object-ui/core@12.0.0 - -## 11.5.0 - -### Patch Changes - -- Updated dependencies [9255686] -- Updated dependencies [1072701] - - @object-ui/types@11.5.0 - - @object-ui/core@11.5.0 - -## 11.4.0 - -### Patch Changes - -- Updated dependencies [8bf6295] -- Updated dependencies [1948c5b] -- Updated dependencies [c38d107] - - @object-ui/types@11.4.0 - - @object-ui/core@11.4.0 - -## 11.3.0 - -### Patch Changes - -- Updated dependencies [d23d6eb] - - @object-ui/core@11.3.0 - - @object-ui/types@11.3.0 - -## 11.2.0 - -### Patch Changes - -- Updated dependencies [9e7a986] -- Updated dependencies [1311749] - - @object-ui/core@11.2.0 - - @object-ui/types@11.2.0 - -## 11.1.0 - -### Patch Changes - -- @object-ui/types@11.1.0 -- @object-ui/core@11.1.0 - -## 7.3.0 - -### Patch Changes - -- @object-ui/types@7.3.0 -- @object-ui/core@7.3.0 - -## 7.2.0 - -### Patch Changes - -- Updated dependencies [d23db5c] - - @object-ui/types@7.2.0 - - @object-ui/core@7.2.0 - -## 7.1.0 - -### Patch Changes - -- Updated dependencies [677f7ed] -- Updated dependencies [08c47da] -- Updated dependencies [a71be60] -- Updated dependencies [cb03bc3] - - @object-ui/types@7.1.0 - - @object-ui/core@7.1.0 - -## 7.0.0 - -### Patch Changes - -- Updated dependencies [5976ba3] -- Updated dependencies [eaccefd] -- Updated dependencies [f7f325d] -- Updated dependencies [c12986e] -- Updated dependencies [71d7ce0] -- Updated dependencies [053c948] -- Updated dependencies [ddbe4a2] -- Updated dependencies [2d47e94] -- Updated dependencies [9049bbe] -- Updated dependencies [cb2fdb1] -- Updated dependencies [c3749eb] -- Updated dependencies [6cfa330] -- Updated dependencies [ad8ade6] -- Updated dependencies [d54346c] -- Updated dependencies [3870c20] -- Updated dependencies [b88c560] -- Updated dependencies [d16566f] -- Updated dependencies [1394e34] -- Updated dependencies [300d755] -- Updated dependencies [4eb9cb6] -- Updated dependencies [7c239fd] -- Updated dependencies [858ad94] -- Updated dependencies [2270239] -- Updated dependencies [8d1195d] - - @object-ui/core@7.0.0 - - @object-ui/types@7.0.0 - -## 6.2.3 - -### Patch Changes - -- @object-ui/types@6.2.3 -- @object-ui/core@6.2.3 - -## 6.2.2 - -### Patch Changes - -- @object-ui/types@6.2.2 -- @object-ui/core@6.2.2 - -## 6.2.1 - -### Patch Changes - -- @object-ui/types@6.2.1 -- @object-ui/core@6.2.1 - -## 6.2.0 - -### Patch Changes - -- @object-ui/types@6.2.0 -- @object-ui/core@6.2.0 - -## 6.1.0 - -### Patch Changes - -- Updated dependencies [991b62d] - - @object-ui/core@6.1.0 - - @object-ui/types@6.1.0 - -## 6.0.4 - -### Patch Changes - -- @object-ui/types@6.0.4 -- @object-ui/core@6.0.4 - -## 6.0.3 - -### Patch Changes - -- @object-ui/types@6.0.3 -- @object-ui/core@6.0.3 - -## 6.0.2 - -### Patch Changes - -- @object-ui/types@6.0.2 -- @object-ui/core@6.0.2 - -## 6.0.1 - -### Patch Changes - -- @object-ui/types@6.0.1 -- @object-ui/core@6.0.1 - -## 6.0.0 - -### Patch Changes - -- @object-ui/types@6.0.0 -- @object-ui/core@6.0.0 - -## 5.4.2 - -### Patch Changes - -- @object-ui/types@5.4.2 -- @object-ui/core@5.4.2 - -## 5.4.1 - -### Patch Changes - -- @object-ui/types@5.4.1 -- @object-ui/core@5.4.1 - -## 5.4.0 - -### Patch Changes - -- Updated dependencies [3a8c754] - - @object-ui/types@5.4.0 - - @object-ui/core@5.4.0 - -## 5.3.2 - -### Patch Changes - -- @object-ui/types@5.3.2 -- @object-ui/core@5.3.2 - -## 5.3.1 - -### Patch Changes - -- @object-ui/types@5.3.1 -- @object-ui/core@5.3.1 - -## 5.3.0 - -### Patch Changes - -- @object-ui/types@5.3.0 -- @object-ui/core@5.3.0 - -## 5.2.1 - -### Patch Changes - -- @object-ui/types@5.2.1 -- @object-ui/core@5.2.1 - -## 5.2.0 - -### Patch Changes - -- Updated dependencies [de0c5e6] -- Updated dependencies [9997cae] -- Updated dependencies [70b5570] -- Updated dependencies [d1442e3] - - @object-ui/types@5.2.0 - - @object-ui/core@5.2.0 - -## 5.1.1 - -### Patch Changes - -- @object-ui/types@5.1.1 -- @object-ui/core@5.1.1 - -## 5.1.0 - -### Patch Changes - -- Updated dependencies [cf30cc2] -- Updated dependencies [5b80cfd] - - @object-ui/types@5.1.0 - - @object-ui/core@5.1.0 - -## 5.0.2 - -### Patch Changes - -- @object-ui/types@5.0.2 -- @object-ui/core@5.0.2 - -## 5.0.1 - -### Patch Changes - -- @object-ui/types@5.0.1 -- @object-ui/core@5.0.1 - -## 5.0.0 - -### Patch Changes - -- Updated dependencies [7213027] - - @object-ui/types@5.0.0 - - @object-ui/core@5.0.0 - -## 4.8.0 - -### Patch Changes - -- @object-ui/types@4.8.0 -- @object-ui/core@4.8.0 - -## 4.7.0 - -### Patch Changes - -- @object-ui/types@4.7.0 -- @object-ui/core@4.7.0 - -## 4.6.0 - -### Patch Changes - -- @object-ui/types@4.6.0 -- @object-ui/core@4.6.0 - -## 4.5.0 - -### Patch Changes - -- Updated dependencies [ab5e281] - - @object-ui/types@4.5.0 - - @object-ui/core@4.5.0 - -## 4.4.0 - -### Patch Changes - -- @object-ui/types@4.4.0 -- @object-ui/core@4.4.0 - -## 4.3.1 - -### Patch Changes - -- @object-ui/types@4.3.1 -- @object-ui/core@4.3.1 - -## 4.3.0 - -### Patch Changes - -- @object-ui/types@4.3.0 -- @object-ui/core@4.3.0 - -## 4.2.1 - -### Patch Changes - -- @object-ui/types@4.2.1 -- @object-ui/core@4.2.1 - -## 4.2.0 - -### Patch Changes - -- @object-ui/types@4.2.0 -- @object-ui/core@4.2.0 - -## 4.1.0 - -### Patch Changes - -- @object-ui/types@4.1.0 -- @object-ui/core@4.1.0 - -## 4.0.12 - -### Patch Changes - -- @object-ui/types@4.0.12 -- @object-ui/core@4.0.12 - -## 4.0.11 - -### Patch Changes - -- @object-ui/types@4.0.11 -- @object-ui/core@4.0.11 - -## 4.0.10 - -### Patch Changes - -- @object-ui/types@4.0.10 -- @object-ui/core@4.0.10 - -## 4.0.9 - -### Patch Changes - -- @object-ui/types@4.0.9 -- @object-ui/core@4.0.9 - -## 4.0.8 - -### Patch Changes - -- @object-ui/types@4.0.8 -- @object-ui/core@4.0.8 - -## 4.0.7 - -### Patch Changes - -- Updated dependencies [7c9b85c] - - @object-ui/core@4.0.7 - - @object-ui/types@4.0.7 - -## 4.0.6 - -### Patch Changes - -- @object-ui/types@4.0.6 -- @object-ui/core@4.0.6 - -## 4.0.5 - -### Patch Changes - -- @object-ui/types@4.0.5 -- @object-ui/core@4.0.5 - -## 4.0.4 - -### Patch Changes - -- @object-ui/types@4.0.4 -- @object-ui/core@4.0.4 - -## 4.0.3 - -### Patch Changes - -- 4be43e2: **Page-mode record forms (`editMode: 'page'`).** New per-object metadata flag that opts a record's create/edit form into a dedicated full-screen route (`/apps/:appName/:objectName/new`, `/apps/:appName/:objectName/record/:recordId/edit`). Two new declarative actions `navigate_create` and `navigate_edit` open these routes from JSON action buttons. Default modal behavior is preserved for objects that do not set `editMode`. - - **`@object-ui/plugin-list` & `@object-ui/plugin-detail`: `ComponentRegistry` singleton fix.** Both plugins' Vite configs now mark all `@object-ui/*` packages as external so each plugin no longer bundles its own private copy of `@object-ui/core`. Cross-plugin component lookups now resolve correctly from the same singleton registry. `plugin-list` dist shrank from multi-MB to 67 kB (gzip 16 kB); `plugin-detail` to 124 kB (gzip 28 kB). - - **`@object-ui/app-shell` `CreateViewDialog` churn fix.** `existingSet` is now memoised on the joined string key of `existingLabels` rather than the raw array reference, preventing the name-suggest `useEffect` from re-firing on every parent render. - - **CI fixes.** `ReportViewer` conditional-formatting test now accepts both `rgb(...)` and hex color representations. `ObjectView` i18n mocks rewritten to mirror the real hook shapes (`useObjectTranslation`, `useObjectLabel`). - -- Updated dependencies [4be43e2] - - @object-ui/types@4.0.3 - - @object-ui/core@4.0.3 - -## 4.0.1 - -### Patch Changes - -- @object-ui/types@4.0.1 -- @object-ui/core@4.0.1 - -## 4.0.0 - -### Patch Changes - -- Updated dependencies - - @object-ui/types@4.0.0 - - @object-ui/core@4.0.0 - -## 3.4.0 - -### Patch Changes - -- Updated dependencies [f1ca238] -- Updated dependencies [de881ef] - - @object-ui/types@3.4.0 - - @object-ui/core@3.4.0 - -## 3.3.2 - -### Patch Changes - -- @object-ui/types@3.3.2 -- @object-ui/core@3.3.2 - -## 3.3.1 - -### Patch Changes - -- @object-ui/types@3.3.1 -- @object-ui/core@3.3.1 - -## 3.3.0 - -### Patch Changes - -- @object-ui/types@3.3.0 -- @object-ui/core@3.3.0 - -## 3.2.0 - -### Patch Changes - -- @object-ui/types@3.2.0 -- @object-ui/core@3.2.0 - -## 3.1.5 - -### Patch Changes - -- @object-ui/types@3.1.5 -- @object-ui/core@3.1.5 - -## 3.1.4 - -### Patch Changes - -- @object-ui/types@3.1.4 -- @object-ui/core@3.1.4 - -## 3.1.3 - -### Patch Changes - -- 1f7d8ac: Bug fixes and dependency upgrades - - fix: filter `id` field from RelatedList auto-generated columns - - fix: resolve TS2742 in drawer.tsx and sidebar.tsx for portable declaration files - - fix: replace OData string filters with object format in dataSource.find calls - - chore(deps): upgrade @objectstack/\* from ^3.2.5 to ^3.2.6 - - refactor: unify primary key field from `_id` to `id` per objectstack-ai/spec - - refactor: unify i18n service registration across server/dev/mock environments - - refactor: auth client to use official better-auth createAuthClient - - feat(components): migrate to unified radix-ui package + shadcn v4 RTL classes - - @object-ui/types@3.1.3 - - @object-ui/core@3.1.3 - -## 3.1.2 - -### Patch Changes - -- 3faaa3a: chore(deps): bump hono from 4.12.3 to 4.12.4 - - @object-ui/types@3.1.2 - - @object-ui/core@3.1.2 - -## 3.1.1 - -### Patch Changes - -- Updated dependencies - - @object-ui/types@3.1.1 - - @object-ui/core@3.1.1 - -## 3.0.3 - -### Patch Changes - -- @object-ui/types@3.0.3 -- @object-ui/core@3.0.3 - -## 3.0.2 - -### Patch Changes - -- @object-ui/types@3.0.2 -- @object-ui/core@3.0.2 - -## 3.0.1 - -### Patch Changes - -- @object-ui/types@3.0.1 -- @object-ui/core@3.0.1 - -## 3.0.0 - -### Minor Changes - -- 87979c3: Upgrade to @objectstack v3.0.0 and console bundle optimization - - Upgraded all @objectstack/\* packages from ^2.0.7 to ^3.0.0 - - Breaking change migrations: Hub → Cloud namespace, definePlugin removed, PaginatedResult.value → .records, PaginatedResult.count → .total, client.meta.getObject() → client.meta.getItem() - - Console bundle optimization: split monolithic 3.7 MB chunk into 17 granular cacheable chunks (95% main entry reduction) - - Added gzip + brotli pre-compression via vite-plugin-compression2 - - Lazy MSW loading for build:server (~150 KB gzip saved) - - Added bundle analysis with rollup-plugin-visualizer - -### Patch Changes - -- Updated dependencies [87979c3] - - @object-ui/types@3.0.0 - - @object-ui/core@3.0.0 - -## 2.0.0 - -### Major Changes - -- b859617: Release v1.0.0 — unify all package versions to 1.0.0 - -### Patch Changes - -- Updated dependencies [b859617] - - @object-ui/types@2.0.0 - - @object-ui/core@2.0.0 - -## 0.3.1 - -### Patch Changes - -- Updated dependencies - - @object-ui/types@0.3.1 - - @object-ui/core@0.3.1 - -## 0.3.0 - -### Minor Changes - -- Unified version across all packages to 0.3.0 for consistent versioning - -## 0.1.2 - -### Patch Changes - -- Updated dependencies - - @object-ui/types@0.3.0 - - @object-ui/core@0.2.2 - -## 0.1.1 - -### Patch Changes - -- Updated dependencies - - @object-ui/types@0.2.1 - - @object-ui/core@0.2.1 - -All notable changes to the Object UI VSCode extension will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -### Added - -- Initial release of Object UI VSCode extension -- Syntax highlighting for Object UI JSON schemas -- IntelliSense and auto-completion for component types and properties -- Live preview functionality with auto-refresh -- Schema validation with real-time error checking -- Code snippets for common patterns (forms, cards, layouts, etc.) -- Export to React component functionality -- Schema formatting command -- Template-based schema creation -- Hover documentation for properties and components -- Support for `.objectui.json` and `.oui.json` file extensions - -### Features - -- **Preview System**: Side-by-side live preview of schemas -- **Validation**: Real-time validation with helpful error messages -- **Snippets**: 12+ code snippets for rapid development -- **IntelliSense**: Context-aware auto-completion -- **Export**: One-click export to React components - -## [0.1.0] - TBD - -### Added - -- Initial beta release -- Core functionality for Object UI schema development -- Documentation and examples diff --git a/ui/packages/vscode-extension/DESIGN.md b/ui/packages/vscode-extension/DESIGN.md deleted file mode 100644 index ae9e2372a46..00000000000 --- a/ui/packages/vscode-extension/DESIGN.md +++ /dev/null @@ -1,385 +0,0 @@ -# Object UI VSCode Extension - Design Document - -## 概述 (Overview) - -Object UI VSCode扩展是一个全功能的开发工具,用于提升Object UI JSON schema的开发体验。本扩展提供语法高亮、智能提示、实时预览、验证和导出等功能。 - -The Object UI VSCode extension is a comprehensive development tool designed to enhance the development experience for Object UI JSON schemas. It provides syntax highlighting, IntelliSense, live preview, validation, and export capabilities. - -## 架构设计 (Architecture Design) - -### 核心组件 (Core Components) - -``` -┌─────────────────────────────────────────────────────────────┐ -│ VSCode Extension │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ┌────────────────┐ ┌──────────────┐ ┌────────────────┐ │ -│ │ Extension │ │ Providers │ │ Commands │ │ -│ │ Activation │ │ │ │ │ │ -│ └────────────────┘ └──────────────┘ └────────────────┘ │ -│ │ │ │ │ -│ │ │ │ │ -│ v v v │ -│ ┌────────────────────────────────────────────────────────┐ │ -│ │ Language Services │ │ -│ ├────────────────┬──────────────┬─────────────────────────┤ │ -│ │ Completion │ Hover │ Validation │ │ -│ │ Provider │ Provider │ Provider │ │ -│ └────────────────┴──────────────┴─────────────────────────┘ │ -│ │ -│ ┌────────────────────────────────────────────────────────┐ │ -│ │ Preview System │ │ -│ ├────────────────────────────────────────────────────────┤ │ -│ │ - Webview Panel Manager │ │ -│ │ - Schema Renderer (Simplified) │ │ -│ │ - Auto-refresh on Save │ │ -│ └────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌────────────────────────────────────────────────────────┐ │ -│ │ Utilities │ │ -│ ├────────────────────────────────────────────────────────┤ │ -│ │ - Schema Templates │ │ -│ │ - React Component Generator │ │ -│ │ - Formatter │ │ -│ └────────────────────────────────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────┘ -``` - -### 1. Extension Activation (扩展激活) - -**文件**: `src/extension.ts` - -扩展激活时注册所有providers、commands和事件监听器。 - -**Activation Events**: -- `onLanguage:json` - JSON文件打开时 -- `onLanguage:jsonc` - JSONC文件打开时 -- `workspaceContains:**/*.objectui.json` - 工作区包含Object UI schema时 -- `onCommand:*` - 命令执行时 - -### 2. Language Providers (语言服务提供者) - -#### CompletionProvider (自动完成) - -**文件**: `src/providers/CompletionProvider.ts` - -提供智能的代码补全建议: - -- **Component Types**: `div`, `card`, `button`, `input`, etc. -- **Properties**: 根据component type提供相关属性 -- **Common Properties**: `type`, `className`, `children`, etc. -- **Trigger Characters**: `"`, `:`, ` ` - -**实现特点**: -- 上下文感知:根据当前编辑的组件类型提供相关建议 -- 代码片段:使用VSCode的SnippetString提供模板 -- 文档:每个建议都带有详细说明 - -#### HoverProvider (悬停提示) - -**文件**: `src/providers/HoverProvider.ts` - -鼠标悬停时显示属性和组件的文档: - -- **Property Documentation**: 属性说明、类型、示例 -- **Component Documentation**: 组件介绍、用法示例 -- **Markdown格式**: 支持代码高亮和链接 - -#### SchemaValidator (Schema验证) - -**文件**: `src/providers/SchemaValidator.ts` - -实时验证Schema的正确性: - -- **JSON语法验证**: 检测JSON格式错误 -- **类型特定验证**: 验证inputType、variant等枚举值 -- **可访问性警告**: 提示添加label等无障碍属性 -- **Diagnostics Collection**: 使用VSCode诊断系统显示错误 - -### 3. Preview System (预览系统) - -**文件**: `src/providers/PreviewProvider.ts` - -提供实时预览功能: - -**功能特点**: -- **Side-by-side Preview**: 侧边预览,边写边看 -- **Auto-refresh**: 保存时自动刷新 -- **Error Handling**: 优雅的错误显示 -- **Simplified Renderer**: 内置简化的渲染器 - -**技术实现**: -- 使用VSCode Webview API -- 集成Tailwind CSS CDN -- 简化的JavaScript渲染逻辑(将来可替换为完整的@object-ui/react) - -### 4. Commands (命令) - -| Command | 功能 | 实现 | -|---------|------|------| -| `objectui.preview` | 打开预览 | 在当前列打开预览面板 | -| `objectui.previewToSide` | 侧边预览 | 在侧边打开预览面板 | -| `objectui.validate` | 验证Schema | 手动触发验证 | -| `objectui.format` | 格式化 | 格式化JSON缩进 | -| `objectui.exportToReact` | 导出React组件 | 生成React组件代码 | -| `objectui.newSchema` | 新建Schema | 从模板创建 | - -### 5. Snippets (代码片段) - -**文件**: `snippets/objectui.json` - -提供12+个常用模式的代码片段: - -- `oui-empty`: 空白模板 -- `oui-form`: 表单模板 -- `oui-card`: 卡片组件 -- `oui-input`: 输入框 -- `oui-button`: 按钮 -- `oui-grid`: 网格布局 -- `oui-dashboard`: 仪表板模板 -- 等等... - -**特点**: -- 使用VSCode snippet语法 -- 支持占位符和选择项 -- Tab键快速跳转 - -## 配置文件 (Configuration Files) - -### package.json - -扩展的清单文件,定义: -- 扩展元数据 -- 激活事件 -- 贡献点(commands、snippets、languages等) -- 配置项 -- 依赖 - -### language-configuration.json - -语言配置: -- 注释符号 -- 括号匹配 -- 自动闭合 - -### syntaxes/objectui.tmLanguage.json - -TextMate语法定义: -- 关键字高亮 -- 继承JSON语法 - -### schemas/objectui-schema.json - -JSON Schema定义: -- 用于验证Object UI schemas -- 提供IntelliSense支持 -- 定义所有可用属性和类型 - -## 构建和打包 (Build & Package) - -### TypeScript配置 - -**文件**: `tsconfig.json` - -- Target: ES2020 -- Module: CommonJS (VSCode要求) -- Strict mode -- Source maps - -### 构建工具 - -**文件**: `tsup.config.ts` - -使用tsup进行构建: -- 入口: `src/extension.ts` -- 输出: CommonJS格式 -- External: `vscode` (由VSCode提供) -- 打包: `@object-ui/types`, `@object-ui/core` - -### 打包流程 - -```bash -# 1. 构建 -pnpm build - -# 2. 打包成.vsix -pnpm package - -# 3. 安装测试 -code --install-extension object-ui-*.vsix - -# 4. 发布到市场 -pnpm publish -``` - -## 功能详解 (Feature Details) - -### 1. Live Preview (实时预览) - -**工作流程**: -``` -User edits schema → Save → FileSystemWatcher detects change -→ Parse JSON → Validate → Generate HTML → Update Webview -``` - -**关键代码**: -```typescript -panel.webview.html = this.getPreviewHtml(schema, schemaText); -``` - -**优点**: -- 即时反馈 -- 无需额外工具 -- 集成在编辑器中 - -### 2. IntelliSense (智能提示) - -**触发时机**: -- 输入 `"` 时提示属性名 -- 输入 `:` 后提示值 -- 输入空格时显示建议 - -**上下文感知**: -```typescript -const currentType = this.getCurrentType(document, position); -if (currentType === 'input') { - // 提供input专用的属性 - suggestions.push('inputType', 'placeholder', 'required'); -} -``` - -### 3. Schema Validation (验证) - -**验证级别**: -- **Error**: JSON语法错误 -- **Warning**: 无效的属性值 -- **Information**: 可访问性建议 - -**实时验证**: -- 打开文件时验证 -- 保存时验证 -- 可通过配置禁用 - -### 4. Export to React (导出React) - -**生成代码**: -```typescript -// No React import: under the automatic JSX runtime ("jsx": "react-jsx", -// what a new Vite or Next project is configured with) nothing here reads that -// identifier, so it compiles as an unused local. Add the import back only if -// this file is built with the classic "jsx": "react" transform. -import { SchemaRenderer, type SchemaRendererProps } from '@object-ui/react'; -// Importing the package registers every default renderer as a side effect — -// there is no separate registration call. -import '@object-ui/components'; - -// Typed as the schema SchemaRenderer takes, so each "type" below stays a literal -// and the compiler checks the schema against the node types it accepts. -const schema: SchemaRendererProps['schema'] = { /* 用户的schema */ }; - -export default function GeneratedComponent() { - return ; -} -``` - -**用途**: -- 快速原型转生产代码 -- 学习Object UI的React用法 -- 代码生成参考 - -## 未来规划 (Future Plans) - -### Phase 1: 增强功能 -- [ ] 完整的JSON解析和位置查找 -- [ ] 更智能的上下文感知补全 -- [ ] 集成真正的@object-ui/react渲染器 -- [ ] 支持YAML格式 - -### Phase 2: 高级特性 -- [ ] 可视化拖拽编辑器集成 -- [ ] Schema diff和版本比较 -- [ ] 多文件schema引用支持 -- [ ] 性能优化和缓存 - -### Phase 3: 生态集成 -- [ ] 与Object UI CLI集成 -- [ ] 与Object UI Designer联动 -- [ ] 主题市场 -- [ ] 组件库浏览器 - -## 开发指南 (Development Guide) - -### 本地开发 - -```bash -# 1. 克隆仓库 -git clone https://github.com/objectstack-ai/objectui.git -cd objectui/packages/vscode-extension - -# 2. 安装依赖 -pnpm install - -# 3. 启动开发模式 -pnpm dev - -# 4. 在VSCode中按F5启动调试 -``` - -### 调试技巧 - -1. **使用Extension Development Host**: - - 按F5启动新的VSCode窗口 - - 在新窗口中打开测试schema文件 - -2. **查看输出**: - - Output面板 → Object UI - - Developer Tools (Help → Toggle Developer Tools) - -3. **断点调试**: - - 在TypeScript源文件中设置断点 - - 调试器会自动映射到源代码 - -### 测试 - -```bash -# 运行测试 -pnpm test - -# 监听模式 -pnpm test:watch -``` - -## 发布流程 (Release Process) - -1. 更新版本号 (package.json) -2. 更新 CHANGELOG.md -3. 构建和测试 -4. 创建.vsix包 -5. 发布到VSCode Marketplace -6. 创建GitHub Release - -## 贡献指南 (Contributing) - -欢迎贡献!请遵循以下步骤: - -1. Fork仓库 -2. 创建feature分支 -3. 提交更改 -4. 创建Pull Request - -详见主仓库的[CONTRIBUTING.md](https://github.com/objectstack-ai/objectstack/blob/main/CONTRIBUTING.md) - -## 许可证 (License) - -MIT License - 详见[LICENSE](../../LICENSE) - ---- - -
- -**Built with ❤️ for the Object UI Community** - -
diff --git a/ui/packages/vscode-extension/ICON.md b/ui/packages/vscode-extension/ICON.md deleted file mode 100644 index 27529867b9d..00000000000 --- a/ui/packages/vscode-extension/ICON.md +++ /dev/null @@ -1,32 +0,0 @@ -# Extension Icon - -The `icon.svg` file is the extension's icon shown in the VSCode marketplace and extension manager. - -## Current Icon - -A gradient background (indigo → purple → pink) with a large "O" representing Object UI, and small rectangles suggesting UI components. - -## To Convert to PNG (for marketplace compatibility) - -If you need a PNG version for the marketplace: - -```bash -# Using ImageMagick -convert -background none -resize 128x128 icon.svg icon.png - -# Using rsvg-convert -rsvg-convert -w 128 -h 128 icon.svg > icon.png - -# Using Inkscape -inkscape icon.svg --export-type=png --export-filename=icon.png -w 128 -h 128 -``` - -Then update `package.json` to reference `icon.png` instead of `icon.svg`. - -## Design Guidelines - -- Size: 128x128 pixels -- Format: PNG or SVG -- Transparent background or solid color -- Simple, recognizable design -- Works well at small sizes diff --git a/ui/packages/vscode-extension/PUBLISHING.md b/ui/packages/vscode-extension/PUBLISHING.md deleted file mode 100644 index 8dd40b07efc..00000000000 --- a/ui/packages/vscode-extension/PUBLISHING.md +++ /dev/null @@ -1,270 +0,0 @@ -# Publishing the Object UI VSCode Extension - -This guide covers how to publish the extension to the Visual Studio Code Marketplace. - -## Prerequisites - -1. **Microsoft Account**: You need a Microsoft account to create a publisher -2. **Azure DevOps Organization**: Required for publishing -3. **Personal Access Token (PAT)**: For authentication - -## Setup - -### 1. Create a Publisher - -1. Go to [Visual Studio Marketplace Publisher Management](https://marketplace.visualstudio.com/manage) -2. Sign in with your Microsoft account -3. Click "Create Publisher" -4. Fill in the details: - - Publisher ID: `objectui` (must match `publisher` in package.json) - - Display name: Object UI - - Description: Official publisher for Object UI - -### 2. Get a Personal Access Token - -1. Go to [Azure DevOps](https://dev.azure.com/) -2. Click on your profile → Personal Access Tokens -3. Click "New Token" -4. Settings: - - Name: "VSCode Marketplace - Object UI" - - Organization: All accessible organizations - - Expiration: Custom (1 year recommended) - - Scopes: **Marketplace** → **Manage** -5. Copy the token (you won't see it again!) - -### 3. Configure vsce - -```bash -# Install vsce globally (if not already installed) -npm install -g @vscode/vsce - -# Login with your publisher -vsce login objectui -# Enter your Personal Access Token when prompted -``` - -## Build and Test - -### 1. Build the Extension - -```bash -cd packages/vscode-extension - -# Install dependencies -pnpm install - -# Build -pnpm build -``` - -### 2. Test Locally - -```bash -# Package the extension (creates .vsix file) -pnpm package - -# Install in VSCode for testing -code --install-extension object-ui-0.1.0.vsix - -# Test the extension -# 1. Open a .objectui.json file -# 2. Try auto-completion -# 3. Open preview -# 4. Test all commands -``` - -### 3. Validate - -```bash -# Verify the package -vsce ls - -# Should list all files that will be included -# Make sure no unnecessary files are included -``` - -## Publishing - -### First Release - -```bash -# From packages/vscode-extension directory - -# Publish to marketplace -pnpm publish - -# Or manually with vsce -vsce publish -``` - -This will: -1. Run `vscode:prepublish` script (builds the extension) -2. Package the extension -3. Upload to the marketplace -4. Make it available within a few minutes - -### Subsequent Releases - -1. **Update version** in `package.json`: - ```bash - # Patch version (0.1.0 → 0.1.1) - vsce publish patch - - # Minor version (0.1.0 → 0.2.0) - vsce publish minor - - # Major version (0.1.0 → 1.0.0) - vsce publish major - ``` - -2. **Update CHANGELOG.md** with changes - -3. **Commit changes**: - ```bash - git add . - git commit -m "Release v0.1.1" - git push - ``` - -4. **Create GitHub Release**: - - Go to GitHub releases - - Create new release - - Tag version: `vscode-extension-v0.1.1` - - Attach the `.vsix` file - - Document changes - -## Pre-release Versions - -For beta testing: - -```bash -# Publish as pre-release -vsce publish --pre-release -``` - -Users can opt-in to pre-release versions in VSCode. - -## Unpublishing - -**Warning**: This removes the extension from the marketplace. - -```bash -# Unpublish a specific version -vsce unpublish objectui.object-ui@0.1.0 - -# Unpublish all versions (careful!) -vsce unpublish objectui.object-ui -``` - -## Post-Publishing - -### 1. Verify on Marketplace - -- Visit: https://marketplace.visualstudio.com/items?itemName=objectui.object-ui -- Check that all information displays correctly -- Test installation from marketplace - -### 2. Update Repository - -Add marketplace badge to README: - -```markdown -[![VSCode Marketplace](https://img.shields.io/vscode-marketplace/v/objectui.object-ui.svg)](https://marketplace.visualstudio.com/items?itemName=objectui.object-ui) -``` - -### 3. Announce - -- Update main Object UI README -- Post on GitHub Discussions -- Share on social media -- Update documentation - -## Troubleshooting - -### Issue: "Publisher not found" - -**Solution**: Make sure the `publisher` field in package.json matches your publisher ID. - -### Issue: "Missing icon.png" - -**Solution**: Either: -1. Convert icon.svg to icon.png (see ICON.md) -2. Remove the `icon` field from package.json (not recommended) - -### Issue: "Package size too large" - -**Solution**: Check `.vscodeignore` to exclude unnecessary files: -- Source files (src/) -- Test files -- Configuration files (tsconfig.json, etc.) -- node_modules is already excluded by default - -### Issue: "Build fails during publish" - -**Solution**: Test the build locally first: -```bash -pnpm build -pnpm package -``` - -## Automated Publishing (CI/CD) - -For automated releases via GitHub Actions: - -```yaml -# .github/workflows/publish-vscode.yml -name: Publish VSCode Extension - -on: - push: - tags: - - 'vscode-extension-v*' - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: pnpm/action-setup@v2 - with: - version: 9 - - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'pnpm' - - - run: pnpm install - - - name: Publish to Marketplace - working-directory: packages/vscode-extension - run: pnpm publish - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} -``` - -Add `VSCE_PAT` secret to your GitHub repository settings. - -## Best Practices - -1. **Test thoroughly** before publishing -2. **Update CHANGELOG.md** with every release -3. **Use semantic versioning** (major.minor.patch) -4. **Keep icon simple** and recognizable at small sizes -5. **Write clear descriptions** in package.json -6. **Respond to user feedback** and issues promptly -7. **Maintain backward compatibility** when possible - -## Resources - -- [VSCode Extension Publishing Guide](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) -- [Extension Manifest Reference](https://code.visualstudio.com/api/references/extension-manifest) -- [Marketplace Publisher Portal](https://marketplace.visualstudio.com/manage) -- [vsce CLI Documentation](https://github.com/microsoft/vscode-vsce) - -## Support - -For issues related to publishing, contact: -- VSCode Marketplace Support: https://aka.ms/vsmarketplace-help -- Object UI Team: hello@objectui.org diff --git a/ui/packages/vscode-extension/README.md b/ui/packages/vscode-extension/README.md deleted file mode 100644 index d0a5bb696f6..00000000000 --- a/ui/packages/vscode-extension/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# Object UI VSCode Extension - -The official VSCode extension for [Object UI](https://www.objectui.org) - the universal schema-driven UI engine. - -## ✨ Features - -### 🎨 **Syntax Highlighting** -Beautiful syntax highlighting for Object UI JSON schemas with intelligent color coding for component types, properties, and values. - -### 🧠 **IntelliSense & Auto-completion** -- Smart auto-completion for component types -- Context-aware property suggestions -- Tailwind CSS class hints -- Snippet support for common patterns - -### 🔍 **Schema Validation** -- Real-time JSON validation -- Type-specific property validation -- Accessibility warnings -- Best practice recommendations - -### 👁️ **Live Preview** -- Instant visual preview of your schemas -- Side-by-side editing and preview -- Auto-refresh on save -- Error highlighting - -### 🚀 **Productivity Tools** -- Export schemas to React components -- Format schemas with proper indentation -- Create new schemas from templates -- Code snippets for rapid development - -## 📦 Installation - -### From VSCode Marketplace - -1. Open VSCode -2. Press `Ctrl+P` / `Cmd+P` -3. Type `ext install objectui.object-ui` -4. Press Enter - -### From Source - -```bash -# Clone the repository -git clone https://github.com/objectstack-ai/objectui.git -cd objectui/packages/vscode-extension - -# Install dependencies -pnpm install - -# Build the extension -pnpm build - -# Package the extension -pnpm package - -# Install the .vsix file in VSCode -code --install-extension object-ui-*.vsix -``` - -## 🚀 Quick Start - -1. **Create a new file** with extension `.objectui.json` or `.oui.json` -2. **Start typing** and enjoy IntelliSense suggestions -3. **Preview** by clicking the preview icon in the editor toolbar -4. **Export** to React when ready for production - -### Example Schema - -Create a file `app.objectui.json`: - -```json -{ - "type": "div", - "className": "p-6", - "children": { - "type": "card", - "title": "Hello Object UI", - "children": { - "type": "text", - "content": "This is a schema-driven UI!" - } - } -} -``` - -Press the preview button to see it live! - -## 📝 Snippets - -Type these prefixes and press `Tab` to insert code snippets: - -| Prefix | Description | -|--------|-------------| -| `oui-empty` | Empty schema template | -| `oui-form` | Complete form with inputs | -| `oui-card` | Card component | -| `oui-input` | Input field | -| `oui-textarea` | Textarea field | -| `oui-button` | Button component | -| `oui-text` | Text component | -| `oui-grid` | Grid layout | -| `oui-flex` | Flex layout | -| `oui-dashboard` | Dashboard template | -| `oui-container` | Container with max-width | -| `oui-separator` | Horizontal separator | - -## 🎯 Commands - -Access these commands via the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`): - -- **Object UI: Open Preview** - Open preview in current column -- **Object UI: Open Preview to the Side** - Open preview side-by-side -- **Object UI: Validate Schema** - Validate the current schema -- **Object UI: Format Schema** - Format with proper indentation -- **Object UI: Export to React Component** - Generate React component code -- **Object UI: Create New Schema** - Create from template - -## ⚙️ Configuration - -Customize the extension behavior in VSCode settings: - -```jsonc -{ - // Preview settings - "objectui.preview.port": 3000, - "objectui.preview.autoRefresh": true, - - // Validation settings - "objectui.validation.enabled": true, - - // Completion settings - "objectui.completion.enabled": true, - - // Formatting settings - "objectui.format.indentSize": 2 -} -``` - -## 🎨 File Associations - -The extension automatically activates for: - -- `*.objectui.json` - Dedicated Object UI schemas -- `*.oui.json` - Short form schemas -- `app.json` - Common schema filename - -## 🔧 Development - -### Setup - -```bash -# Install dependencies -pnpm install - -# Build the extension -pnpm build - -# Watch mode for development -pnpm dev -``` - -### Testing - -```bash -# Run tests -pnpm test - -# Run tests in watch mode -pnpm test:watch -``` - -### Packaging - -```bash -# Create .vsix package -pnpm package - -# Publish to marketplace (requires publisher account) -pnpm publish -``` - -## 📚 Documentation - -- [Object UI Documentation](https://www.objectui.org) -- [Schema Reference](https://www.objectui.org/docs/api/schema-reference) -- [Component Library](https://www.objectui.org/docs/components) -- [Examples](https://github.com/objectstack-ai/objectui/tree/main/examples) - -## 🤝 Contributing - -We welcome contributions! Please see our [Contributing Guide](https://github.com/objectstack-ai/objectstack/blob/main/CONTRIBUTING.md) for details. - -### Reporting Issues - -Found a bug? Have a feature request? [Open an issue](https://github.com/objectstack-ai/objectui/issues) on GitHub. - -## 📄 License - -MIT License - see [LICENSE](../../LICENSE) for details. - -## 🙏 Acknowledgments - -Built with: -- [VSCode Extension API](https://code.visualstudio.com/api) -- [Object UI](https://www.objectui.org) -- [Tailwind CSS](https://tailwindcss.com) - ---- - -
- -**Made with ❤️ by the [Object UI Team](https://github.com/objectstack-ai)** - -[Website](https://www.objectui.org) · [Documentation](https://www.objectui.org/docs) · [GitHub](https://github.com/objectstack-ai/objectui) - -
- -## Links - -- 📚 [Documentation](https://www.objectui.org/docs/utilities/vscode-extension) -- 📦 [npm package](https://www.npmjs.com/package/object-ui) -- 📝 [Changelog](./CHANGELOG.md) -- 🐛 [Report an issue](https://github.com/objectstack-ai/objectui/issues) -- 🤝 [Contributing Guide](https://github.com/objectstack-ai/objectstack/blob/main/CONTRIBUTING.md) -- 🗺️ [Roadmap](https://github.com/objectstack-ai/objectstack/blob/main/ROADMAP.md) - -## License - -MIT — see [LICENSE](https://github.com/objectstack-ai/objectui/blob/main/LICENSE). diff --git a/ui/packages/vscode-extension/icon.svg b/ui/packages/vscode-extension/icon.svg deleted file mode 100644 index 50368fe8b9f..00000000000 --- a/ui/packages/vscode-extension/icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - O - - - diff --git a/ui/packages/vscode-extension/language-configuration.json b/ui/packages/vscode-extension/language-configuration.json deleted file mode 100644 index 2d0b3acb222..00000000000 --- a/ui/packages/vscode-extension/language-configuration.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "comments": { - "lineComment": "//", - "blockComment": ["/*", "*/"] - }, - "brackets": [ - ["{", "}"], - ["[", "]"] - ], - "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "\"", "close": "\"" } - ], - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["\"", "\""] - ] -} diff --git a/ui/packages/vscode-extension/package.json b/ui/packages/vscode-extension/package.json deleted file mode 100644 index 442ce55a087..00000000000 --- a/ui/packages/vscode-extension/package.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "name": "object-ui", - "displayName": "Object UI", - "description": "VSCode extension for Object UI - Schema-driven UI development with IntelliSense, validation, and live preview", - "version": "18.2.0", - "publisher": "objectui", - "private": true, - "icon": "icon.svg", - "engines": { - "vscode": "^1.85.0" - }, - "categories": [ - "Programming Languages", - "Snippets", - "Formatters", - "Other" - ], - "keywords": [ - "object-ui", - "schema", - "json", - "ui", - "react", - "tailwind", - "objectui", - "sdui", - "schema-driven-ui", - "shadcn", - "objectstack", - "vscode-extension", - "editor", - "devtools", - "intellisense" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/objectstack-ai/objectstack.git", - "directory": "ui/packages/vscode-extension" - }, - "license": "MIT", - "main": "./dist/extension.js", - "activationEvents": [ - "onLanguage:json", - "onLanguage:jsonc", - "workspaceContains:**/*.objectui.json", - "onCommand:objectui.preview", - "onCommand:objectui.validate" - ], - "contributes": { - "languages": [ - { - "id": "objectui-json", - "aliases": [ - "Object UI Schema", - "objectui" - ], - "extensions": [ - ".objectui.json", - ".oui.json" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "objectui-json", - "scopeName": "source.json.objectui", - "path": "./syntaxes/objectui.tmLanguage.json" - } - ], - "commands": [ - { - "command": "objectui.preview", - "title": "Object UI: Open Preview", - "icon": "$(open-preview)" - }, - { - "command": "objectui.previewToSide", - "title": "Object UI: Open Preview to the Side", - "icon": "$(open-preview)" - }, - { - "command": "objectui.validate", - "title": "Object UI: Validate Schema" - }, - { - "command": "objectui.format", - "title": "Object UI: Format Schema" - }, - { - "command": "objectui.exportToReact", - "title": "Object UI: Export to React Component" - }, - { - "command": "objectui.newSchema", - "title": "Object UI: Create New Schema" - } - ], - "menus": { - "editor/title": [ - { - "command": "objectui.preview", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "navigation" - }, - { - "command": "objectui.previewToSide", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "navigation" - } - ], - "editor/context": [ - { - "command": "objectui.preview", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "objectui" - }, - { - "command": "objectui.validate", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "objectui" - }, - { - "command": "objectui.exportToReact", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "objectui" - } - ], - "explorer/context": [ - { - "command": "objectui.preview", - "when": "resourceExtname == .json && resourceFilename =~ /\\.objectui\\.json$|\\.oui\\.json$/", - "group": "objectui" - } - ] - }, - "snippets": [ - { - "language": "json", - "path": "./snippets/objectui.json" - }, - { - "language": "jsonc", - "path": "./snippets/objectui.json" - }, - { - "language": "objectui-json", - "path": "./snippets/objectui.json" - } - ], - "jsonValidation": [ - { - "fileMatch": "*.objectui.json", - "url": "./schemas/objectui-schema.json" - }, - { - "fileMatch": "*.oui.json", - "url": "./schemas/objectui-schema.json" - } - ], - "configuration": { - "title": "Object UI", - "properties": { - "objectui.preview.port": { - "type": "number", - "default": 3000, - "description": "Port for the preview server" - }, - "objectui.preview.autoRefresh": { - "type": "boolean", - "default": true, - "description": "Automatically refresh preview on file save" - }, - "objectui.validation.enabled": { - "type": "boolean", - "default": true, - "description": "Enable schema validation" - }, - "objectui.completion.enabled": { - "type": "boolean", - "default": true, - "description": "Enable auto-completion and IntelliSense" - }, - "objectui.format.indentSize": { - "type": "number", - "default": 2, - "description": "Number of spaces for indentation" - } - } - } - }, - "scripts": { - "vscode:prepublish": "pnpm run build", - "build": "tsup", - "type-check": "tsc --noEmit && tsc -p tsconfig.test.json", - "lint": "eslint .", - "dev": "tsup --watch", - "test": "vitest run --root ../.. packages/vscode-extension/", - "test:watch": "vitest --root ../.. packages/vscode-extension/", - "package": "vsce package", - "publish": "vsce publish" - }, - "devDependencies": { - "@types/node": "^26.6.5", - "@types/vscode": "^1.140.0", - "@vscode/vsce": "^3.9.2", - "tsup": "^8.5.1", - "typescript": "^6.0.3", - "vitest": "^4.1.10" - }, - "dependencies": { - "@object-ui/core": "workspace:*", - "@object-ui/types": "workspace:*" - }, - "author": "ObjectStack Team ", - "bugs": { - "url": "https://github.com/objectstack-ai/objectui/issues" - }, - "homepage": "https://www.objectui.org/docs/utilities/vscode-extension" -} diff --git a/ui/packages/vscode-extension/schemas/objectui-schema.json b/ui/packages/vscode-extension/schemas/objectui-schema.json deleted file mode 100644 index ad1c5046113..00000000000 --- a/ui/packages/vscode-extension/schemas/objectui-schema.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Object UI Schema", - "description": "JSON Schema for Object UI component schemas", - "type": "object", - "required": ["type"], - "properties": { - "type": { - "type": "string", - "description": "The component type to render", - "enum": [ - "div", - "text", - "card", - "button", - "input", - "textarea", - "select", - "checkbox", - "radio", - "separator", - "badge", - "alert", - "tabs", - "accordion", - "form" - ] - }, - "className": { - "type": "string", - "description": "Tailwind CSS classes for styling" - }, - "id": { - "type": "string", - "description": "Unique identifier for the component" - }, - "children": { - "description": "Child components or content", - "oneOf": [ - { - "$ref": "#" - }, - { - "type": "array", - "items": { - "$ref": "#" - } - }, - { - "type": "string" - } - ] - }, - "label": { - "type": "string", - "description": "Label text for form inputs and buttons" - }, - "placeholder": { - "type": "string", - "description": "Placeholder text for input fields" - }, - "content": { - "type": "string", - "description": "Text content for text components" - }, - "title": { - "type": "string", - "description": "Title text for components like cards" - }, - "description": { - "type": "string", - "description": "Description or subtitle text" - }, - "required": { - "type": "boolean", - "description": "Whether the input field is required" - }, - "disabled": { - "type": "boolean", - "description": "Whether the component is disabled" - }, - "variant": { - "type": "string", - "description": "Style variant", - "enum": [ - "default", - "destructive", - "outline", - "secondary", - "ghost", - "link" - ] - }, - "size": { - "type": "string", - "description": "Component size", - "enum": ["sm", "default", "lg"] - }, - "inputType": { - "type": "string", - "description": "HTML input type", - "enum": [ - "text", - "email", - "password", - "number", - "tel", - "url", - "search", - "date", - "time", - "datetime-local" - ] - }, - "rows": { - "type": "number", - "description": "Number of rows for textarea" - }, - "visible": { - "type": ["boolean", "string"], - "description": "Visibility condition" - } - }, - "additionalProperties": true -} diff --git a/ui/packages/vscode-extension/snippets/objectui.json b/ui/packages/vscode-extension/snippets/objectui.json deleted file mode 100644 index 34b745f1f2a..00000000000 --- a/ui/packages/vscode-extension/snippets/objectui.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "Object UI: Empty Schema": { - "prefix": "oui-empty", - "body": [ - "{", - " \"type\": \"${1:div}\",", - " \"className\": \"${2:p-4}\",", - " \"children\": {", - " $0", - " }", - "}" - ], - "description": "Empty Object UI schema" - }, - "Object UI: Form": { - "prefix": "oui-form", - "body": [ - "{", - " \"type\": \"div\",", - " \"className\": \"max-w-2xl mx-auto p-6\",", - " \"children\": {", - " \"type\": \"card\",", - " \"title\": \"${1:Form Title}\",", - " \"children\": {", - " \"type\": \"div\",", - " \"className\": \"space-y-4\",", - " \"children\": [", - " {", - " \"type\": \"input\",", - " \"label\": \"${2:Name}\",", - " \"placeholder\": \"${3:Enter your name}\",", - " \"required\": true", - " },", - " {", - " \"type\": \"button\",", - " \"label\": \"${4:Submit}\"", - " }", - " ]", - " }", - " }", - "}" - ], - "description": "Form template" - }, - "Object UI: Card": { - "prefix": "oui-card", - "body": [ - "{", - " \"type\": \"card\",", - " \"title\": \"${1:Card Title}\",", - " \"description\": \"${2:Card description}\",", - " \"className\": \"${3:shadow-lg}\",", - " \"children\": {", - " $0", - " }", - "}" - ], - "description": "Card component" - }, - "Object UI: Input": { - "prefix": "oui-input", - "body": [ - "{", - " \"type\": \"input\",", - " \"label\": \"${1:Label}\",", - " \"placeholder\": \"${2:Placeholder}\",", - " \"inputType\": \"${3|text,email,password,number,tel|}\",", - " \"required\": ${4|true,false|}", - "}" - ], - "description": "Input field" - }, - "Object UI: Textarea": { - "prefix": "oui-textarea", - "body": [ - "{", - " \"type\": \"textarea\",", - " \"label\": \"${1:Label}\",", - " \"placeholder\": \"${2:Placeholder}\",", - " \"rows\": ${3:4}", - "}" - ], - "description": "Textarea field" - }, - "Object UI: Button": { - "prefix": "oui-button", - "body": [ - "{", - " \"type\": \"button\",", - " \"label\": \"${1:Button Text}\",", - " \"variant\": \"${2|default,destructive,outline,secondary,ghost,link|}\"", - "}" - ], - "description": "Button component" - }, - "Object UI: Text": { - "prefix": "oui-text", - "body": [ - "{", - " \"type\": \"text\",", - " \"content\": \"${1:Text content}\",", - " \"className\": \"${2:text-base}\"", - "}" - ], - "description": "Text component" - }, - "Object UI: Grid Layout": { - "prefix": "oui-grid", - "body": [ - "{", - " \"type\": \"div\",", - " \"className\": \"grid gap-${1:4} md:grid-cols-${2:2} lg:grid-cols-${3:3}\",", - " \"children\": [", - " $0", - " ]", - "}" - ], - "description": "Grid layout" - }, - "Object UI: Dashboard": { - "prefix": "oui-dashboard", - "body": [ - "{", - " \"type\": \"div\",", - " \"className\": \"min-h-screen p-6\",", - " \"children\": [", - " {", - " \"type\": \"div\",", - " \"className\": \"mb-6\",", - " \"children\": {", - " \"type\": \"text\",", - " \"content\": \"${1:Dashboard}\",", - " \"className\": \"text-3xl font-bold\"", - " }", - " },", - " {", - " \"type\": \"div\",", - " \"className\": \"grid gap-4 md:grid-cols-3\",", - " \"children\": [", - " {", - " \"type\": \"card\",", - " \"title\": \"${2:Metric 1}\",", - " \"children\": {", - " \"type\": \"text\",", - " \"content\": \"${3:1,234}\",", - " \"className\": \"text-2xl font-bold\"", - " }", - " }", - " ]", - " }", - " ]", - "}" - ], - "description": "Dashboard template" - }, - "Object UI: Separator": { - "prefix": "oui-separator", - "body": [ - "{", - " \"type\": \"separator\",", - " \"className\": \"${1:my-4}\"", - "}" - ], - "description": "Horizontal separator" - }, - "Object UI: Container": { - "prefix": "oui-container", - "body": [ - "{", - " \"type\": \"div\",", - " \"className\": \"${1|container mx-auto,max-w-2xl mx-auto,max-w-4xl mx-auto,max-w-6xl mx-auto|} ${2:p-6}\",", - " \"children\": [", - " $0", - " ]", - "}" - ], - "description": "Container with max-width" - }, - "Object UI: Flex Layout": { - "prefix": "oui-flex", - "body": [ - "{", - " \"type\": \"div\",", - " \"className\": \"flex ${1|flex-row,flex-col|} ${2|items-center,items-start,items-end|} ${3|justify-between,justify-center,justify-start,justify-end|} gap-${4:4}\",", - " \"children\": [", - " $0", - " ]", - "}" - ], - "description": "Flex layout" - } -} diff --git a/ui/packages/vscode-extension/src/__tests__/body-dialect-children-arm-7181.test.ts b/ui/packages/vscode-extension/src/__tests__/body-dialect-children-arm-7181.test.ts deleted file mode 100644 index ef9a516c2f5..00000000000 --- a/ui/packages/vscode-extension/src/__tests__/body-dialect-children-arm-7181.test.ts +++ /dev/null @@ -1,547 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * objectui#7181 — the two extension-host readers honour `children`, the - * spelling the rest of the platform declares. - * - * ⚠️ INVERTED BY objectui#6771, AND THE INVERSION IS THE POINT — read this before - * reading a red in this file as a regression. - * - * objectui#7181 added the `children` arm and deliberately KEPT `body`, so this - * file is TWO-SIDED: every case below pins the live spelling AND the retired one. - * objectui#6771's ruling then ordered the second arm dropped — verbatim, "the - * wider `children || body` readers drop the `body` arm in the same change" — and - * the two sources this file pins deferred that drop TO THAT CARD BY NUMBER, in - * their own words: `SchemaValidator.ts` "The `body` arm is deliberately KEPT: - * dropping it is objectui#6771 step 2, not this change", and `PreviewProvider.ts` - * "The body arm stays; removing it is objectui#6771 step 2, not this change." - * ⇒ the `body` legs were recording a PRE-RETIREMENT state, not guarding a live - * contract, so they are inverted rather than deleted. - * - * ⭐ AND THE REFUSAL MUST NOT GO QUIET — which took two goes to get right, so the - * correction is recorded rather than smoothed over. - * - * The first answer to that objection cited the BUILT CLI: same document both - * spellings, `body` exits 1 with `Unrecognized key(s) on this node: body. Did you - * mean body → children?` at `Path: body`, `children` exits 0. That reading is - * TRUE and it is about the WRONG TIER. It measures `@object-ui/types`' zod mirror - * through `@object-ui/cli`. ⛔ This file pins neither: the extension host imports - * no zod, builds no manifest, and its own JSON schema sets - * `additionalProperties: true` (`schemas/objectui-schema.json`). ⇒ dropping the - * `body` arm here, on its own, took a document that drew one diagnostic down to - * ZERO — a refusal genuinely going quiet, in the one tool whose job is teaching - * the format. - * - * So the arm did not just drop. `SchemaValidator` answers the retired key BY - * NAME, and the leg below is a POSITIVE assertion about that answer rather than - * an assertion that nothing happens. ⚠️ A measurement taken on one tier is not - * evidence about another, however true it is — that is the whole of the lesson - * here, and it is why the leg names the message it expects. - * - * ⛔ Every inverted leg keeps its ABSOLUTE numbers rather than comparing the two - * spellings to each other. ⚠️ That is NOT the same as "a reader that broke - * ENTIRELY satisfies neither half", which this header claimed until ablation - * falsified it. What the legs do and do not catch is set out under "What these - * pins actually catch" below, measured in both directions — and that reading, - * not the symmetry, is why the numbers are spelled out. - * - * ## The defect these pins were built for - * - * `children` is declared on four faces: the TypeScript declaration and the zod - * mirror in `@object-ui/types`, `validateSchema` in `@object-ui/core` (which - * READ `schema.children || schema.body`, children FIRST, until objectui#6771 - * dropped that second arm — the past tense is load-bearing, because a reader - * replaying this sentence against `@object-ui/core` today finds one spelling), - * and the manifest - * tier's `BASE_PROPS` in `@objectstack/sdui-parser` (which carries `children` and - * does NOT carry `body`). Both readers in this package guarded their child-list - * recursion on `schema.body` ALONE. - * - * So an author who wrote the declared spelling got, from the tool that is - * supposed to be teaching them the format: - * - * - a VS Code preview that rendered the node EMPTY — no error, no diagnostic, - * just a blank card or container; and - * - every child silently skipped by the validator, so a child missing its - * required `type` drew no warning at all. - * - * Both failures are SILENT, which is the worst direction for a metadata tool: - * the author's file is fine, the platform blesses it, and the tooling reports - * nothing while showing them nothing. - * - * ## Why these run the SHIPPED source instead of importing the modules - * - * Two different reasons, one per reader, and both are the same reason the - * sibling `export-to-react-*` pins give: - * - * - `PreviewProvider`'s renderer is not a module at all. It lives as JS text - * inside a TEMPLATE LITERAL that becomes the webview's inline script, so - * this package's `tsc --noEmit` sees one string and nothing type-checks or - * executes it. Extracting and running that text is the only way to observe - * the code the user's preview actually runs — and it means the pin is on - * the SHIPPED text, not on a copy of it that can drift. - * - `SchemaValidator` imports `vscode`, which has no runtime module outside - * the extension host and no alias in this repo's vitest config. It is - * transpiled here and executed against a stub of the seven `vscode` members - * it touches, so the pin exercises the real recursion rather than asserting - * on source text. - * - * ⚠️ Source-text assertions were deliberately NOT used for either. An assertion - * that the string `schema.children` appears would pass against a `children` arm - * that is present but unreachable, which is precisely the failure being pinned. - * - * ## The `body` arm is GONE — and each pin's second half now says so - * - * ⚠️ INVERTED, and the old text is quoted rather than dropped so the reversal is - * legible: this section read "the `body` arm is expected to keep working … - * Removing the `body` arm is objectui#6771 step 2, not this change". This IS - * that change. The sentence is therefore reversed, not deleted — a - * `body`-spelled document that renders or validates as it did before is now the - * regression, and these pins are what catch it. - * - * ## ⭐ What these pins actually catch — MEASURED, in both directions - * - * ⚠️ This section replaces three sentences that were WRONG. They said that each - * pin still asserts BOTH spellings, that the `body` leg carries zero beside its - * twin, and that a reader which broke entirely satisfies neither half. The first - * two are contradicted by this file's own contents; the third by ablation. ⛔ The - * pins were NOT widened to rescue the prose — the prose was re-derived from what - * the pins already do. - * - * ⭐ Not every pin is two-sided. Of the EIGHT behavioural pins, THREE assert both - * spellings — `card`, the generic container (`div`) and the bare-node arity. - * THREE assert `children` alone: nested descent, the validator's `children` - * recursion, and the well-formed-tree pin, whose `body` half objectui#6771 - * DELETED as non-discriminating (its own comment says so). TWO assert `body` - * alone: the diagnostic-by-name pin and the `record:alert` carve-out. - * - * ⭐ Nor do the `body` legs carry the same number. `card`'s asserts ONE, not - * zero, because the title element survives when the child list does not. `div`'s - * and the bare node's assert zero. That difference turns out to be the whole of - * what follows. - * - * Two ablations on `PreviewProvider.ts`, each mutated ON DISK and restored to the - * HEAD blob: - * - * COLLAPSE — an early `return element;` after `document.createElement`, so - * nothing is appended under EITHER spelling. Every `children` leg reds, and so - * does `card`'s `body` leg, because 0 is not the 1 it asserts. ⚠️ But `div`'s - * and the bare node's `body` legs are SATISFIED: a reader that renders nothing - * produces exactly the zero they demand. - * - * RESURRECTION — `schema.children || schema.body` restored in both branches. - * Every `children` leg holds, and EXACTLY the three `body` legs red. - * - * ⇒ THE READING: a zero-valued `body` leg catches the retired arm COMING BACK, - * ⛔ not the reader falling over. What catches a collapse is the `children` leg - * beside it — which is why the pair is kept together even though the two halves - * answer different questions. ⭐ And `card`'s `body` leg, alone among the three, - * reds in BOTH directions, because it asserts a NON-ZERO absolute. Where the - * shape affords a non-zero number, that is the leg worth having. - * - * ⭐ For the validator the `body` leg is POSITIVE rather than silent — it asserts - * the diagnostic that NAMES `children` — because dropping the arm without that - * assertion took this host from one diagnostic to zero, the correction recorded - * at the top of this header. That too is measured, on `SchemaValidator.ts`: - * - * SILENCE — the retirement push gated off. The diagnostic-by-name pin reds, - * AND so does the carve-out pin's twin leg, which exists to prove the carve-out - * is a carve-out rather than a validator that stopped working. - * - * RESURRECTION — the recursion given its `body` arm back. The "does not descend - * it" leg reds, on the skipped child's own diagnostic surfacing. - * - * ⇒ the validator's two `body` legs DO catch the refusal going quiet, which the - * preview's zero-valued legs cannot do for the preview. ⛔ Do not carry either - * reading over to the other reader: they were measured separately and they - * differ. - * - * ⛔ One exception, and it has its own leg: a node type that declares its own - * `body` input is not writing the retired spelling. `record:alert` is the single - * such registration in the tree, it is carved out of the diagnostic, and the leg - * that pins the carve-out asserts both points — `record:alert` silent, `card` - * still warned. - */ - -import { readFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import ts from 'typescript'; -import { describe, expect, it } from 'vitest'; - -const HERE = dirname(fileURLToPath(import.meta.url)); - -const PREVIEW_SOURCE = readFileSync( - resolve(HERE, '../providers/PreviewProvider.ts'), - 'utf8' -); -const VALIDATOR_SOURCE = readFileSync( - resolve(HERE, '../providers/SchemaValidator.ts'), - 'utf8' -); - -/* ------------------------------------------------------------------ * - * Reader 1 — the preview's shipped inline renderer - * ------------------------------------------------------------------ */ - -interface StubElement { - tag: string; - className: string; - textContent: string; - rows: number; - type: string; - placeholder: string; - children: StubElement[]; - appendChild(child: StubElement): void; -} - -function createStubElement(tag: string): StubElement { - return { - tag, - className: '', - textContent: '', - rows: 0, - type: '', - placeholder: '', - children: [], - appendChild(child: StubElement) { - this.children.push(child); - }, - }; -} - -/** Every element below the one returned, at any depth. */ -function countDescendants(element: StubElement): number { - return element.children.reduce( - (total, child) => total + 1 + countDescendants(child), - 0 - ); -} - -type RendererFn = (schema: unknown) => StubElement; - -/** - * Lift `createElementFromSchema` out of the webview HTML template and make it - * callable. The anchors are asserted rather than assumed: if either moves, this - * fails loudly instead of silently pinning nothing. - */ -function loadShippedPreviewRenderer(): RendererFn { - const start = PREVIEW_SOURCE.indexOf('function createElementFromSchema'); - expect( - start, - 'anchor "function createElementFromSchema" not found in PreviewProvider.ts — ' + - 'the renderer moved and this pin is measuring nothing' - ).toBeGreaterThan(-1); - - const end = PREVIEW_SOURCE.indexOf('// Render the schema', start); - expect( - end, - 'anchor "// Render the schema" not found after the renderer in PreviewProvider.ts' - ).toBeGreaterThan(start); - - // The renderer is written inside a template literal, so its backticks and - // interpolations are escaped in the TypeScript source. Undo exactly that. - const source = PREVIEW_SOURCE.slice(start, end) - .replace(/\\`/g, '`') - .replace(/\\\$\{/g, '${') - .replace(/\\\\/g, '\\'); - - const document = { createElement: createStubElement }; - return new Function( - 'document', - `${source}\nreturn createElementFromSchema;` - )(document) as RendererFn; -} - -describe('the VS Code preview renders `children` — and, since objectui#6771, only `children`', () => { - const render = loadShippedPreviewRenderer(); - const child = { type: 'text', content: 'Hello' }; - - it('renders a `card` node\'s `children`, and draws nothing for the retired `body`', () => { - const viaBody = countDescendants( - render({ type: 'card', title: 'T', body: [child] }) - ); - const viaChildren = countDescendants( - render({ type: 'card', title: 'T', children: [child] }) - ); - - // Both halves ABSOLUTE, exactly as before the inversion: the title element - // plus the one rendered child under the live spelling, and the title ALONE - // under the retired one. A renderer that dropped both could satisfy neither, - // which is why the numbers are spelled out rather than compared. - // - // ⭐ AND THIS PIN IS THE EXCEPTION — measured, see "What these pins actually - // catch". Because the title survives, this `body` leg asserts ONE rather than - // zero, so it reds under BOTH ablations: the collapse (0, not 1) and the - // resurrection (2, not 1). ⛔ The sibling `div` and bare-node `body` legs do - // NOT share that reach — their zero is satisfied by a reader that renders - // nothing — so this sentence is about THIS pin and ⛔ does not generalise. - expect(viaChildren).toBe(2); - expect(viaBody).toBe(1); - }); - - it('renders a generic container node\'s `children`, and nothing for the retired `body`', () => { - const viaBody = countDescendants(render({ type: 'div', body: [child] })); - const viaChildren = countDescendants( - render({ type: 'div', children: [child] }) - ); - - // ⚠️ The reach of these two legs is NOT the same, and the difference is - // measured. `viaChildren` is what catches a renderer that stopped appending: - // under the collapse ablation it reds. `viaBody` does NOT — a renderer that - // renders nothing produces the 0 asserted here and the leg passes. What it - // catches is the retired arm being RESURRECTED, which reds it at 1. ⛔ Read - // it as a collapse guard and you are reading a guard that is not there. - expect(viaChildren).toBe(1); - expect(viaBody).toBe(0); - }); - - it('renders nested `children` all the way down', () => { - const tree = { - type: 'div', - children: [{ type: 'card', title: 'T', children: [child] }], - }; - // div -> card -> (title, text) - expect(countDescendants(render(tree))).toBe(3); - }); - - it('still honours a single non-array child node — under the one spelling left', () => { - // The bare-node ARITY is what this case is about and it is untouched by the - // retirement; only which key carries it moved. - // - // ⚠️ Same asymmetry as the `div` pin above, same measurement: the `children` - // leg catches a collapse, the `body` leg catches a resurrection and ⛔ not a - // collapse — its 0 is satisfied by a reader that renders nothing at all. - expect(countDescendants(render({ type: 'div', children: child }))).toBe(1); - expect(countDescendants(render({ type: 'div', body: child }))).toBe(0); - }); -}); - -/* ------------------------------------------------------------------ * - * Reader 2 — the extension's schema validator - * ------------------------------------------------------------------ */ - -interface CapturedDiagnostic { - message: string; -} - -/** - * Transpile and execute `SchemaValidator.ts` against a stub of the `vscode` - * members it touches, returning the diagnostics it publishes for `json`. - */ -function validateWithShippedValidator(schema: unknown): CapturedDiagnostic[] { - const published: CapturedDiagnostic[] = []; - - const vscodeStub = { - languages: { - createDiagnosticCollection: () => ({ - set: (_uri: unknown, diagnostics: CapturedDiagnostic[]) => { - published.splice(0, published.length, ...diagnostics); - }, - clear: () => undefined, - dispose: () => undefined, - }), - }, - window: { - setStatusBarMessage: () => undefined, - showErrorMessage: () => undefined, - showInformationMessage: () => undefined, - }, - // `Diagnostic` is captured by message only; the range is not under test. - Diagnostic: class { - constructor( - public range: unknown, - public message: string, - public severity?: unknown - ) {} - }, - Range: class { - constructor(...args: unknown[]) { - this.args = args; - } - args: unknown[]; - translate() { - return this; - } - }, - DiagnosticSeverity: { Error: 0, Warning: 1, Information: 2, Hint: 3 }, - }; - - const transpiled = ts.transpileModule(VALIDATOR_SOURCE, { - compilerOptions: { - module: ts.ModuleKind.CommonJS, - target: ts.ScriptTarget.ES2020, - }, - }).outputText; - - const moduleShim: { exports: Record } = { exports: {} }; - new Function( - 'require', - 'module', - 'exports', - transpiled - )( - (specifier: string) => { - if (specifier === 'vscode') return vscodeStub; - throw new Error(`unexpected require("${specifier}") in SchemaValidator`); - }, - moduleShim, - moduleShim.exports - ); - - const SchemaValidatorClass = moduleShim.exports.SchemaValidator as new () => { - validateDocument(document: unknown): Promise; - }; - - const text = JSON.stringify(schema, null, 2); - const validator = new SchemaValidatorClass(); - // `validateDocument` is synchronous in everything it does before publishing. - void validator.validateDocument({ - getText: () => text, - positionAt: () => ({ translate: () => ({}) }), - uri: { toString: () => 'stub://doc.objectui.json' }, - }); - - return published; -} - -describe('the VS Code validator recurses into `children` — and, since objectui#6771, only `children`', () => { - // A child missing its required `type` is the observable: the validator warns - // about it ONLY if the recursion actually reached that child. - const untypedChild = { className: 'p-4' }; - - it('reaches a child spelled `children` and reports its missing `type`', () => { - const diagnostics = validateWithShippedValidator({ - type: 'card', - children: [untypedChild], - }); - - expect(diagnostics.map((d) => d.message)).toContain( - 'Missing required property "type"' - ); - }); - - it('ANSWERS a child list spelled `body` by name, and does not descend it', () => { - // ⛔ INVERTED, NOT DELETED, and ⛔ not weakened into a non-assertion. Both - // halves are positive: the retired key draws a diagnostic that NAMES the - // replacement, and the recursion does not walk into it (so the child's own - // problem is not reported at an address the document does not contain). - // - // ⚠️ The first half is the one that matters, and it is here because dropping - // the arm WITHOUT it took this host from one diagnostic to zero — see the - // header. A `not.toContain` alone would have been satisfied by exactly that - // silence. - const diagnostics = validateWithShippedValidator({ - type: 'card', - body: [untypedChild], - }); - - expect( - diagnostics.some( - (d) => d.message.includes('"body"') && d.message.includes('"children"') - ), - 'the retired spelling drew no diagnostic naming its replacement' - ).toBe(true); - expect(diagnostics.map((d) => d.message)).not.toContain( - 'Missing required property "type"' - ); - }); - - it('does NOT warn on a node type that declares its own `body` input', () => { - // ⭐ THE PIN THE CARVE-OUT DID NOT HAVE. `TYPES_DECLARING_OWN_BODY` was added - // to close a false positive, published in the changeset as behaviour of a - // released package, and then nothing could fail on it: emptying the set to - // `new Set([])` left this file passing every leg. A behaviour a test cannot - // break is a behaviour nobody is holding. - // - // `record:alert` is the real subject — the one registration in the tree that - // declares an input named `body`, whose value is an inline translation map - // rather than a child list. Warning about it would be the false diagnostic - // objectui#6771 exists to remove, reintroduced one host over. - const carvedOut = validateWithShippedValidator({ - type: 'record:alert', - body: 'Updated the deal stage to Negotiation.', - }); - expect( - carvedOut.some((d) => d.message.includes('"body"')), - '`record:alert` drew a retirement warning for its own declared `body`' - ).toBe(false); - - // THE TWIN, and it is what makes the line above a reading rather than a - // validator that stopped working: the same key on a type that does NOT - // declare it still draws the warning, naming the replacement. - const notCarvedOut = validateWithShippedValidator({ - type: 'card', - body: 'Updated the deal stage to Negotiation.', - }); - expect( - notCarvedOut.some( - (d) => d.message.includes('"body"') && d.message.includes('"children"') - ), - 'the retirement warning stopped firing for types outside the carve-out' - ).toBe(true); - }); - - it('reports nothing for a well-formed tree under the live spelling', () => { - // The `body` half of this pair was never discriminating — a well-formed tree - // draws no diagnostic whether the recursion walks it or skips it — so it is - // dropped rather than inverted into an assertion that cannot fail. - const typedChild = { type: 'text', content: 'Hello' }; - - expect( - validateWithShippedValidator({ type: 'card', children: [typedChild] }) - ).toHaveLength(0); - }); -}); - -/* ------------------------------------------------------------------ * - * The two spellings of one constant * - * ------------------------------------------------------------------ */ - -/** - * `SchemaValidator.ts` says of its local `RETIRED_CHILD_LIST_KEY` that this file - * "pins the two together" with `sdui-parser`'s export. That sentence was written - * before the pin existed — a claim about a check that was not there, which is the - * class this card keeps meeting. This block is the check. - * - * ⛔ Read off SOURCE TEXT, not by importing: this package ships to the extension - * host with no `@object-ui/*` runtime dependency, and importing `sdui-parser` - * here to satisfy a pin would put a dependency in the tree that the product does - * not have. Both literals are read from disk instead, rooted at THIS FILE the way - * `check-test-path-roots.mjs` requires. - */ -describe('the two spellings of the retired key cannot drift (objectui#6771)', () => { - const literalOf = (source: string, constName: string): string => { - const m = new RegExp(`${constName}\\s*(?::[^=]*)?=\\s*'([^']+)'`).exec(source); - expect(m, `\`${constName}\` is not declared as a single-quoted literal any more`).toBeTruthy(); - return m![1]; - }; - - it('the extension and `sdui-parser` name the same key', () => { - const parserSource = readFileSync( - // The one parser: the monorepo root's `packages/sdui-parser` (#25712 item 3). - resolve(HERE, '../../../../../packages/sdui-parser/src/body-dialect.ts'), - 'utf8' - ); - - const extension = literalOf(VALIDATOR_SOURCE, 'const RETIRED_CHILD_LIST_KEY'); - const parser = literalOf(parserSource, 'export const RETIRED_CHILD_LIST_KEY'); - - // Asserted ABSOLUTELY on both sides, not just as equal to each other: two - // constants that drifted to the same WRONG value would satisfy equality. - expect(extension).toBe('body'); - expect(parser).toBe('body'); - expect(extension).toBe(parser); - }); - - it('the diagnostic the extension pushes names the replacement', () => { - // The constant is only half of it — the message is what an author reads. - expect(VALIDATOR_SOURCE).toContain('"children"'); - }); -}); diff --git a/ui/packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts b/ui/packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts deleted file mode 100644 index 767a1770b43..00000000000 --- a/ui/packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts +++ /dev/null @@ -1,601 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * objectui#7862 — COMPILES the file the `Export to React` command hands a user, - * rather than reading substrings out of the generator that writes it. - * - * WHY A COMPILE AND NOT A SECOND SOURCE-TEXT PIN. The sibling pin - * (`export-to-react-preamble.test.ts`, objectui#7837) asserts that named - * strings are present or absent in the template. That instrument can only ever - * catch the defects someone already thought to name: it was green for the whole - * life of `import React from 'react'`, a line it never mentions, and it would be - * green for the next line added to the preamble too. The preamble lives inside a - * TEMPLATE LITERAL, so this package's `tsc --noEmit` sees one string, `tsup` - * copies it through, and no doc gate's scan surface reaches this file. Compiling - * the product closes the whole class instead of one member of it: any preamble - * line that does not type-check — an unused binding, a syntax error, a JSX shape - * the renderer does not accept — fails here without anyone having predicted it. - * - * THE DEFECT THIS WAS BUILT FOR. `generateReactComponent()` opened every file - * with `import React from 'react'` while the only JSX in the file is one - * SchemaRenderer element. Under the automatic runtime (`"jsx": "react-jsx"`, - * what a new Vite or Next project is configured with) the identifier is never - * read, so a consumer compiling with `noUnusedLocals: true` got - * `TS6133: 'React' is declared but its value is never read` on the file the - * command had just handed them. - * - * WHY THE MODULE STUBS ARE HERMETIC, NOT THE REAL `dist/index.d.ts`. The card - * took its readings against the built declarations of `@object-ui/react` and - * `@object-ui/components`. A TEST cannot: `.github/workflows/ci.yml` runs the - * test job as `pnpm install --frozen-lockfile` followed by `pnpm test`, with no - * build step between them, so both `dist/` trees are ABSENT there. Resolving to - * them would make this file emit a TS2307 storm in CI — a red test that reports - * a missing build rather than a defect in the template, which is the worst kind - * of pin. The property under test is a property of the emitted TEXT — does the - * preamble declare a binding no line of the file reads — and that is decided by - * the compiler with any declaration for those specifiers. Import SHAPE against - * the real packages stays the sibling pin's job; the two are complementary. - * - * WHY THE EXTRACTION IS DUPLICATED FROM THE SIBLING PIN. A shared helper would - * have to be a non-`.test.ts` file under `src/`: `tsconfig.test.json` includes - * only the `.test.ts` files under `src/`, so the helper would go unchecked, - * while `tsconfig.json` excludes only those same files, so it WOULD land in the - * build program and ship inside the `.vsix`. Twenty duplicated lines cost less. - */ - -import { existsSync, readFileSync } from 'node:fs'; -import { dirname, join, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import ts from 'typescript'; -import { describe, expect, it } from 'vitest'; - -const EXTENSION_SRC = readFileSync( - resolve(dirname(fileURLToPath(import.meta.url)), '../extension.ts'), - 'utf8' -); - -/** The one interpolation `generateReactComponent()` performs. */ -const INTERPOLATION = '${schemaJson}'; - -/** A schema shaped like the `empty` template the extension itself ships. */ -const SAMPLE_SCHEMA = JSON.stringify( - { - type: 'div', - className: 'p-4', - body: { type: 'text', content: 'Hello Object UI!' }, - }, - null, - 2 -); - -/** - * The exact text a user receives — the template literal's body with the schema - * interpolated, i.e. the PRODUCT, not the generator. - * - * Every failure mode throws with "this pin needs rewriting, not deleting": if - * the generator is refactored, the pin has to be pointed at the new shape, and - * an assertion that silently stops reading the real thing is exactly the - * failure this file exists to stop. - */ -function generatedFile(): string { - const fn = EXTENSION_SRC.indexOf('function generateReactComponent'); - if (fn < 0) { - throw new Error( - 'generateReactComponent() is gone from extension.ts — this pin needs rewriting, not deleting.' - ); - } - const open = EXTENSION_SRC.indexOf('return `', fn); - if (open < 0) { - throw new Error( - 'generateReactComponent() no longer returns a template literal — this pin needs rewriting, not deleting.' - ); - } - const start = open + 'return `'.length; - const close = EXTENSION_SRC.indexOf('`;', start); - if (close < 0) { - throw new Error( - 'unterminated template literal in generateReactComponent() — this pin needs rewriting, not deleting.' - ); - } - const template = EXTENSION_SRC.slice(start, close); - - // A backslash escape means the source text and the evaluated product differ, - // and this extractor would compile something the user never receives. Refuse - // rather than guess. - if (template.includes('\\')) { - throw new Error( - 'the template literal now contains a backslash escape, so slicing the source no longer yields the emitted text — this pin needs rewriting, not deleting.' - ); - } - const interpolations = template.match(/\$\{[^}]*\}/g) ?? []; - if (interpolations.length !== 1 || interpolations[0] !== INTERPOLATION) { - throw new Error( - `expected exactly one ${INTERPOLATION} interpolation, found ${JSON.stringify(interpolations)} — this pin needs rewriting, not deleting.` - ); - } - return template.replace(INTERPOLATION, SAMPLE_SCHEMA); -} - -/** - * Minimal declarations for the four specifiers the generated file names. See - * the header: the real `dist/` trees do not exist in the CI job that runs this. - */ -const STUB_DECLARATIONS = ` -declare module 'react/jsx-runtime' { - export namespace JSX { - interface Element { readonly __brand: unique symbol } - interface ElementAttributesProperty { props: object } - interface ElementChildrenAttribute { children: object } - interface IntrinsicElements { [name: string]: Record } - } - export const Fragment: unknown; - export function jsx(type: unknown, props: unknown, key?: unknown): JSX.Element; - export function jsxs(type: unknown, props: unknown, key?: unknown): JSX.Element; -} -declare module 'react' { - const React: { createElement(...args: unknown[]): unknown }; - export default React; -} -declare module '@object-ui/react' { - import type { JSX } from 'react/jsx-runtime'; - export interface SchemaRendererProps { schema: unknown } - export function SchemaRenderer(props: SchemaRendererProps): JSX.Element; -} -declare module '@object-ui/components' {} -`; - -const GENERATED_PATH = '/objectui-7862/Generated.tsx'; -const STUB_PATH = '/objectui-7862/stubs.d.ts'; - -/** - * objectui#12405 — parsed ON-DISK source files, shared by every program this - * file builds with the same options. The real-prop leg below reaches - * `@object-ui/types` from source, which pulls about 280 files (its `src`, the - * `@objectstack/spec` declarations it imports, `lib.dom.d.ts`) into each - * program; measured on this branch, parsing them was ~2.7 s of the ~6.5 s - * each of that leg's two compiles cost, and both compiles parsed the identical - * files. Only the parse is shared: each compile still builds its own program - * and its own checker, so a diagnostic is still the verdict of a whole fresh - * compile of that candidate. Keyed by the options too, because binding a file - * can depend on them; the text is re-read and compared, so an edited file is - * never served stale. - */ -const ON_DISK_SOURCE_FILES = new Map(); - -/** - * Compile one candidate file and return its diagnostics, formatted. - * - * `stubs` replaces the module declarations above (objectui#11515's real-type - * leg below passes its own). `onlyGenerated` reports the generated file's - * diagnostics alone: that leg reads real source trees, whose own diagnostics - * under these options are not this pin's question. - */ -function compile( - source: string, - overrides: ts.CompilerOptions = {}, - stubs: string = STUB_DECLARATIONS, - onlyGenerated = false -): string[] { - const options: ts.CompilerOptions = { - target: ts.ScriptTarget.ES2020, - module: ts.ModuleKind.ESNext, - moduleResolution: ts.ModuleResolutionKind.Bundler, - lib: ['lib.es2020.d.ts'], - jsx: ts.JsxEmit.ReactJSX, - strict: true, - // The two options this pin exists for: a preamble line nothing reads is - // exactly what `noUnusedLocals` reports, and it is the setting the card's - // consumer had on. - noUnusedLocals: true, - noUnusedParameters: true, - noEmit: true, - skipLibCheck: true, - types: [], - ...overrides, - }; - - const virtual = new Map([ - [GENERATED_PATH, source], - [STUB_PATH, stubs], - ]); - const read = (fileName: string): string | undefined => - virtual.get(fileName) ?? - (existsSync(fileName) ? readFileSync(fileName, 'utf8') : undefined); - - const optionsKey = JSON.stringify(options); - const libDirectory = dirname(ts.getDefaultLibFilePath(options)); - const host: ts.CompilerHost = { - fileExists: (fileName) => virtual.has(fileName) || existsSync(fileName), - readFile: read, - getSourceFile: (fileName, languageVersion) => { - const text = read(fileName); - if (text === undefined) return undefined; - // The candidate and its stubs are parsed fresh every time: they are the - // input under test. An ON-DISK file is parsed once per (options, file): - // see ON_DISK_SOURCE_FILES. - if (virtual.has(fileName)) { - return ts.createSourceFile(fileName, text, languageVersion, true); - } - const key = `${optionsKey}|${JSON.stringify(languageVersion)}|${fileName}`; - const cached = ON_DISK_SOURCE_FILES.get(key); - if (cached && cached.text === text) return cached; - const parsed = ts.createSourceFile(fileName, text, languageVersion, true); - ON_DISK_SOURCE_FILES.set(key, parsed); - return parsed; - }, - getDefaultLibFileName: () => join(libDirectory, 'lib.es2020.d.ts'), - getDefaultLibLocation: () => libDirectory, - writeFile: () => undefined, - getCurrentDirectory: () => '/objectui-7862', - getCanonicalFileName: (fileName) => fileName, - useCaseSensitiveFileNames: () => true, - getNewLine: () => '\n', - }; - - const program = ts.createProgram([STUB_PATH, GENERATED_PATH], options, host); - const generated = program.getSourceFile(GENERATED_PATH); - const diagnostics = - onlyGenerated && generated - ? [ - ...program.getOptionsDiagnostics(), - ...program.getSyntacticDiagnostics(generated), - ...program.getSemanticDiagnostics(generated), - ] - : ts.getPreEmitDiagnostics(program); - return diagnostics.map((diagnostic) => { - const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, ' '); - if (diagnostic.file && diagnostic.start !== undefined) { - const { line, character } = diagnostic.file.getLineAndCharacterOfPosition( - diagnostic.start - ); - return `${diagnostic.file.fileName}(${line + 1},${character + 1}): error TS${diagnostic.code}: ${message}`; - } - return `error TS${diagnostic.code}: ${message}`; - }); -} - -describe('Export to React — the file the command hands the user (objectui#7862)', () => { - it('compiles clean under the automatic JSX runtime with noUnusedLocals', () => { - // The whole point: an assertion on the PRODUCT, so a preamble line nobody - // predicted still has to type-check. - expect(compile(generatedFile())).toEqual([]); - }); - - it('is a harness that can fail — putting the import back reports TS6133', () => { - // The positive control, executed on every run rather than once by hand: if - // the stubs, options or host ever stop reaching the compiler, THIS goes red - // instead of the pin above going quietly, permanently green. - const withUnusedImport = `import React from 'react';\n${generatedFile()}`; - const diagnostics = compile(withUnusedImport); - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0]).toContain( - "error TS6133: 'React' is declared but its value is never read." - ); - }); - - it('records the cost of dropping the import: the classic transform needs it back', () => { - // objectui#7862 chose the automatic runtime deliberately. This is what the - // choice costs the classic `"jsx": "react"` transform, kept measurable so a - // future reversal argues with a reading rather than a recollection. - // - // The assertion is on the SUBSTANCE — one diagnostic, about `React` — and - // not on a code, because the code depends on what declares `react`. Both - // were measured on this branch under TypeScript 6.0.3: against the real - // `@types/react`, whose UMD global declaration is in scope, it is - // `TS2686: 'React' refers to a UMD global, but the current file is a - // module`; against the hermetic stubs above, which declare no UMD global, - // it is `TS2874: This JSX tag requires 'React' to be in scope, but it could - // not be found`. Pinning either code here would pin the stub, not the fact. - const diagnostics = compile(generatedFile(), { jsx: ts.JsxEmit.React }); - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0]).toContain("'React'"); - }); -}); - -/** - * objectui#7976 — BINDS the two hand-kept documentation mirrors of the preamble - * to the preamble `generateReactComponent()` actually emits. - * - * WHY. Two documents transcribe that preamble by hand, and nothing held either - * to the original: the template lives inside a TEMPLATE LITERAL, so this - * package's `tsc --noEmit` sees one string, and `DESIGN.md` is markdown in a - * package whose README is the only file the doc gates' surfaces name. Both - * copies could drift indefinitely with every gate green. Hand-correction had - * been spent three times before this pin existed — objectui#7837, objectui#7978 - * and objectui#8112 — and the third re-created the defect while fixing it: it - * hand-copied the product byte for byte and asserted the equality in its PULL - * REQUEST DESCRIPTION, which ran once, in one session, and is not in the tree. - * objectui#7914's ruling is that the control demonstrating the catch belongs in - * the FILE. This is that file. - * - * ⛔ WHAT THIS PIN DOES NOT SEE — read this before trusting it. - * - * It binds the PREAMBLE ONLY: the lines above `const schema =`. Everything - * BELOW that line is unbound and can still drift out of both documents - * silently — the component name `GeneratedComponent`, the returned JSX, and the - * `export default` line. It also says nothing about prose OUTSIDE the fence: - * the sentence claiming the output went to the clipboard (objectui#7977) was - * false for as long as it stood, and no fence assertion would have caught it, - * because it was a paragraph and not code. - * - * WHY NOT THE WHOLE BLOCK, WHICH WOULD SEE ALL OF THAT. Whole-block verbatim - * equality is RED on BOTH copies today, and neither red is a defect: - * `DESIGN.md` assigns `const schema` a braces-with-a-comment placeholder naming - * the user's schema, where the - * generator interpolates the real thing, and the `.mdx` was evaluated against - * the example schema that page teaches rather than this file's `SAMPLE_SCHEMA`. - * Widening to the whole block would mean editing both documents to fit the - * test. ⛔ Sanding a document to fit its pin is not available: the readable - * placeholder is the document doing its job. So the pin is drawn at the widest - * line that is green on both copies UNCHANGED, and its blind half is named here - * rather than left for a reader to discover. - * - * NOTE the four-line `// No React import:` comment is NOT a readability - * addition someone made to the docs — it is inside the returned template - * literal, so it is emitted into every user's file. It is product, and this pin - * holds the documents to it rather than exempting it. - */ - -/** Repo root, from `packages/vscode-extension/src/__tests__`. */ -const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..'); - -/** - * Every document that hand-keeps a copy of the preamble, located STRUCTURALLY — - * by the heading it lives under, not by the text being compared, which would - * make the locator agree with whatever it found. - */ -const DOCUMENTED_MIRRORS = [ - { - file: 'packages/vscode-extension/DESIGN.md', - heading: '### 4. Export to React', - }, - { - file: 'content/docs/utilities/vscode-extension.mdx', - heading: '### `Object UI: Export to React Component`', - }, -] as const; - -/** - * The part shape B binds: everything above the schema assignment. The line is - * found by its binding, `const schema`, annotated or not: objectui#11515 typed - * it, so it reads `const schema: SchemaRendererProps['schema'] =` in the - * product, while a document may still print the binding bare. - */ -function preambleOf(source: string, what: string): string { - const lines = source.split('\n'); - const end = lines.findIndex((line) => /^const schema\b/.test(line)); - if (end < 0) { - throw new Error( - `no \`const schema\` line in ${what} — this pin needs rewriting, not deleting.` - ); - } - return lines.slice(0, end).join('\n').trimEnd(); -} - -/** - * The preamble as one document prints it. Kept pure on TEXT so the controls - * below can drive the same extractor over a synthetic document — a control that - * skipped the extractor would not be controlling the part that can break. - */ -function documentedPreambleFrom( - text: string, - mirror: { file: string; heading: string } -): string { - const heading = text.indexOf(mirror.heading); - if (heading < 0) { - throw new Error( - `${mirror.file} no longer has the heading ${mirror.heading} — this pin needs rewriting, not deleting.` - ); - } - const fence = '```typescript\n'; - const open = text.indexOf(fence, heading); - if (open < 0) { - throw new Error( - `no typescript fence under ${mirror.heading} in ${mirror.file} — this pin needs rewriting, not deleting.` - ); - } - const start = open + fence.length; - const close = text.indexOf('```', start); - if (close < 0) { - throw new Error( - `unterminated fence under ${mirror.heading} in ${mirror.file} — this pin needs rewriting, not deleting.` - ); - } - return preambleOf(text.slice(start, close), `${mirror.file}'s fence`); -} - -function documentedPreamble(mirror: { file: string; heading: string }): string { - const path = join(REPO_ROOT, mirror.file); - if (!existsSync(path)) { - throw new Error( - `${mirror.file} is gone — this pin needs rewriting, not deleting.` - ); - } - return documentedPreambleFrom(readFileSync(path, 'utf8'), mirror); -} - -describe('Export to React — the documented mirrors of the preamble (objectui#7976)', () => { - // ONE assertion, both consumers. The two documents are not pinned separately: - // a second copy of this comparison is how the two would drift apart again. - it.each(DOCUMENTED_MIRRORS)( - '$file reproduces the emitted preamble verbatim', - (mirror) => { - expect(documentedPreamble(mirror)).toBe( - preambleOf(generatedFile(), 'the generated file') - ); - } - ); - - it('binds every known mirror — an emptied list would assert nothing', () => { - // The floor. A refactor that quietly emptied the list above would satisfy - // `it.each` by running zero cases and report green having compared nothing. - expect(DOCUMENTED_MIRRORS).toHaveLength(2); - for (const mirror of DOCUMENTED_MIRRORS) { - expect(existsSync(join(REPO_ROOT, mirror.file))).toBe(true); - } - }); - - it('is a harness that can fail — a document that drops the side-effect import is rejected', () => { - // The positive control objectui#7914 requires IN THE FILE, executed on every - // run rather than once by hand in a PR description. It drives the real - // extractor over a synthetic document, so if the extractor ever stops - // finding the fence, THIS goes red instead of the pin above going quietly, - // permanently green over an empty string. - const product = preambleOf(generatedFile(), 'the generated file'); - const mirror = DOCUMENTED_MIRRORS[0]; - const asDocument = (preamble: string): string => - `${mirror.heading}\n\n\`\`\`typescript\n${preamble}\n\nconst schema = {};\n\`\`\`\n`; - - // Negative: a drifted document is caught. - const drifted = product - .split('\n') - .filter((line) => line !== "import '@object-ui/components';") - .join('\n'); - expect(drifted).not.toBe(product); // the mutation really removed a line - expect(documentedPreambleFrom(asDocument(drifted), mirror)).not.toBe(product); - - // Positive: an accurate document is accepted, so the check above is not - // simply rejecting everything the extractor hands it. - expect(documentedPreambleFrom(asDocument(product), mirror)).toBe(product); - }); -}); - -/** - * objectui#11515 — the emitted `schema` constant compiles against the REAL - * `SchemaRendererProps['schema']`, not against a stub of it. - * - * WHY THE PIN ABOVE CANNOT SEE THIS. Its stub types the prop as `unknown`, - * which accepts every schema, so an annotation, a missing annotation or a wrong - * one all compile there. objectui#11466 types the prop as the declared-node - * union, which discriminates on the literal `type`: an unannotated constant - * widens every `type` to `string` and is refused, and `SchemaNode`, the first - * candidate annotation, is refused today and under that change alike, because - * it admits `number` and `boolean`, which the prop leaves out. - * - * HOW THE REAL TYPE IS REACHED WITHOUT A BUILD (the header's CI constraint - * stands). `@object-ui/types` resolves to its SOURCE entry, which is in the tree - * when no `dist/` is. The `@object-ui/react` module is still declared here, but - * its `SchemaRendererProps` is read out of `packages/react/src/SchemaRenderer.tsx` - * at test time: the interface body and the `@object-ui/types` names it imports, - * verbatim. So when the prop's type moves, this program moves with it, and a - * restated copy of the prop never exists to drift. - */ -const REACT_SCHEMA_RENDERER = join(REPO_ROOT, 'packages/react/src/SchemaRenderer.tsx'); -const TYPES_SOURCE_ENTRY = join(REPO_ROOT, 'packages/types/src/index.ts'); - -/** - * The documented sample (`content/docs/utilities/vscode-extension.mdx`). Both - * of its types are declared: `div`, and `h1`, one of the HTML passthrough tags - * `HtmlElementSchema` declares (objectui#8499). - */ -const DOC_SAMPLE_SCHEMA = JSON.stringify( - { - type: 'div', - className: 'p-4', - children: [{ type: 'h1', children: 'Hello World' }], - }, - null, - 2 -); - -/** The real `SchemaRendererProps` declaration, as module text for the stub. */ -function realSchemaRendererProps(): { imports: string; body: string } { - if (!existsSync(REACT_SCHEMA_RENDERER)) { - throw new Error('packages/react/src/SchemaRenderer.tsx is gone — this pin needs rewriting, not deleting.'); - } - const source = readFileSync(REACT_SCHEMA_RENDERER, 'utf8'); - const imports = source.match(/^import type \{([^}]*)\} from '@object-ui\/types';$/m); - const body = source.match(/^export interface SchemaRendererProps \{\n([^}]*)\n\}$/m); - if (!imports || !body) { - throw new Error( - 'SchemaRenderer.tsx no longer spells its `@object-ui/types` type import or `SchemaRendererProps` the way this extractor reads them — this pin needs rewriting, not deleting.' - ); - } - if (!/^\s*schema:/m.test(body[1])) { - throw new Error('`SchemaRendererProps` has no `schema` member — this pin needs rewriting, not deleting.'); - } - return { imports: imports[1].trim(), body: body[1] }; -} - -/** The stubs above, with `@object-ui/react` carrying the real prop type. */ -function realPropStubs(): string { - const { imports, body } = realSchemaRendererProps(); - const react = `declare module '@object-ui/react' { - import type { JSX } from 'react/jsx-runtime'; - import type { ${imports} } from '@object-ui/types'; - export interface SchemaRendererProps { -${body} - } - export function SchemaRenderer(props: SchemaRendererProps): JSX.Element; -}`; - const stubbed = STUB_DECLARATIONS.replace( - /declare module '@object-ui\/react' \{[\s\S]*?\n\}/, - react - ); - if (stubbed === STUB_DECLARATIONS) { - throw new Error('the `@object-ui/react` stub was not replaced — this pin needs rewriting, not deleting.'); - } - return stubbed; -} - -function compileAgainstRealProp(schemaJson: string): string[] { - return compile( - generatedFile().replace(SAMPLE_SCHEMA, schemaJson), - { - lib: ['lib.es2022.d.ts', 'lib.dom.d.ts'], - paths: { '@object-ui/types': [TYPES_SOURCE_ENTRY] }, - }, - realPropStubs(), - true - ); -} - -/** A schema that is no node: it names no `type`. */ -const NOT_A_NODE_SCHEMA = JSON.stringify({ className: 'p-4' }, null, 2); - -/** - * objectui#12405 — the two real-prop compiles run in the IMPORT phase, once - * each, and the tests below read their verdicts. Each is a whole TypeScript - * program over `@object-ui/types`' source; measured on this branch they cost - * 5.6–7.2 s apiece inside the 15 s `testTimeout`, and 17.3 / 17.6 s on a slow - * CI runner (job 116029528393), where both tests timed out with the compile - * itself correct. Module scope, not `beforeAll`: the import phase is governed - * by no timeout, whereas a hook would trade the 15 s `testTimeout` for the - * narrower 10 s `hookTimeout` (objectui `AGENTS.md`, the test discipline - * section; the same move as `check-unused-dependencies.test.ts`'s - * `REPOSITORY_SCAN`). Nothing asserted changed: each test reads the same - * diagnostics from the same compile it ran before. - */ -const DOC_SAMPLE_DIAGNOSTICS = compileAgainstRealProp(DOC_SAMPLE_SCHEMA); -const NOT_A_NODE_DIAGNOSTICS = compileAgainstRealProp(NOT_A_NODE_SCHEMA); - -describe('Export to React — the schema constant against the real prop type (objectui#11515)', () => { - it('compiles the documented sample, annotated, against SchemaRendererProps[\'schema\']', () => { - expect(DOC_SAMPLE_DIAGNOSTICS).toEqual([]); - }); - - it('is a harness that can fail — a schema that is no node is refused AT the constant', () => { - // The positive control: if `@object-ui/types` stopped resolving, the prop - // would read as an error type and this would compile. The refusal lands on - // the annotated line, which is what the annotation buys: the error is - // reported where the schema is written, not at the JSX element. - const product = generatedFile().replace(SAMPLE_SCHEMA, NOT_A_NODE_SCHEMA); - const constLine = product.split('\n').findIndex((line) => /^const schema\b/.test(line)) + 1; - const diagnostics = NOT_A_NODE_DIAGNOSTICS; - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0]).toContain(`${GENERATED_PATH}(${constLine},`); - expect(diagnostics[0]).toContain('error TS2322'); - }); - - it('reads the prop from the source it names, not from a copy', () => { - const stubs = realPropStubs(); - expect(stubs).toContain(realSchemaRendererProps().body); - expect(stubs).not.toContain('export interface SchemaRendererProps { schema: unknown }'); - }); -}); diff --git a/ui/packages/vscode-extension/src/__tests__/export-to-react-preamble.test.ts b/ui/packages/vscode-extension/src/__tests__/export-to-react-preamble.test.ts deleted file mode 100644 index 3d4f55b0541..00000000000 --- a/ui/packages/vscode-extension/src/__tests__/export-to-react-preamble.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * objectui#7837 — pins on the preamble the `Export to React` command writes - * into every file a user gets. - * - * WHY A PIN AT ALL. The preamble lives inside a TEMPLATE LITERAL, so nothing - * in this package's toolchain reads it: `tsc --noEmit` sees a string, `tsup` - * copies it through, and the doc gates' surfaces are `content/docs`, the - * per-app docs trees, `packages/NAME/README.md` and the root `README.md` — - * none of which is this file. For as long as the preamble imported - * `registerDefaultRenderers` from `@object-ui/components` and called it, this - * package's own type-check was green and every generated file failed to - * compile with `TS2305` on a symbol the user never typed. There was no binding - * between the verifier and the thing verified; these assertions are it. - * - * WHY SOURCE TEXT AND NOT A COMPILE. Compiling the emitted code under test - * would mean exporting `generateReactComponent()`, and objectui#7837 is - * explicitly not allowed to move this package's export surface. So these read - * the template out of the source instead. That is weaker than compiling the - * output — it cannot catch a NEW phantom, only the return of this one and the - * loss of its replacement — and the stronger instrument is filed separately. - * - * WHY THE SIDE-EFFECT IMPORT IS THE CORRECT SPELLING (measured, not recalled). - * `@object-ui/components` declares `sideEffects: true`, its barrel runs - * `import './renderers'` under the comment `Register all ObjectUI renderers - * (side-effects)`, and its built `dist/index.js` carries 114 module-scope - * `register(` call sites. Its built `dist/index.d.ts` exports exactly one - * `register*` name — `registerPlaceholders`. There is no registration function - * to call. Same spelling the root README landed for objectui#7417. - */ - -import { readFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { describe, expect, it } from 'vitest'; - -const EXTENSION_SRC = readFileSync( - resolve(dirname(fileURLToPath(import.meta.url)), '../extension.ts'), - 'utf8' -); - -/** - * The body of the template literal `generateReactComponent()` returns — i.e. - * the text of the file the user receives, with the schema still uninterpolated. - * - * Every failure mode throws with "this pin needs rewriting, not deleting": if - * the generator is refactored, the pin has to be pointed at the new shape, and - * a silently-skipped assertion is exactly the failure this file exists to stop. - */ -function generatedFileTemplate(): string { - const fn = EXTENSION_SRC.indexOf('function generateReactComponent'); - if (fn < 0) { - throw new Error( - 'generateReactComponent() is gone from extension.ts — this pin needs rewriting, not deleting.' - ); - } - const open = EXTENSION_SRC.indexOf('return `', fn); - if (open < 0) { - throw new Error( - 'generateReactComponent() no longer returns a template literal — this pin needs rewriting, not deleting.' - ); - } - const start = open + 'return `'.length; - const close = EXTENSION_SRC.indexOf('`;', start); - if (close < 0) { - throw new Error( - 'unterminated template literal in generateReactComponent() — this pin needs rewriting, not deleting.' - ); - } - return EXTENSION_SRC.slice(start, close); -} - -describe('Export to React — the generated file preamble (objectui#7837)', () => { - it('names no `registerDefaultRenderers`, which @object-ui/components does not export', () => { - expect(generatedFileTemplate()).not.toContain('registerDefaultRenderers'); - // Belt and braces: the identifier is absent from the whole module, so a - // second copy cannot reappear in a helper the template interpolates. - expect(EXTENSION_SRC).not.toContain('registerDefaultRenderers'); - }); - - it('imports @object-ui/components for its side effect, with no named binding', () => { - const template = generatedFileTemplate(); - expect(template).toContain("import '@object-ui/components';"); - // A named import from that package is how the defect was spelled. Assert - // the SHAPE is gone, not just the one identifier, so the next phantom off - // that specifier fails here too. - expect(template).not.toMatch(/import\s*\{[^}]*\}\s*from\s*'@object-ui\/components'/); - }); - - it('still imports SchemaRenderer from @object-ui/react — the renderer it calls', () => { - const template = generatedFileTemplate(); - // objectui#11515: the same import also names the prop type the schema - // constant is annotated with, type-only, so it adds no runtime binding. - expect(template).toContain("import { SchemaRenderer, type SchemaRendererProps } from '@object-ui/react';"); - expect(template).toContain("const schema: SchemaRendererProps['schema'] = "); - expect(template).toContain(''); - }); -}); diff --git a/ui/packages/vscode-extension/src/__tests__/template-dialect-7181.test.ts b/ui/packages/vscode-extension/src/__tests__/template-dialect-7181.test.ts deleted file mode 100644 index 9d3c6f52cce..00000000000 --- a/ui/packages/vscode-extension/src/__tests__/template-dialect-7181.test.ts +++ /dev/null @@ -1,192 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * objectui#7181 — every template `Object UI: Create New Schema` writes spells - * its child lists `children`. - * - * ## Why this pin exists - * - * `getTemplateSchema` is a PRODUCER, and the tightest one in the repo: the - * command writes the template to a `.objectui.json` file on disk and opens it, - * and the extension's OWN preview and validator then read that same file. Every - * template it shipped spelled its child lists `body`. - * - * That made the round trip self-contradicting in both directions at once. While - * the readers were `body`-only, migrating the templates alone would have made - * `Create New Schema` followed by `Open Preview` render blank. Now that the - * readers honour `children` (see `body-dialect-children-arm-7181.test.ts`), - * nothing but this pin would notice a template drifting back to `body`, or a - * newly added template arriving in the old spelling. - * - * ## Why the function is transpiled rather than imported - * - * `getTemplateSchema` is module-local, and `extension.ts` imports `vscode`, - * which has no runtime module outside the extension host and no alias in this - * repo's vitest config. The file is therefore transpiled and executed against a - * stub, and the function is taken out of the module scope by name. ⚠️ The - * SOURCE file is never modified — only the in-memory transpiled copy is given a - * trailing `return`, so this pin cannot drift from the shipped text. - * - * ## The template population is DERIVED, never listed here - * - * The names come from the quick-pick list `createNewSchema` offers, read out of - * the source, so a template added tomorrow is covered today (AGENTS.md #9). - * ⚠️ `getTemplateSchema` falls back to `empty` for an unknown name, so a pin - * that guessed names would pass on every typo while testing one template three - * times — the discovery below is checked against the template map itself. - */ - -import { readFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import ts from 'typescript'; -import { describe, expect, it } from 'vitest'; - -const EXTENSION_SOURCE = readFileSync( - resolve(dirname(fileURLToPath(import.meta.url)), '../extension.ts'), - 'utf8' -); - -/** - * Transpile `extension.ts` against a `vscode` stub and hand back the - * module-local `getTemplateSchema`. - */ -function loadShippedTemplateFactory(): (type: string) => string { - const transpiled = ts.transpileModule(EXTENSION_SOURCE, { - compilerOptions: { - module: ts.ModuleKind.CommonJS, - target: ts.ScriptTarget.ES2020, - }, - }).outputText; - - // A stub that answers any member access with something callable, newable and - // further-accessible. `getTemplateSchema` touches none of it; this only has - // to survive module evaluation, which constructs nothing (`activate()` is - // never called here). - const inertStub: unknown = new Proxy( - function stub() {} as unknown as object, - { - get: () => inertStub, - apply: () => undefined, - construct: () => ({}), - } - ); - - const moduleShim = { exports: {} as Record }; - const factory = new Function( - 'require', - 'module', - 'exports', - `${transpiled}\nreturn typeof getTemplateSchema === 'function' ? getTemplateSchema : undefined;` - )( - (specifier: string) => { - // `vscode` and the extension's own sibling modules are stubbed; a NEW - // third-party dependency still throws, so this stays a real guard rather - // than a catch-all. - if (specifier === 'vscode' || specifier.startsWith('.')) return inertStub; - throw new Error(`unexpected require("${specifier}") in extension.ts`); - }, - moduleShim, - moduleShim.exports - ); - - expect( - typeof factory, - 'getTemplateSchema was not found in the transpiled extension module — ' + - 'it was renamed or moved, and this pin is measuring nothing' - ).toBe('function'); - - return factory as (type: string) => string; -} - -/** The template names `createNewSchema` offers in its quick pick. */ -function discoverTemplateNames(): string[] { - const names = [...EXTENSION_SOURCE.matchAll(/\{\s*label:\s*'[^']+',\s*value:\s*'([^']+)'\s*\}/g)] - .map((match) => match[1]); - - expect( - names.length, - 'no template names discovered in createNewSchema\'s quick-pick list — ' + - 'the list moved and this pin would silently cover nothing' - ).toBeGreaterThan(0); - return names; -} - -interface DialectTally { - body: number; - children: number; - nodes: number; -} - -function tallyDialect(value: unknown, tally: DialectTally): DialectTally { - if (Array.isArray(value)) { - value.forEach((entry) => tallyDialect(entry, tally)); - return tally; - } - if (!value || typeof value !== 'object') return tally; - - const node = value as Record; - if (typeof node.type === 'string') tally.nodes += 1; - if ('body' in node) tally.body += 1; - if ('children' in node) tally.children += 1; - - Object.values(node).forEach((entry) => tallyDialect(entry, tally)); - return tally; -} - -describe('objectui#7181 — the VS Code new-schema templates use `children`', () => { - const getTemplateSchema = loadShippedTemplateFactory(); - const templateNames = discoverTemplateNames(); - - it.each(templateNames)( - 'template "%s" emits no `body` child list anywhere', - (templateName) => { - const raw = getTemplateSchema(templateName); - let parsed: unknown; - expect( - () => { - parsed = JSON.parse(raw); - }, - `template "${templateName}" is not parseable JSON` - ).not.toThrow(); - - const tally = tallyDialect(parsed, { body: 0, children: 0, nodes: 0 }); - - // Lit controls: without these the zero below could come from an empty - // template or a walk that visited nothing. - expect( - tally.nodes, - `template "${templateName}": the walk visited no typed node` - ).toBeGreaterThan(0); - expect( - tally.children, - `template "${templateName}": no node spells \`children\`` - ).toBeGreaterThan(0); - - expect( - tally.body, - `template "${templateName}" still emits the retired \`body\` child-list dialect` - ).toBe(0); - } - ); - - it('offers templates that are distinct documents, not the `empty` fallback repeated', () => { - // `getTemplateSchema` returns `templates.empty` for any unknown name, so a - // discovery that drifted out of sync with the template map would test one - // template N times and still be green. Distinctness is what detects that. - const rendered = templateNames.map((name) => getTemplateSchema(name)); - const distinct = new Set(rendered); - - expect( - distinct.size, - 'every offered template rendered the same document — the quick-pick ' + - 'names no longer match the keys of the template map' - ).toBeGreaterThan(1); - }); -}); diff --git a/ui/packages/vscode-extension/src/extension.ts b/ui/packages/vscode-extension/src/extension.ts deleted file mode 100644 index 5a4ba552280..00000000000 --- a/ui/packages/vscode-extension/src/extension.ts +++ /dev/null @@ -1,435 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import * as vscode from 'vscode'; -import { PreviewProvider } from './providers/PreviewProvider'; -import { SchemaValidator } from './providers/SchemaValidator'; -import { CompletionProvider } from './providers/CompletionProvider'; -import { HoverProvider } from './providers/HoverProvider'; - -let previewProvider: PreviewProvider | undefined; - -/** - * Extension activation entry point - */ -export function activate(context: vscode.ExtensionContext) { - // Initialize providers - const schemaValidator = new SchemaValidator(); - const completionProvider = new CompletionProvider(); - const hoverProvider = new HoverProvider(); - previewProvider = new PreviewProvider(context); - - // Register completion provider for JSON files - context.subscriptions.push( - vscode.languages.registerCompletionItemProvider( - [ - { language: 'json', pattern: '**/*.objectui.json' }, - { language: 'json', pattern: '**/*.oui.json' }, - { language: 'json', pattern: '**/app.json' }, - { language: 'jsonc', pattern: '**/*.objectui.json' }, - { language: 'jsonc', pattern: '**/*.oui.json' }, - { language: 'objectui-json' } - ], - completionProvider, - '"', // Trigger on quote - ':', // Trigger on colon - ' ' // Trigger on space - ) - ); - - // Register hover provider - context.subscriptions.push( - vscode.languages.registerHoverProvider( - [ - { language: 'json', pattern: '**/*.objectui.json' }, - { language: 'json', pattern: '**/*.oui.json' }, - { language: 'jsonc', pattern: '**/*.objectui.json' }, - { language: 'jsonc', pattern: '**/*.oui.json' }, - { language: 'objectui-json' } - ], - hoverProvider - ) - ); - - // Register commands - context.subscriptions.push( - vscode.commands.registerCommand('objectui.preview', async () => { - const editor = vscode.window.activeTextEditor; - if (editor) { - await previewProvider?.showPreview(editor.document.uri, false); - } - }) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('objectui.previewToSide', async () => { - const editor = vscode.window.activeTextEditor; - if (editor) { - await previewProvider?.showPreview(editor.document.uri, true); - } - }) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('objectui.validate', async () => { - const editor = vscode.window.activeTextEditor; - if (editor) { - await schemaValidator.validateDocument(editor.document); - } - }) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('objectui.format', async () => { - const editor = vscode.window.activeTextEditor; - if (editor) { - await formatSchema(editor); - } - }) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('objectui.exportToReact', async () => { - const editor = vscode.window.activeTextEditor; - if (editor) { - await exportToReact(editor); - } - }) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('objectui.newSchema', async () => { - await createNewSchema(); - }) - ); - - // Watch for file changes to update preview - const config = vscode.workspace.getConfiguration('objectui'); - if (config.get('preview.autoRefresh')) { - context.subscriptions.push( - vscode.workspace.onDidSaveTextDocument((document) => { - if (isObjectUISchema(document)) { - previewProvider?.updatePreview(document.uri); - } - }) - ); - } - - // Validate on open and save - if (config.get('validation.enabled')) { - context.subscriptions.push( - vscode.workspace.onDidOpenTextDocument((document) => { - if (isObjectUISchema(document)) { - schemaValidator.validateDocument(document); - } - }) - ); - - context.subscriptions.push( - vscode.workspace.onDidSaveTextDocument((document) => { - if (isObjectUISchema(document)) { - schemaValidator.validateDocument(document); - } - }) - ); - } -} - -/** - * Extension deactivation - */ -export function deactivate() { - previewProvider?.dispose(); -} - -/** - * Check if document is an Object UI schema - */ -function isObjectUISchema(document: vscode.TextDocument): boolean { - const fileName = document.fileName; - return ( - fileName.endsWith('.objectui.json') || - fileName.endsWith('.oui.json') || - fileName.endsWith('app.json') || - document.languageId === 'objectui-json' - ); -} - -/** - * Format schema with proper indentation - */ -async function formatSchema(editor: vscode.TextEditor) { - try { - const document = editor.document; - const text = document.getText(); - const config = vscode.workspace.getConfiguration('objectui'); - const indentSize = config.get('format.indentSize', 2); - - const json = JSON.parse(text); - const formatted = JSON.stringify(json, null, indentSize); - - const edit = new vscode.WorkspaceEdit(); - const fullRange = new vscode.Range( - document.positionAt(0), - document.positionAt(text.length) - ); - edit.replace(document.uri, fullRange, formatted); - - await vscode.workspace.applyEdit(edit); - await document.save(); - - vscode.window.showInformationMessage('Schema formatted successfully'); - } catch (error) { - vscode.window.showErrorMessage( - `Failed to format schema: ${error instanceof Error ? error.message : String(error)}` - ); - } -} - -/** - * Export schema to React component - */ -async function exportToReact(editor: vscode.TextEditor) { - try { - const document = editor.document; - const text = document.getText(); - const schema = JSON.parse(text); - - const componentCode = generateReactComponent(schema); - - const doc = await vscode.workspace.openTextDocument({ - content: componentCode, - language: 'typescriptreact', - }); - - await vscode.window.showTextDocument(doc); - - vscode.window.showInformationMessage( - 'React component generated! Save it to a .tsx file.' - ); - } catch (error) { - vscode.window.showErrorMessage( - `Failed to export to React: ${error instanceof Error ? error.message : String(error)}` - ); - } -} - -/** - * Generate React component from schema - * - * The emitted `schema` constant is annotated with `SchemaRendererProps['schema']` - * (objectui#11515). Unannotated, every `type` in it widens to `string`, which a - * prop that discriminates on the literal `type` refuses. `SchemaNode` was the - * first candidate and does not fit: it also admits `number` and `boolean`, which - * the prop leaves out, and the narrowing at the initializer does not reach the - * component's body, so the one JSX line was refused for every schema. - */ -function generateReactComponent(schema: any): string { - const schemaJson = JSON.stringify(schema, null, 2); - - return `// No React import: under the automatic JSX runtime ("jsx": "react-jsx", -// what a new Vite or Next project is configured with) nothing here reads that -// identifier, so it compiles as an unused local. Add the import back only if -// this file is built with the classic "jsx": "react" transform. -import { SchemaRenderer, type SchemaRendererProps } from '@object-ui/react'; -// Importing the package registers every default renderer as a side effect — -// there is no separate registration call. -import '@object-ui/components'; - -// Typed as the schema SchemaRenderer takes, so each "type" below stays a literal -// and the compiler checks the schema against the node types it accepts. -const schema: SchemaRendererProps['schema'] = ${schemaJson}; - -export default function GeneratedComponent() { - return ; -} -`; -} - -/** - * Create new schema from template - */ -async function createNewSchema() { - const templates = [ - { label: 'Empty Schema', value: 'empty' }, - { label: 'Simple Form', value: 'form' }, - { label: 'Dashboard', value: 'dashboard' }, - { label: 'Card Layout', value: 'card' }, - { label: 'Data Table', value: 'table' }, - ]; - - const selected = await vscode.window.showQuickPick(templates, { - placeHolder: 'Select a template', - }); - - if (!selected) { - return; - } - - const schemaContent = getTemplateSchema(selected.value); - - const doc = await vscode.workspace.openTextDocument({ - content: schemaContent, - language: 'json', - }); - - const editor = await vscode.window.showTextDocument(doc); - - // Suggest filename - const fileName = await vscode.window.showInputBox({ - prompt: 'Enter filename (without extension)', - value: 'app', - }); - - if (fileName) { - const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; - if (workspaceFolder) { - const filePath = vscode.Uri.joinPath( - workspaceFolder.uri, - `${fileName}.objectui.json` - ); - - await vscode.workspace.fs.writeFile( - filePath, - Buffer.from(schemaContent) - ); - - const savedDoc = await vscode.workspace.openTextDocument(filePath); - await vscode.window.showTextDocument(savedDoc); - } - } -} - -/** - * Get template schema by type - */ -function getTemplateSchema(type: string): string { - const templates: Record = { - empty: { - type: 'div', - className: 'p-4', - children: { - type: 'text', - content: 'Hello Object UI!', - }, - }, - form: { - type: 'div', - className: 'max-w-2xl mx-auto p-6', - children: { - type: 'card', - title: 'Contact Form', - children: { - type: 'div', - className: 'space-y-4', - children: [ - { - type: 'input', - label: 'Name', - placeholder: 'Enter your name', - required: true, - }, - { - type: 'input', - label: 'Email', - inputType: 'email', - placeholder: 'your@email.com', - required: true, - }, - { - type: 'textarea', - label: 'Message', - placeholder: 'Your message...', - rows: 4, - }, - { - type: 'button', - label: 'Submit', - className: 'mt-4', - }, - ], - }, - }, - }, - dashboard: { - type: 'div', - className: 'min-h-screen p-6', - children: [ - { - type: 'div', - className: 'mb-6', - children: { - type: 'text', - content: 'Dashboard', - className: 'text-3xl font-bold', - }, - }, - { - type: 'div', - className: 'grid gap-4 md:grid-cols-3', - children: [ - { - type: 'card', - title: 'Total Users', - children: { - type: 'text', - content: '1,234', - className: 'text-2xl font-bold', - }, - }, - { - type: 'card', - title: 'Revenue', - children: { - type: 'text', - content: '$56,789', - className: 'text-2xl font-bold', - }, - }, - { - type: 'card', - title: 'Orders', - children: { - type: 'text', - content: '432', - className: 'text-2xl font-bold', - }, - }, - ], - }, - ], - }, - card: { - type: 'div', - className: 'max-w-md mx-auto p-6', - children: { - type: 'card', - title: 'Card Title', - description: 'This is a card description', - children: { - type: 'text', - content: 'Card content goes here', - }, - }, - }, - table: { - type: 'div', - className: 'p-6', - children: { - type: 'card', - title: 'Data Table', - children: { - type: 'text', - content: 'Table component coming soon...', - }, - }, - }, - }; - - return JSON.stringify(templates[type] || templates.empty, null, 2); -} diff --git a/ui/packages/vscode-extension/src/providers/CompletionProvider.ts b/ui/packages/vscode-extension/src/providers/CompletionProvider.ts deleted file mode 100644 index 80557496261..00000000000 --- a/ui/packages/vscode-extension/src/providers/CompletionProvider.ts +++ /dev/null @@ -1,187 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import * as vscode from 'vscode'; - -/** - * Provides IntelliSense and auto-completion for Object UI schemas - */ -export class CompletionProvider - implements vscode.CompletionItemProvider -{ - provideCompletionItems( - document: vscode.TextDocument, - position: vscode.Position, - token: vscode.CancellationToken, - context: vscode.CompletionContext - ): vscode.ProviderResult { - const linePrefix = document - .lineAt(position) - .text.substring(0, position.character); - - // Get completion items based on context - const items: vscode.CompletionItem[] = []; - - // Add type completions - if (linePrefix.includes('"type"')) { - items.push(...this.getTypeCompletions()); - } - - // Add property completions based on type - const currentType = this.getCurrentType(document, position); - if (currentType) { - items.push(...this.getPropertyCompletions(currentType)); - } - - // Add common properties - items.push(...this.getCommonPropertyCompletions()); - - return items; - } - - /** - * Get type completions - */ - private getTypeCompletions(): vscode.CompletionItem[] { - const types = [ - { name: 'div', desc: 'Container element' }, - { name: 'text', desc: 'Text content' }, - { name: 'card', desc: 'Card component' }, - { name: 'button', desc: 'Button component' }, - { name: 'input', desc: 'Input field' }, - { name: 'textarea', desc: 'Textarea field' }, - { name: 'select', desc: 'Select dropdown' }, - { name: 'checkbox', desc: 'Checkbox input' }, - { name: 'radio', desc: 'Radio input' }, - { name: 'separator', desc: 'Horizontal separator' }, - { name: 'badge', desc: 'Badge component' }, - { name: 'alert', desc: 'Alert component' }, - { name: 'tabs', desc: 'Tabs component' }, - { name: 'accordion', desc: 'Accordion component' }, - ]; - - return types.map((type) => { - const item = new vscode.CompletionItem( - type.name, - vscode.CompletionItemKind.Value - ); - item.detail = type.desc; - item.documentation = new vscode.MarkdownString( - `Object UI component type: **${type.name}**\n\n${type.desc}` - ); - return item; - }); - } - - /** - * Get property completions based on type - */ - private getPropertyCompletions(type: string): vscode.CompletionItem[] { - const properties: Record> = { - input: [ - { name: 'label', desc: 'Input label' }, - { name: 'placeholder', desc: 'Placeholder text' }, - { name: 'inputType', desc: 'Input type (text, email, etc.)' }, - { name: 'required', desc: 'Whether input is required' }, - { name: 'disabled', desc: 'Whether input is disabled' }, - ], - textarea: [ - { name: 'label', desc: 'Textarea label' }, - { name: 'placeholder', desc: 'Placeholder text' }, - { name: 'rows', desc: 'Number of rows' }, - { name: 'required', desc: 'Whether textarea is required' }, - ], - button: [ - { name: 'label', desc: 'Button text' }, - { name: 'variant', desc: 'Button variant (default, outline, etc.)' }, - { name: 'size', desc: 'Button size (sm, default, lg)' }, - { name: 'disabled', desc: 'Whether button is disabled' }, - ], - card: [ - { name: 'title', desc: 'Card title' }, - { name: 'description', desc: 'Card description' }, - { name: 'children', desc: 'Card content' }, - ], - text: [{ name: 'content', desc: 'Text content' }], - }; - - const props = properties[type] || []; - - return props.map((prop) => { - const item = new vscode.CompletionItem( - prop.name, - vscode.CompletionItemKind.Property - ); - item.detail = prop.desc; - item.insertText = new vscode.SnippetString(`"${prop.name}": "$1"`); - return item; - }); - } - - /** - * Get common property completions - */ - private getCommonPropertyCompletions(): vscode.CompletionItem[] { - const common = [ - { name: 'type', desc: 'Component type' }, - { name: 'className', desc: 'Tailwind CSS classes' }, - { name: 'children', desc: 'Child components or content' }, - { name: 'id', desc: 'Component ID' }, - { name: 'visible', desc: 'Visibility condition' }, - ]; - - return common.map((prop) => { - const item = new vscode.CompletionItem( - prop.name, - vscode.CompletionItemKind.Property - ); - item.detail = prop.desc; - - if (prop.name === 'children') { - item.insertText = new vscode.SnippetString('"children": {\n $0\n}'); - } else if (prop.name === 'className') { - item.insertText = new vscode.SnippetString('"className": "$1"'); - } else { - item.insertText = new vscode.SnippetString(`"${prop.name}": "$1"`); - } - - return item; - }); - } - - /** - * Get current type from document context - * Note: This is a simplified implementation. For production use, - * consider using a proper JSON parser or AST for accurate context detection. - */ - private getCurrentType( - document: vscode.TextDocument, - position: vscode.Position - ): string | null { - try { - const text = document.getText(); - const offset = document.offsetAt(position); - - // Look backwards for the nearest "type" property - const before = text.substring(Math.max(0, offset - 500), offset); - - // Find all type declarations in the context - const typeMatches = Array.from(before.matchAll(/"type"\s*:\s*"(\w+)"/g)); - - // Return the most recent one - if (typeMatches.length > 0) { - return typeMatches[typeMatches.length - 1][1]; - } - } catch (error) { - // Fail silently - just won't provide context-specific completions - console.error('Error detecting current type:', error); - } - - return null; - } -} diff --git a/ui/packages/vscode-extension/src/providers/HoverProvider.ts b/ui/packages/vscode-extension/src/providers/HoverProvider.ts deleted file mode 100644 index c095c9e5d26..00000000000 --- a/ui/packages/vscode-extension/src/providers/HoverProvider.ts +++ /dev/null @@ -1,252 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import * as vscode from 'vscode'; - -/** - * Provides hover information for Object UI schema properties - */ -export class HoverProvider implements vscode.HoverProvider { - provideHover( - document: vscode.TextDocument, - position: vscode.Position, - token: vscode.CancellationToken - ): vscode.ProviderResult { - const range = document.getWordRangeAtPosition(position); - if (!range) { - return null; - } - - const word = document.getText(range); - - // Get hover information based on the property/value - const hoverInfo = this.getHoverInfo(word, document, position); - - if (hoverInfo) { - return new vscode.Hover(hoverInfo); - } - - return null; - } - - /** - * Get hover information for a word - */ - private getHoverInfo( - word: string, - document: vscode.TextDocument, - position: vscode.Position - ): vscode.MarkdownString | null { - // Property documentation - const propertyDocs: Record = { - type: `**type** (string, required) - -The component type to render. - -Common values: -- \`div\` - Container element -- \`text\` - Text content -- \`card\` - Card component -- \`button\` - Button -- \`input\` - Input field -- \`form\` - Form container - -[View all component types](https://www.objectui.org/docs/components)`, - - className: `**className** (string) - -Tailwind CSS classes for styling the component. - -Example: -\`\`\`json -"className": "flex items-center gap-4 p-6 bg-white rounded-lg shadow" -\`\`\` - -[Tailwind CSS Documentation](https://tailwindcss.com)`, - - children: `**children** (object | array) - -Child components or content. - -Can be: -- A single component object -- An array of component objects -- For text components: a string value - -Example: -\`\`\`json -"children": [ - { "type": "text", "content": "Hello" }, - { "type": "button", "label": "Click me" } -] -\`\`\``, - - label: `**label** (string) - -Text label for form inputs and buttons. - -Example: -\`\`\`json -"label": "Email Address" -\`\`\``, - - placeholder: `**placeholder** (string) - -Placeholder text for input fields. - -Example: -\`\`\`json -"placeholder": "Enter your email..." -\`\`\``, - - required: `**required** (boolean) - -Whether the input field is required. - -Example: -\`\`\`json -"required": true -\`\`\``, - - variant: `**variant** (string) - -Style variant for components. - -For buttons: -- \`default\` - Primary button -- \`destructive\` - Danger/delete button -- \`outline\` - Outlined button -- \`secondary\` - Secondary button -- \`ghost\` - Transparent button -- \`link\` - Link-styled button`, - - inputType: `**inputType** (string) - -HTML input type. - -Common values: -- \`text\` - Text input -- \`email\` - Email input -- \`password\` - Password input -- \`number\` - Number input -- \`tel\` - Telephone input -- \`url\` - URL input -- \`date\` - Date picker`, - - title: `**title** (string) - -Title text for components like cards, modals, etc. - -Example: -\`\`\`json -"title": "User Settings" -\`\`\``, - - description: `**description** (string) - -Description or subtitle text. - -Example: -\`\`\`json -"description": "Manage your account settings" -\`\`\``, - - content: `**content** (string) - -Text content for text components. - -Example: -\`\`\`json -"content": "Welcome to Object UI!" -\`\`\``, - }; - - const doc = propertyDocs[word]; - if (doc) { - return new vscode.MarkdownString(doc); - } - - // Component type documentation - const componentDocs: Record = { - div: `**div** - Container Component - -A flexible container for grouping other components. - -Example: -\`\`\`json -{ - "type": "div", - "className": "flex gap-4 p-6", - "children": [...] -} -\`\`\``, - - card: `**card** - Card Component - -A card container with optional title and description. - -Example: -\`\`\`json -{ - "type": "card", - "title": "Card Title", - "description": "Card description", - "children": {...} -} -\`\`\``, - - button: `**button** - Button Component - -An interactive button element. - -Example: -\`\`\`json -{ - "type": "button", - "label": "Click Me", - "variant": "default" -} -\`\`\``, - - input: `**input** - Input Component - -A form input field. - -Example: -\`\`\`json -{ - "type": "input", - "label": "Email", - "inputType": "email", - "placeholder": "your@email.com", - "required": true -} -\`\`\``, - - text: `**text** - Text Component - -Display text content. - -Example: -\`\`\`json -{ - "type": "text", - "content": "Hello World", - "className": "text-lg font-bold" -} -\`\`\``, - }; - - const componentDoc = componentDocs[word]; - if (componentDoc) { - return new vscode.MarkdownString(componentDoc); - } - - return null; - } -} diff --git a/ui/packages/vscode-extension/src/providers/PreviewProvider.ts b/ui/packages/vscode-extension/src/providers/PreviewProvider.ts deleted file mode 100644 index 1de2da0fc15..00000000000 --- a/ui/packages/vscode-extension/src/providers/PreviewProvider.ts +++ /dev/null @@ -1,325 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import * as vscode from 'vscode'; - -/** - * Provides live preview of Object UI schemas - */ -export class PreviewProvider { - private panels: Map = new Map(); - private context: vscode.ExtensionContext; - - constructor(context: vscode.ExtensionContext) { - this.context = context; - } - - /** - * Show preview for a schema file - */ - async showPreview(uri: vscode.Uri, toSide: boolean) { - const panelKey = uri.toString(); - let panel = this.panels.get(panelKey); - - if (panel) { - panel.reveal( - toSide ? vscode.ViewColumn.Beside : vscode.ViewColumn.One - ); - } else { - panel = vscode.window.createWebviewPanel( - 'objectui.preview', - `Preview: ${vscode.workspace.asRelativePath(uri)}`, - toSide ? vscode.ViewColumn.Beside : vscode.ViewColumn.One, - { - enableScripts: true, - retainContextWhenHidden: true, - } - ); - - this.panels.set(panelKey, panel); - - panel.onDidDispose(() => { - this.panels.delete(panelKey); - }); - - // Update preview content - await this.updatePreviewContent(panel, uri); - - // Watch for changes - const watcher = vscode.workspace.createFileSystemWatcher(uri.fsPath); - watcher.onDidChange(async () => { - await this.updatePreviewContent(panel!, uri); - }); - - panel.onDidDispose(() => { - watcher.dispose(); - }); - } - - return panel; - } - - /** - * Update preview for a specific URI - */ - async updatePreview(uri: vscode.Uri) { - const panelKey = uri.toString(); - const panel = this.panels.get(panelKey); - - if (panel) { - await this.updatePreviewContent(panel, uri); - } - } - - /** - * Update webview content - */ - private async updatePreviewContent( - panel: vscode.WebviewPanel, - uri: vscode.Uri - ) { - try { - const document = await vscode.workspace.openTextDocument(uri); - const schemaText = document.getText(); - - // Validate JSON - let schema; - try { - schema = JSON.parse(schemaText); - } catch (error) { - panel.webview.html = this.getErrorHtml( - `Invalid JSON: ${error instanceof Error ? error.message : String(error)}` - ); - return; - } - - panel.webview.html = this.getPreviewHtml(schema, schemaText); - } catch (error) { - panel.webview.html = this.getErrorHtml( - `Failed to load schema: ${error instanceof Error ? error.message : String(error)}` - ); - } - } - - /** - * Generate preview HTML - */ - private getPreviewHtml(schema: any, schemaText: string): string { - const schemaJson = JSON.stringify(schema, null, 2); - - return ` - - - - - Object UI Preview - - - - -
-
-
- - - -`; - } - - /** - * Generate error HTML - */ - private getErrorHtml(message: string): string { - return ` - - - - - Error - - - -
-

Preview Error

-

${message}

-
- -`; - } - - /** - * Dispose all panels - */ - dispose() { - this.panels.forEach((panel) => panel.dispose()); - this.panels.clear(); - } -} diff --git a/ui/packages/vscode-extension/src/providers/SchemaValidator.ts b/ui/packages/vscode-extension/src/providers/SchemaValidator.ts deleted file mode 100644 index 62b8b9919c5..00000000000 --- a/ui/packages/vscode-extension/src/providers/SchemaValidator.ts +++ /dev/null @@ -1,350 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import * as vscode from 'vscode'; - -/** - * The child-list spelling objectui#6771 retired. Spelled here rather than - * imported: this package ships to the extension host with no `@object-ui/*` - * runtime dependency, which is the same reason it has no zod tier to lean on. - * `sdui-parser` exports the same constant as `RETIRED_CHILD_LIST_KEY`, and - * `__tests__/body-dialect-children-arm-7181.test.ts` pins the two together by - * reading both literals off disk — see its `the two spellings cannot drift` - * case. ⛔ Do not change this string without that test going red. - */ -const RETIRED_CHILD_LIST_KEY = 'body'; - -/** - * Node types that declare `body` as their OWN input, where the key is not the - * retired child-list spelling and a retirement warning would be a FALSE - * POSITIVE. - * - * Measured, not guessed — grep the registrations under every package `src` - * directory for a declared input named `body`, excluding tests. ⛔ The glob is - * spelled in words on purpose: written literally it contains the two characters - * that END a block comment, which silently truncates this docblock and leaves the - * rest of the file as stray tokens — caught here by the pin that evaluates this - * very source. The only survivor after objectui#6771 moved - * `tooltip` and `page` to `children` is `record:alert`, whose `body` is a text - * field taking an inline translation map (`plugin-detail`, registered under the - * `record` namespace). This is the same carve-out the parser tier gets for free - * by asking inside its `!input` branch; this host has no manifest, so the set is - * spelled out. - * - * ⚠️ A SNAPSHOT WITH NO GATE BEHIND IT. Nothing re-derives this set, so a - * registration that starts declaring `body` will draw a false warning here until - * someone adds it. That is stated rather than left to be discovered, and it is - * the reason the set is kept to what was measured rather than widened on a guess. - */ -const TYPES_DECLARING_OWN_BODY: ReadonlySet = new Set(['record:alert']); - -/** - * Validates Object UI schemas - */ -export class SchemaValidator { - private diagnosticCollection: vscode.DiagnosticCollection; - - constructor() { - this.diagnosticCollection = - vscode.languages.createDiagnosticCollection('objectui'); - } - - /** - * Validate a document - */ - async validateDocument(document: vscode.TextDocument): Promise { - const diagnostics: vscode.Diagnostic[] = []; - - try { - const text = document.getText(); - - // Parse JSON - let schema; - try { - schema = JSON.parse(text); - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - const match = errorMessage.match(/position (\d+)/); - const position = match ? parseInt(match[1]) : 0; - const pos = document.positionAt(position); - - diagnostics.push( - new vscode.Diagnostic( - new vscode.Range(pos, pos), - `Invalid JSON: ${errorMessage}`, - vscode.DiagnosticSeverity.Error - ) - ); - - this.diagnosticCollection.set(document.uri, diagnostics); - return; - } - - // Validate schema structure - this.validateSchema(schema, diagnostics, document); - - this.diagnosticCollection.set(document.uri, diagnostics); - - if (diagnostics.length === 0) { - vscode.window.setStatusBarMessage( - '$(check) Schema is valid', - 3000 - ); - } - } catch (error) { - vscode.window.showErrorMessage( - `Validation error: ${error instanceof Error ? error.message : String(error)}` - ); - } - } - - /** - * Validate schema structure - */ - private validateSchema( - schema: any, - diagnostics: vscode.Diagnostic[], - document: vscode.TextDocument, - path: string = '' - ): void { - if (!schema || typeof schema !== 'object') { - return; - } - - // Check if type is specified - if (!schema.type) { - const range = this.findPropertyRange(document, path, 'type'); - diagnostics.push( - new vscode.Diagnostic( - range, - 'Missing required property "type"', - vscode.DiagnosticSeverity.Warning - ) - ); - } - - // Validate type-specific properties - if (schema.type) { - this.validateTypeSpecificProps(schema, diagnostics, document, path); - } - - // The retired `body` child-list spelling, answered BY NAME. - // - // ⚠️ THIS DIAGNOSTIC EXISTS BECAUSE THIS HOST HAS NO OTHER TIER. Everywhere - // else, dropping the `body` arm moves the answer UP a level and makes it - // louder: `@object-ui/types`' zod mirror refuses the key by name, so - // `objectui validate` exits 1 naming `children`. The extension host imports - // no zod, builds no manifest, and its JSON schema sets - // `additionalProperties: true` — so without the push below, retiring the arm - // would take a document that USED to draw a diagnostic here down to ZERO, - // which is a refusal going quiet in the one tool whose job is teaching the - // format. ⛔ That is the opposite of what objectui#6771 is for. - const retired = schema[RETIRED_CHILD_LIST_KEY]; - if (retired !== undefined && !TYPES_DECLARING_OWN_BODY.has(schema.type)) { - // The message does not over-describe the value, the same discipline - // `sdui-parser/src/body-dialect.ts` keeps: calling a scalar `body` a - // "child-list spelling" names a shape the author did not write. - const isChildList = typeof retired === 'object' && retired !== null; - diagnostics.push( - new vscode.Diagnostic( - this.findPropertyRange(document, path, RETIRED_CHILD_LIST_KEY), - isChildList - ? `"${RETIRED_CHILD_LIST_KEY}" is a retired child-list spelling — author "children" instead (objectui#6771)` - : `"${RETIRED_CHILD_LIST_KEY}" is a retired key — the child-list key is "children" (objectui#6771)`, - vscode.DiagnosticSeverity.Warning - ) - ); - } - - // The push above is GATED on `TYPES_DECLARING_OWN_BODY` rather than firing - // on every node: a `record:alert` authored with its declared translation-map - // `body` is not writing the retired spelling, and warning about it would be - // the false diagnostic objectui#6771 exists to remove, reintroduced one host - // over. ⚠️ The set is a measured snapshot with nothing re-deriving it — see - // its own docblock. - - // Recursively validate children. - // - // `children` is the one child-list spelling. This guard once named - // `schema.body` ALONE, so an author writing the declared spelling had - // every child silently skipped by this recursion — no diagnostic, no - // refusal, just an unvisited subtree (objectui#7181 added the `children` - // arm). objectui#6771 then retired `body` itself, so the second arm went - // with it: a `body`-spelled document has no child list for this recursion - // to walk, and the push above is what keeps that from being silent. - const childList = schema.children; - if (childList) { - const children = Array.isArray(childList) ? childList : [childList]; - children.forEach((child: any, index: number) => { - this.validateSchema( - child, - diagnostics, - document, - `${path}.children[${index}]` - ); - }); - } - } - - /** - * Validate type-specific properties - */ - private validateTypeSpecificProps( - schema: any, - diagnostics: vscode.Diagnostic[], - document: vscode.TextDocument, - path: string - ): void { - const type = schema.type; - - // Validate input types - if (type === 'input' && schema.inputType) { - const validTypes = [ - 'text', - 'email', - 'password', - 'number', - 'tel', - 'url', - 'search', - 'date', - 'time', - 'datetime-local', - ]; - - if (!validTypes.includes(schema.inputType)) { - const range = this.findPropertyRange(document, path, 'inputType'); - diagnostics.push( - new vscode.Diagnostic( - range, - `Invalid inputType "${schema.inputType}". Must be one of: ${validTypes.join(', ')}`, - vscode.DiagnosticSeverity.Warning - ) - ); - } - } - - // Validate button variants — the `button` component draws the Button - // primitive, whose destructive arm is its own word, `destructive`. - if (type === 'button' && schema.variant) { - const validVariants = [ - 'default', - 'destructive', - 'outline', - 'secondary', - 'ghost', - 'link', - ]; - - if (!validVariants.includes(schema.variant)) { - const range = this.findPropertyRange(document, path, 'variant'); - diagnostics.push( - new vscode.Diagnostic( - range, - `Invalid variant "${schema.variant}". Must be one of: ${validVariants.join(', ')}`, - vscode.DiagnosticSeverity.Warning - ) - ); - } - } - - // Validate action block variants — the action blocks speak the action - // dialect: the destructive arm is `danger`, the word `ActionSchema.variant` - // uses, and `destructive` is refused (objectstack#26779). `primary` is - // accepted on `action:button`, `action:icon` and each container member, - // not on a container's own trigger. - const ACTION_BLOCK_VARIANTS = ['default', 'danger', 'outline', 'secondary', 'ghost', 'link']; - const ACTION_CONTAINER_TYPES = ['action:group', 'action:menu']; - const validateActionVariant = (variant: unknown, at: string, allowPrimary: boolean) => { - if (variant === undefined) return; - const valid = allowPrimary ? [...ACTION_BLOCK_VARIANTS, 'primary'] : ACTION_BLOCK_VARIANTS; - if (typeof variant === 'string' && valid.includes(variant)) return; - const range = this.findPropertyRange(document, at, 'variant'); - const hint = variant === 'destructive' ? " `destructive` was renamed `danger` on the action blocks: write variant: 'danger'." : ''; - diagnostics.push( - new vscode.Diagnostic( - range, - `Invalid variant "${String(variant)}". Must be one of: ${valid.join(', ')}.${hint}`, - vscode.DiagnosticSeverity.Warning - ) - ); - }; - if (type === 'action:button' || type === 'action:icon') { - validateActionVariant(schema.variant, path, true); - } - if (ACTION_CONTAINER_TYPES.includes(type)) { - validateActionVariant(schema.variant, path, false); - if (Array.isArray(schema.actions)) { - schema.actions.forEach((member: any, index: number) => { - if (member && typeof member === 'object') { - validateActionVariant(member.variant, `${path}.actions[${index}]`, true); - } - }); - } - } - - // Warn about missing labels for form inputs - if ( - (type === 'input' || type === 'textarea' || type === 'select') && - !schema.label - ) { - const range = this.findPropertyRange(document, path, 'type'); - diagnostics.push( - new vscode.Diagnostic( - range, - `Consider adding a "label" property for accessibility`, - vscode.DiagnosticSeverity.Information - ) - ); - } - } - - /** - * Find the range of a property in the document - * Note: This is a simplified implementation that returns a default range. - * TODO: For production use, implement proper JSON parsing to find exact property locations. - * Consider using a JSON parser with position tracking or VSCode's built-in JSON language service. - */ - private findPropertyRange( - document: vscode.TextDocument, - path: string, - property: string - ): vscode.Range { - try { - // Attempt to find the property in the document - const text = document.getText(); - const searchPattern = new RegExp(`"${property}"\\s*:`); - const match = searchPattern.exec(text); - - if (match && match.index !== undefined) { - const pos = document.positionAt(match.index); - return new vscode.Range(pos, pos.translate(0, property.length + 2)); - } - } catch (error) { - // If we can't find it, fall back to the beginning - console.error('Error finding property range:', error); - } - - // Fallback: return the start of the document - return new vscode.Range(0, 0, 0, 1); - } - - /** - * Clear diagnostics - */ - clear(): void { - this.diagnosticCollection.clear(); - } - - /** - * Dispose - */ - dispose(): void { - this.diagnosticCollection.dispose(); - } -} diff --git a/ui/packages/vscode-extension/syntaxes/objectui.tmLanguage.json b/ui/packages/vscode-extension/syntaxes/objectui.tmLanguage.json deleted file mode 100644 index 000bb5fccfc..00000000000 --- a/ui/packages/vscode-extension/syntaxes/objectui.tmLanguage.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "scopeName": "source.json.objectui", - "patterns": [ - { - "include": "source.json" - }, - { - "match": "\"(type|className|children|label|placeholder|content|title|description)\"", - "name": "keyword.other.objectui" - } - ] -} diff --git a/ui/packages/vscode-extension/tsconfig.json b/ui/packages/vscode-extension/tsconfig.json deleted file mode 100644 index aa174bfe3e7..00000000000 --- a/ui/packages/vscode-extension/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - // `node16` rather than the deprecated node10 `"node"` resolution, which - // stops working in TypeScript 7. This package has no `"type": "module"`, - // so node16 resolves it as CommonJS — the format tsup emits — and adds the - // `exports`-map awareness node10 lacks. - "module": "node16", - "moduleResolution": "node16", - "lib": ["ES2020"], - // Declared explicitly: this package runs on Node with no DOM lib, so - // `console`/`Buffer` come from @types/node rather than the ambient DOM - // globals its React-side siblings get for free. - "types": ["node", "vscode"], - "outDir": "./dist", - "rootDir": "./src", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist", "**/*.test.ts"] -} diff --git a/ui/packages/vscode-extension/tsconfig.test.json b/ui/packages/vscode-extension/tsconfig.test.json deleted file mode 100644 index 713b4c407dd..00000000000 --- a/ui/packages/vscode-extension/tsconfig.test.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - // Type-checks this package's TESTS, which `tsconfig.json` excludes. - // - // Why the exclusion exists and why it was a hole: `tsconfig.json` is the - // package BUILD (`rootDir: ./src`, `declaration`, `outDir: ./dist`), so a - // test file left in that program would emit into `dist` and ship inside the - // `.vsix`. Excluding it keeps the build honest — but until this project - // existed, no `tsc` invocation read the test at all, and an unchecked test - // can assert a contract the compiler never checked and then read as evidence - // that the contract holds. Same shape and same reason as the 35 sibling - // `tsconfig.test.json` files; `scripts/check-type-check-coverage.mjs` - // enforces the chaining off `type-check`, since a config nothing runs is the - // objectui#3009 failure itself. - "extends": "./tsconfig.json", - "compilerOptions": { - // objectui#8691: test programs only. One notch above the package build's - // ES2020, mirroring packages/app-shell. The package SOURCE tsconfig is - // untouched, so what this package SHIPS still compiles at the ES2020 - // baseline; nothing here is emitted. - "lib": ["ES2022"], - // A checking project, never an emitting one. - "noEmit": true, - "declaration": false, - "declarationMap": false, - "sourceMap": false, - // The BUILD is CommonJS (`module: node16`, no `"type": "module"`), which is - // what tsup emits for VS Code. Vitest is not that program: it loads these - // files as ESM, so `import.meta.url` — the only stable way for a test to - // locate its sibling source on disk — is legal there and TS1470 under the - // build's CommonJS target. This project therefore describes the runtime the - // tests actually run in, and the build config keeps describing the .vsix. - "module": "ESNext", - "moduleResolution": "Bundler" - }, - // Both fields are overridden, not merged: `tsconfig.json`'s `exclude` lists - // `**/*.test.ts`, so inheriting it would leave this project with no inputs — - // green, and reading nothing. - "include": ["src/**/*.test.ts"], - "exclude": ["node_modules", "dist"] -} diff --git a/ui/packages/vscode-extension/tsup.config.ts b/ui/packages/vscode-extension/tsup.config.ts deleted file mode 100644 index 7fcebd0ffa5..00000000000 --- a/ui/packages/vscode-extension/tsup.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * ObjectUI - * Copyright (c) 2024-present ObjectStack Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import { defineConfig } from 'tsup'; - -export default defineConfig({ - entry: ['src/extension.ts'], - format: ['cjs'], - target: 'node18', - outDir: 'dist', - clean: true, - sourcemap: true, - external: ['vscode'], - noExternal: ['@object-ui/types', '@object-ui/core'], -}); diff --git a/ui/scripts/__tests__/body-dialect-census.test.ts b/ui/scripts/__tests__/body-dialect-census.test.ts index 4db752d0455..3d7f5fbed13 100644 --- a/ui/scripts/__tests__/body-dialect-census.test.ts +++ b/ui/scripts/__tests__/body-dialect-census.test.ts @@ -276,7 +276,7 @@ describe('the census stays re-runnable', () => { }); describe('the `body` consumers the ruling does not enumerate', () => { - it('three generic readers outside the renderer tree read `children` ALONE — step 2 reached them', () => { + it('the generic reader outside the renderer tree reads `children` ALONE — step 2 reached it', () => { // Recorded because ruling steps 2-5 name renderers, the published type and // the tier — and these three are none of those. They read `body` for ANY // node type, so they outlive the per-registration convergence and would @@ -301,10 +301,11 @@ describe('the `body` consumers the ruling does not enumerate', () => { // readers even deferred it to that card BY NUMBER in their own comments. // The lit control stays FIRST, because "does not contain `body`" holds just // as well over a file that was renamed, emptied or moved. + // + // The two vscode readers left this list with their package: objectstack#25910 + // removed the VS Code extension from the workspace, so core is the one left. for (const reader of [ 'packages/core/src/validation/schema-validator.ts', - 'packages/vscode-extension/src/providers/SchemaValidator.ts', - 'packages/vscode-extension/src/providers/PreviewProvider.ts', ]) { const text = readCode(reader); expect(text, `${reader} — lit control: this reader still resolves a child list`) @@ -335,11 +336,11 @@ describe('the `body` consumers the ruling does not enumerate', () => { const migrated = [ 'packages/cli/src/commands/init.ts', 'packages/cli/src/commands/generate.ts', - 'packages/vscode-extension/src/extension.ts', 'packages/components/src/renderers/complex/carousel.tsx', 'packages/components/src/renderers/complex/resizable.tsx', 'packages/components/src/renderers/complex/scroll-area.tsx', // packages/runner/src/App.tsx left this list: objectui#11450 deleted the runner's fallback page, so that producer is gone. + // packages/vscode-extension/src/extension.ts left it too: objectstack#25910 removed the extension from the workspace. ]; for (const producer of migrated) { @@ -504,19 +505,11 @@ describe('the `body` consumers the ruling does not enumerate', () => { 'spelling into an author document again; ⛔ do not relax this to a range.' ).toBe(0); - // ⭐ THE SUBJECT THAT ZERO IS ABOUT, pinned BY NAME — because a shape - // assertion cannot say WHICH site left, and naming it is the handoff - // objectui#9871's prose asks for. A completion snippet is the most direct - // form a producer takes: it is inserted into the author's own document the - // moment the completion is accepted, so the author never types the spelling. - // The lit control stays and stays FIRST: "does not contain" is satisfied by - // a file that was renamed, emptied or moved. - const completion = readCode('packages/vscode-extension/src/providers/CompletionProvider.ts'); - expect(completion, 'lit control — the snippet table is being read at all').toContain( - '"className": "$1"' - ); - expect(completion).not.toContain('"body": {'); - expect(completion).toContain('"children": {'); + // ⭐ THE SUBJECT THAT ZERO WAS ABOUT used to be pinned here BY NAME: the + // VS Code extension's `CompletionProvider` snippets, read for `children` + // and not `body`. objectstack#25910 removed the extension from the + // workspace, so the named subject is gone with it; the population zero and + // its two lit controls above still hold every literal-carried producer. // ⭐ And the family question is RULED — it no longer stays open in the // instrument, and ⛔ nothing here awaits a seat. Director seat, summon #25 diff --git a/ui/scripts/__tests__/check-changeset-fixed.test.ts b/ui/scripts/__tests__/check-changeset-fixed.test.ts index f04bdcb461e..6459027612f 100644 --- a/ui/scripts/__tests__/check-changeset-fixed.test.ts +++ b/ui/scripts/__tests__/check-changeset-fixed.test.ts @@ -18,11 +18,12 @@ import { changesetConfigPath } from '../workspace-root.mjs'; * an omitted `privatePackages` defaulted to `{ version: true, tag: false }` * under v2 and defaults to `{ version: false, tag: false }` under v3, and * `version: false` marks private packages IGNORED rather than merely unbumped. - * This repo keeps one private package inside the 40-name `fixed` group — - * `object-ui` at `packages/vscode-extension`, which ships to the VS Code - * marketplace instead of npm — so under the new default a changeset naming it - * next to a published package becomes a "mixed changeset" and both - * `changeset status` and `changeset version` exit 1. + * This repo then kept one private package inside the `fixed` group — the VS + * Code extension, which shipped to the VS Code marketplace instead of npm — so + * under the new default a changeset naming it next to a published package + * became a "mixed changeset" and both `changeset status` and + * `changeset version` exited 1. The extension has since left the workspace + * (objectstack#25910); the rules stay for the next private package in `fixed`. * * The stock pending during the v3 migration contained exactly one such file, * `.changeset/no-console-lint-rule.md` (`object-ui` plus four published @@ -160,7 +161,7 @@ describe('the repository itself', () => { expect( normalizePrivatePackages(config.privatePackages), 'An omitted key means `{ version: true, tag: false }` under @changesets/cli@2 and ' + - '`{ version: false, tag: false }` under v3 — opposite answers to "does object-ui ' + + '`{ version: false, tag: false }` under v3 — opposite answers to "does a private package ' + 'release?". Write it down.' ).not.toBeNull(); }); @@ -176,13 +177,13 @@ describe('the repository itself', () => { ).toEqual([]); }); - it('still keeps the private VS Code extension inside the fixed group', () => { - // The shape the two rules above exist for. If this ever stops being true the - // guard is not wrong, but it is no longer guarding anything real — and the - // rationale in both files should be re-read before it is trimmed. - const vscode = manifests.find((m) => m.path === 'packages/vscode-extension/package.json'); - expect(vscode?.name).toBe('object-ui'); - expect(vscode?.private).toBe(true); - expect((config.fixed ?? []).flat()).toContain('object-ui'); + it('puts no private package inside the fixed group', () => { + // The VS Code extension was the one private member, and it left the + // workspace (objectstack#25910). A private package that re-enters the group + // must arrive with a ruling and a row in the root gate's + // PRIVATE_FIXED_MEMBERS (`scripts/check-changeset-fixed.mjs`); this pin + // makes that arrival a deliberate edit here too. + const fixed = new Set((config.fixed ?? []).flat()); + expect(manifests.filter((m) => m.private && fixed.has(m.name)).map((m) => `${m.name} (${m.path})`)).toEqual([]); }); }); diff --git a/ui/scripts/__tests__/check-doc-component-types.test.ts b/ui/scripts/__tests__/check-doc-component-types.test.ts index db9a7ca0343..14236c2d9a9 100644 --- a/ui/scripts/__tests__/check-doc-component-types.test.ts +++ b/ui/scripts/__tests__/check-doc-component-types.test.ts @@ -1793,10 +1793,12 @@ describe('the three snippets this gate found on its first run stay fixed', () => // ordinary docs edit. const read = (rel: string) => fs.readFileSync(path.join(repoRoot, rel), 'utf8'); - it('`heading` is gone from the two page schemas that taught it', () => { + it('`heading` is gone from the page schema that taught it', () => { // Nothing registers `heading`. `h1` is registered by `html-elements.tsx`'s - // TAGS loop and renders `schema.children`, which is what both snippets want. - for (const file of ['content/docs/utilities/runner.mdx', 'content/docs/utilities/vscode-extension.mdx']) { + // TAGS loop and renders `schema.children`, which is what the snippet wants. + // The second page that taught it, the VS Code extension's, was deleted with + // that package (objectstack#25910). + for (const file of ['content/docs/utilities/runner.mdx']) { const body = read(file); expect(body, `${file} still teaches the unregistered \`heading\` type`).not.toContain('"type": "heading"'); expect(body).toContain('"type": "h1"'); diff --git a/ui/scripts/__tests__/check-doc-links.test.ts b/ui/scripts/__tests__/check-doc-links.test.ts index a2bc9495004..1d2d9094d0a 100644 --- a/ui/scripts/__tests__/check-doc-links.test.ts +++ b/ui/scripts/__tests__/check-doc-links.test.ts @@ -536,7 +536,10 @@ describe('the repo it guards', () => { // the packages/* population from 12 to 11. The floor moves down by exactly // that one deliberate deletion — it still fails if the scanner itself // stops walking the tree, which is what this row guards. - expect(scanned['packages/*']).toBeGreaterThanOrEqual(11); + // objectstack#25910 removed the whole VS Code extension package and its + // three remaining documents with it (`DESIGN.md`, `ICON.md`, + // `PUBLISHING.md`), taking the population from 11 to 8 by the same rule. + expect(scanned['packages/*']).toBeGreaterThanOrEqual(8); expect(scanned['apps/*']).toBeGreaterThanOrEqual(3); // objectui#6026. Four nested READMEs today, all under `packages/*`; the // `apps/*` side of the pair is deliberately empty, which is why it gets NO @@ -1388,7 +1391,9 @@ describe("this site's own absolute URLs are resolved as internal routes — obje // fixtures. objectui#3622 took the total to 58 by adding a surface that // writes 47 of them; the floors below stay at #3603's measurement, since // they exist to pin THAT card's minimum and the new root has its own floor - // in the last describe. + // in the last describe. objectstack#25910 deleted one of the six + // `content/docs` ones with the VS Code extension's page, so that floor + // moves down by exactly that deletion, to 5. const seen: { root: string; route: string }[] = []; for (const root of SCAN_ROOTS as { path: string }[]) { for (const file of collectFiles(path.join(repoRoot, root.path)) as string[]) { @@ -1400,7 +1405,7 @@ describe("this site's own absolute URLs are resolved as internal routes — obje } expect(seen.length).toBeGreaterThanOrEqual(11); - expect(seen.filter((item) => item.root === 'content/docs').length).toBeGreaterThanOrEqual(6); + expect(seen.filter((item) => item.root === 'content/docs').length).toBeGreaterThanOrEqual(5); expect(seen.filter((item) => item.route.startsWith('/docs')).length).toBeGreaterThanOrEqual(3); }); }); @@ -1544,8 +1549,12 @@ describe('packages/*/README.md joined the disk surface — objectui#3622', () => // from the archived objectui repository's CONTRIBUTING.md / ROADMAP.md (a // self-repo URL this gate resolves) to the objectstack repository's, which // it cannot resolve offline, so they left the decidable count. - expect(decidable.length).toBeGreaterThanOrEqual(135); - expect(siteAbsolute.length).toBeGreaterThanOrEqual(40); + // 126 / 39 measured on objectstack#25910's merge of main: that card removed + // the VS Code extension package, whose README carried 12 / 8 of them, and + // objectstack#27042 (c59b1bfa) retired `@object-ui/plugin-ai`, whose README + // carried 3 / 1 more. Both floors move down by exactly those deletions. + expect(decidable.length).toBeGreaterThanOrEqual(126); + expect(siteAbsolute.length).toBeGreaterThanOrEqual(39); }); }); @@ -1776,8 +1785,10 @@ describe('objectui#4938 — the rest of each package/app directory', () => { ]; // objectui#5965 removed `packages/vscode-extension/SUMMARY.md`, so the // combined population is 14 (11 + 3) rather than the 15 measured when the - // row landed. Still a floor, for the reasoning above. - expect(files.length).toBeGreaterThanOrEqual(14); + // row landed. Still a floor, for the reasoning above. objectstack#25910 + // removed the VS Code extension package and its three documents, so 11 + // (8 + 3). + expect(files.length).toBeGreaterThanOrEqual(11); let decidable = 0; for (const file of files) { @@ -1792,7 +1803,9 @@ describe('objectui#4938 — the rest of each package/app directory', () => { // `packages/vscode-extension/DESIGN.md` carried into the tree's folded // ROADMAP.md / CONTRIBUTING.md at the repository root's, which a relative // path cannot reach from inside `ui/`, so they are URLs this gate does not judge. - expect(decidable).toBeGreaterThanOrEqual(2); + // 1 after objectstack#25910 deleted the VS Code extension package, whose + // `DESIGN.md` carried the other. + expect(decidable).toBeGreaterThanOrEqual(1); }); }); diff --git a/ui/scripts/__tests__/check-doc-snippet-emitted-census.test.ts b/ui/scripts/__tests__/check-doc-snippet-emitted-census.test.ts index 5fcf155ec0f..803ca488c03 100644 --- a/ui/scripts/__tests__/check-doc-snippet-emitted-census.test.ts +++ b/ui/scripts/__tests__/check-doc-snippet-emitted-census.test.ts @@ -339,18 +339,20 @@ describe('the census reports what it cannot see, and separates its own artefacts expect(summary).toContain('Diagnostics'); }); - it('keys the per-package split by DIRECTORY as well as name — on this tree they disagree', () => { + it('keys the per-package split by DIRECTORY as well as name — the two can disagree', () => { + // The tree's own case (the VS Code extension, directory and name apart) left + // the workspace with objectstack#25910; the fixture keeps the shape. expect( - emittingPackageOf('packages/vscode-extension/src/extension.ts', { - 'object-ui': 'packages/vscode-extension', + emittingPackageOf('packages/editor-ext/src/extension.ts', { + 'ext-x': 'packages/editor-ext', }), - 'packages/vscode-extension publishes as `object-ui`; a split keyed on the name alone ' + + 'packages/editor-ext publishes as `ext-x`; a split keyed on the name alone ' + 'prints a row nobody can find on disk', - ).toBe('packages/vscode-extension (object-ui)'); + ).toBe('packages/editor-ext (ext-x)'); }); }); -describe('on this repository — the walk is non-vacuous and reaches both known members', () => { +describe('on this repository — the walk is non-vacuous and reaches the known member', () => { const census = emittedCensus({ root: repoRoot }) as unknown as { files: string[]; excludedAsTooling: string[]; @@ -368,13 +370,10 @@ describe('on this repository — the walk is non-vacuous and reaches both known expect(census.templatesSeen).toBeGreaterThan(500); }); - it('recognises at least the two members objectui#7864 names', () => { + it('recognises the member objectui#7864 names that is still in the tree', () => { + // objectui#7864 named two. The other, `packages/vscode-extension/src/extension.ts` + // (fixed by PR objectui#7863), left with its package in objectstack#25910. const sites = new Set(census.recognised.map((r) => r.file)); - expect( - sites, - 'PR objectui#7863 fixed this one; the census must still SEE it, or nothing would notice ' + - 'the phantom import coming back', - ).toContain('packages/vscode-extension/src/extension.ts'); expect( sites, 'objectui#7472 is the known UNFIXED member. The card requires the census to show it; ' + diff --git a/ui/scripts/__tests__/check-published-dist-tooling.test.ts b/ui/scripts/__tests__/check-published-dist-tooling.test.ts index 37ba1f1d113..ebd4e43f298 100644 --- a/ui/scripts/__tests__/check-published-dist-tooling.test.ts +++ b/ui/scripts/__tests__/check-published-dist-tooling.test.ts @@ -441,7 +441,7 @@ describe('discoverPublishedPackages', () => { it('drops packages npm never receives, and keeps the ones under apps/', () => { const root = makeWorkspace({ 'packages/core': { name: '@object-ui/core' }, - 'packages/vscode-extension': { name: 'object-ui', private: true }, + 'packages/editor-ext': { name: 'ext-x', private: true }, 'apps/console': { name: '@object-ui/console' }, }); expect(discoverPublishedPackages(root).map((p: { name: string }) => p.name)).toEqual([ @@ -461,9 +461,10 @@ describe('discoverPublishedPackages', () => { }); it('excludes THIS repository’s private fixed-group member by name', () => { - // `packages/vscode-extension` is named `object-ui`, is in the fixed group - // (changesets versions it) and is `private`. Reading the fixed group alone - // would put an unpublishable package in scope. + // `object-ui` (the VS Code extension) was in the fixed group and `private` + // until objectstack#25910 removed it; the pin keeps the name out of scope + // should it return. Reading the fixed group alone would put an + // unpublishable package in scope. const names = discoverPublishedPackages(repoRoot).map((p: { name: string }) => p.name); expect(names).not.toContain('object-ui'); expect(names).toContain('@object-ui/console'); diff --git a/ui/scripts/__tests__/check-unused-dependencies.test.ts b/ui/scripts/__tests__/check-unused-dependencies.test.ts index aa2d460befa..21ed60fff77 100644 --- a/ui/scripts/__tests__/check-unused-dependencies.test.ts +++ b/ui/scripts/__tests__/check-unused-dependencies.test.ts @@ -401,14 +401,15 @@ describe('this repository', () => { expect(findings).toEqual([]); }); - it('allows exactly the four rows the gate landed with, each still verifying', () => { + it('allows exactly the two rows left of the four the gate landed with, each still verifying', () => { + // The VS Code extension's two bundler-inlined rows left with that package + // (objectstack#25910), as the gate's rule 3 requires of a row with no subject. expect( Object.fromEntries( Object.entries(DECLARED_WITHOUT_IMPORT).map(([pkg, rows]) => [pkg, Object.keys(rows).sort()]), ), ).toEqual({ '@object-ui/cli': ['@object-ui/components', '@object-ui/react'], - 'object-ui': ['@object-ui/core', '@object-ui/types'], }); }); diff --git a/ui/scripts/__tests__/doc-version-claims.test.ts b/ui/scripts/__tests__/doc-version-claims.test.ts index 0affcb7dc00..7d99522a99c 100644 --- a/ui/scripts/__tests__/doc-version-claims.test.ts +++ b/ui/scripts/__tests__/doc-version-claims.test.ts @@ -300,7 +300,7 @@ import { labelPath, skillBundleBase, skillsWalk } from '../skill-bundle-root.mjs * NOT ONE of the four earned an inventory entry, and that is the half of this change * worth carrying forward. They were not a floor this project declares — of the 46 * workspace manifests, ZERO declare `engines.node` or `engines.pnpm`, the only - * `engines` block outside the root being `packages/vscode-extension`'s `engines.vscode` + * `engines` block outside the root being the VS Code extension's `engines.vscode` * — and not one it tests: 26 of the 27 `node-version:` declarations in * `.github/workflows` read `'22.x'` and the 27th reads `'22'`, so nothing anywhere runs * the Node 20 those bullets named. A number a reader will act on, restating no manifest diff --git a/ui/scripts/__tests__/package-files-exist.test.ts b/ui/scripts/__tests__/package-files-exist.test.ts index e70e46afd78..f48b7642b16 100644 --- a/ui/scripts/__tests__/package-files-exist.test.ts +++ b/ui/scripts/__tests__/package-files-exist.test.ts @@ -373,8 +373,8 @@ describe('package.json `files` entries exist on disk (objectui#3663)', () => { * * `!private && license` — the two conditions that together turn "MIT" from a * label into an obligation. A private package makes no distribution and owes no - * text (`object-ui`, the vscode-extension, is exactly that case and is excluded - * on purpose). A package declaring no license at all is a different defect that + * text (`@object-ui/test-support` is exactly that case and is excluded on + * purpose). A package declaring no license at all is a different defect that * this guard deliberately does not invent a verdict about. * * The population is DERIVED from the same workspace scan as the guard above, so @@ -479,7 +479,7 @@ describe('published packages that declare a license ship its text (objectui#3696 ' cp LICENSE /LICENSE # all 38 are byte-identical, blob cf2ca285', '', 'If the package should NOT be published, mark it `"private": true` instead — that is the', - 'other true direction, and it is why `object-ui` (the vscode-extension) is not listed here.', + 'other true direction, and it is why `@object-ui/test-support` is not listed here.', '', ...violations, ].join('\n'), @@ -562,8 +562,8 @@ describe('published packages that declare a license ship its text (objectui#3696 // The `private` limb only means something while some private package would // otherwise be reported. Asserting the specimen set is NON-EMPTY first is // what keeps this from becoming a test that passes because it examines - // nothing — today it is `object-ui` (packages/vscode-extension), which - // declares "MIT" and has no LICENSE file. + // nothing — today it is `@object-ui/test-support`, which declares "MIT" + // and has no LICENSE file. const privateOwingIfPublished = packages.filter( (p) => p.private && p.license !== undefined && licenseTextFiles(p).length === 0, ); diff --git a/ui/scripts/__tests__/quick-reference-commands-4149.test.ts b/ui/scripts/__tests__/quick-reference-commands-4149.test.ts index aa5187210e9..ff7f3684e6d 100644 --- a/ui/scripts/__tests__/quick-reference-commands-4149.test.ts +++ b/ui/scripts/__tests__/quick-reference-commands-4149.test.ts @@ -384,8 +384,8 @@ describe('the UI workspace guide — the published-package count is not written /** * The row used to state the count ("39 published packages", later 36, then 35), and * this test derived the true number to hold the prose to it. The first hand-written - * figure counted directories and missed that `packages/vscode-extension` (published - * to the VS Code marketplace, not to npm) is `private: true` — off by one, in the + * figure counted directories and missed that the VS Code extension (published to + * the VS Code marketplace, not to npm; removed since, objectstack#25910) was `private: true` — off by one, in the * direction that overstates. Holding it exact then cost a doc edit on every package * retirement, for a number the manifests already answer (`private` in each one). So * the row names the published packages without counting them, and this test keeps it diff --git a/ui/scripts/check-changeset-fixed.mjs b/ui/scripts/check-changeset-fixed.mjs index 7a603c62160..5d6cc72ccc9 100644 --- a/ui/scripts/check-changeset-fixed.mjs +++ b/ui/scripts/check-changeset-fixed.mjs @@ -13,10 +13,11 @@ * * Rule 1 is the original one and is version-agnostic. Rules 2 and 3 exist * because `@changesets/cli@3` changed what an ABSENT `privatePackages` means, - * and this repo has a private package inside the `fixed` group — `object-ui` - * (`packages/vscode-extension`), private because it ships to the VS Code - * marketplace rather than npm, but versioned in lockstep with the 39 - * publishable packages so its version keeps matching the runtime it embeds. + * and this repo then had a private package inside the `fixed` group — the VS + * Code extension, versioned in lockstep with the publishable packages. That + * package has since left the workspace (objectstack#25910), but `fixed` plus + * `privatePackages.version` is still the contradiction rule 3 refuses, for the + * next private package anyone puts in the group. * * What changed, measured against `@changesets/config@4.0.0` rather than * recalled: an omitted `privatePackages` used to default to diff --git a/ui/scripts/check-changeset-presence.mjs b/ui/scripts/check-changeset-presence.mjs index f3a35f13639..166f66139f4 100644 --- a/ui/scripts/check-changeset-presence.mjs +++ b/ui/scripts/check-changeset-presence.mjs @@ -665,9 +665,10 @@ export function readReleaseConfig(root) { * produce two different guarded surfaces. * * A package with NO `files` field publishes its whole directory. That is not read - * as "everything counts": the one such package here (`packages/vscode-extension`) - * is `private: true` and reaches no registry, and taking the absent field as a - * blanket would guard every tsconfig and doc page in it. Absent means clause (c) + * as "everything counts": such a package that is `private: true` reaches no + * registry (the VS Code extension was the case here until objectstack#25910 + * removed it), and taking the absent field as a blanket would guard every + * tsconfig and doc page in it. Absent means clause (c) * matches nothing, and clauses (a) and (b) still apply. */ function publishedEntries(manifest) { diff --git a/ui/scripts/check-doc-example-types.mjs b/ui/scripts/check-doc-example-types.mjs index cf9dd4bcb43..23b9d76ed80 100644 --- a/ui/scripts/check-doc-example-types.mjs +++ b/ui/scripts/check-doc-example-types.mjs @@ -224,14 +224,14 @@ * * - The extraction the card imagines ALREADY EXISTS and already runs on this * exact tree. `--emit-census` reports 20 recognised templates across - * `packages/cli`, `packages/create-plugin` and `packages/vscode-extension`, - * compiled through the same `compileSnippets()`. Building a second extractor + * `packages/cli`, `packages/create-plugin` and the since-removed VS Code + * extension (objectstack#25910), compiled through the same `compileSnippets()`. Building a second extractor * here would put two readers on one population, which is how the two answers * start disagreeing. * - objectui#7977 is CLOSED (by objectui#8112, which corrected the prose). * - objectui#7976's residue is NOT a template-parsing problem. It is - * `packages/vscode-extension/DESIGN.md` holding a hand-copied MIRROR of a - * template's text. Compiling the template — which `--emit-census` already + * the VS Code extension's `DESIGN.md` holding a hand-copied MIRROR of a + * template's text (both left the workspace with objectstack#25910). Compiling the template — which `--emit-census` already * does, at 0 diagnostics — says nothing about whether the mirror still * matches it. That card needs an equality pin between two texts, which is a * different instrument from a type-checker and belongs on that card. diff --git a/ui/scripts/check-doc-links.mjs b/ui/scripts/check-doc-links.mjs index 184daeb4b0b..602ef29603a 100644 --- a/ui/scripts/check-doc-links.mjs +++ b/ui/scripts/check-doc-links.mjs @@ -286,7 +286,7 @@ * `/docs/layout`, twice (real directories with no index page, so no route); * `/docs/types` and `/examples` (neither exists); and two disk paths that were * simply absent (a `docs/SHADCN_SYNC.md` that has never existed, and a - * per-package `LICENSE` that `packages/vscode-extension` does not have). + * per-package `LICENSE` the VS Code extension package never had). * * All eleven were repointed at a page or path that does exist, in the same PR as * this row — none had to be dropped, unlike #3603's 9, where 6 assumed a whole diff --git a/ui/scripts/check-doc-snippet-types.mjs b/ui/scripts/check-doc-snippet-types.mjs index d5d2fc871d2..be006823f02 100644 --- a/ui/scripts/check-doc-snippet-types.mjs +++ b/ui/scripts/check-doc-snippet-types.mjs @@ -2175,11 +2175,12 @@ export function compileSnippets({ * read by nothing: `tsc` sees a STRING, `tsup` copies it through, and every doc * gate's scan surface — this one's `listDocuments()` included — stops at * `content/docs`, the per-app docs trees and the package READMEs. The class has - * two known members. `packages/vscode-extension/src/extension.ts`'s - * `generateReactComponent()` emitted a phantom `registerDefaultRenderers` - * import into every file the *Export to React* command ever wrote for a user - * (fixed by PR objectui#7863, measured there as `tsc` exit 2 / TS2305 on the - * emitted file); `packages/cli/src/utils/app-generator.ts` is objectui#7472, + * two known members. The VS Code extension's `generateReactComponent()` + * emitted a phantom `registerDefaultRenderers` import into every file the + * *Export to React* command ever wrote for a user (fixed by PR objectui#7863, + * measured there as `tsc` exit 2 / TS2305 on the emitted file; the package + * left the workspace with objectstack#25910); + * `packages/cli/src/utils/app-generator.ts` is objectui#7472, * still open and still unfixed. * * ⭐ REPORT-ONLY, and the CENSUS is the deliverable. The card's binding @@ -2895,8 +2896,9 @@ export function deriveEmittedManifestPaths(root = repoRoot, byPackage = {}, pack * Both halves, because on this corpus neither is enough on its own: the * directory is what the walk collected and what a reader greps for, and the * manifest name is what the rest of this gate's output is keyed by — and they - * disagree. `packages/vscode-extension` publishes under the name `object-ui`, - * so a split keyed on the name alone prints a row nobody can find on disk. + * can disagree (the VS Code extension's `object-ui` did, until objectstack#25910 + * removed it), so a split keyed on the name alone prints a row nobody can find + * on disk. * * @param {string} file * @param {Record} packageDirOf diff --git a/ui/scripts/check-phantom-dependencies.mjs b/ui/scripts/check-phantom-dependencies.mjs index 6a24ce309e0..8d613cc0867 100644 --- a/ui/scripts/check-phantom-dependencies.mjs +++ b/ui/scripts/check-phantom-dependencies.mjs @@ -149,9 +149,11 @@ * - **Host-provided modules are declared in `HOST_PROVIDED`,** with the * evidence each one requires. `vscode` is the specimen: it is injected by * the extension host, is not on npm as a runtime package, and declaring it - * as a dependency would be the mistake. `packages/vscode-extension` earns - * the exemption by declaring `@types/vscode` AND `engines.vscode` — checked - * on every run, so the exemption cannot outlive its evidence. + * as a dependency would be the mistake. A package earns the exemption by + * declaring `@types/vscode` AND `engines.vscode` — checked on every run, so + * the exemption cannot outlive its evidence. (The VS Code extension was + * the tree's one such package until objectstack#25910 removed it; the row + * stays, fixture-tested, for the next.) * - **A self-reference is allowed when the package declares `exports`.** Node * resolves a package's own name through its own `exports` map, so * `@object-ui/core` importing `@object-ui/core` is legal and installs diff --git a/ui/scripts/check-published-dist-tooling.mjs b/ui/scripts/check-published-dist-tooling.mjs index 84574838dcc..79cdd008fab 100644 --- a/ui/scripts/check-published-dist-tooling.mjs +++ b/ui/scripts/check-published-dist-tooling.mjs @@ -79,9 +79,9 @@ * repository's own definition of a released family, read from the file for * the reason `check-changeset-presence.mjs` gives — a hand-written list * misses `@object-ui/console` under `apps/`) MINUS `private: true`. The - * subtraction is load-bearing and not cosmetic: `packages/vscode-extension` - * is named `object-ui`, IS in the fixed group (changesets versions it) and - * is `private`, so npm never receives it. + * subtraction is load-bearing and not cosmetic: a private package may sit + * in the fixed group (changesets versions it) while npm never receives it, + * as the VS Code extension did until objectstack#25910 removed it. * - THE FILE LIST comes from `npm pack --dry-run --json`, not from a walk of * `dist/` on disk. Those differ, and the tarball is the thing a consumer * installs: a package's `files` field, its `.npmignore` and npm's own always @@ -280,8 +280,8 @@ export function discoverPublishedPackages(root, released = readReleaseGroup(root if (!existsSync(manifestPath)) continue; const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); // `private` is checked BEFORE release-group membership is trusted: - // `object-ui` (packages/vscode-extension) is in the fixed group and is - // private, so changesets versions it and npm never sees it. + // a private package may sit in the fixed group, so changesets versions it + // and npm never sees it. if (!manifest.name || !released.has(manifest.name) || manifest.private === true) continue; packages.push({ name: manifest.name, dir, manifest }); } diff --git a/ui/scripts/check-unused-dependencies.mjs b/ui/scripts/check-unused-dependencies.mjs index fe12daa98a7..b30db80e21c 100644 --- a/ui/scripts/check-unused-dependencies.mjs +++ b/ui/scripts/check-unused-dependencies.mjs @@ -135,10 +135,12 @@ * 41 unused runtime declarations on `fc32921aa`, across 20 of the 40 released * packages. 37 were REMOVED in the pull request that landed this gate — every * one verified by a whole-package grep first, so that the name appeared nowhere - * in the package but its own manifest and CHANGELOG. Four are allowed below, - * because each has a consumer this gate structurally cannot see: a specifier + * in the package but its own manifest and CHANGELOG. Four were allowed, + * because each had a consumer this gate structurally cannot see: a specifier * emitted into GENERATED source (`@object-ui/cli`) and a specifier a bundler - * inlines by name from its config (`object-ui`). Both are verified on every run. + * inlined by name from its config (the VS Code extension). The extension's two + * rows left with that package (objectstack#25910); the CLI's two remain below + * and are verified on every run. * * The removals are not cosmetic. `@object-ui/plugin-designer` declared all three * `@dnd-kit` packages and imports none of them; `@object-ui/plugin-chatbot` @@ -301,7 +303,7 @@ export function consumedNames(root, pkgDir) { * Declarations with a consumer this gate structurally cannot see. * * Every row states its evidence and RE-DERIVES it on each run, and a row that - * has stopped applying fails the build — see the header. Four rows, two shapes. + * has stopped applying fails the build — see the header. Two rows, one shape. * * @type {Record>} */ @@ -310,10 +312,6 @@ export const DECLARED_WITHOUT_IMPORT = { '@object-ui/components': generatedSourceAllowance('@object-ui/components'), '@object-ui/react': generatedSourceAllowance('@object-ui/react'), }, - 'object-ui': { - '@object-ui/core': bundlerInlinedAllowance('@object-ui/core'), - '@object-ui/types': bundlerInlinedAllowance('@object-ui/types'), - }, }; /** @@ -351,37 +349,6 @@ function generatedSourceAllowance(name) { }; } -/** - * The extension shape: the bundler INLINES the package by name from its config. - * - * `packages/vscode-extension/tsup.config.ts` lists both names in `noExternal`, - * so their code is compiled into the extension's `dist` even though no file in - * the extension imports the bare specifier. - */ -function bundlerInlinedAllowance(name) { - const config = 'tsup.config.ts'; - return { - reason: - `bundled into this package's \`dist\` by \`noExternal\` in ${config}, which names it as a string ` + - 'rather than importing it', - verify(root, pkg) { - const path = join(root, pkg.dir, config); - let text; - try { - text = readFileSync(path, 'utf8'); - } catch { - return [`${pkg.dir}/${config} cannot be read, so the allowance cannot be verified`]; - } - const noExternal = /noExternal\s*:\s*\[([^\]]*)\]/s.exec(text); - if (!noExternal) return [`${pkg.dir}/${config} no longer declares \`noExternal\``]; - if (!noExternal[1].includes(`'${name}'`) && !noExternal[1].includes(`"${name}"`)) { - return [`${pkg.dir}/${config}'s \`noExternal\` no longer names '${name}'`]; - } - return []; - }, - }; -} - /** * One package's findings. * diff --git a/ui/scripts/markdown-test-inputs.mjs b/ui/scripts/markdown-test-inputs.mjs index 7eb434e8c4f..e667ae6ee57 100644 --- a/ui/scripts/markdown-test-inputs.mjs +++ b/ui/scripts/markdown-test-inputs.mjs @@ -671,12 +671,6 @@ export const ADJUDICATED = new Map([ 'packages/types/src/__tests__/zod-readme-examples-9522.test.ts', { reads: ['packages/types/src/zod/README.md'] }, ], - [ - 'packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts', - { - reads: ['content/docs/utilities/vscode-extension.mdx', 'packages/vscode-extension/DESIGN.md'], - }, - ], // --------------------------------------------------------------------------- // objectui#9096 -- the `scripts/__tests__/**` surface. diff --git a/ui/tsconfig.json b/ui/tsconfig.json index f7274094be6..55f23cb51be 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -9,16 +9,14 @@ // // ## The measured `extends` graph // -// Counted, not recalled: every one of the 94 tracked `tsconfig*.json` files in +// Counted, not recalled: every one of the 87 tracked `tsconfig*.json` files in // the repo, read with TypeScript's own JSONC reader (`ts.readConfigFile`), at -// cb725e78f. Re-derive rather than trust it if it matters — this is a reading -// with a date on it, not a contract. +// 4d3a077f6 with #25910's package removal applied. Re-derive rather than trust +// it if it matters — this is a reading with a date on it, not a contract. // -// THIS FILE is extended by 75 of the 94, every one of them under `packages/`: -// 38 of the 40 `packages/*/tsconfig.json` -// 36 of the 37 `packages/*/tsconfig.test.json` -// (the 37th, `packages/vscode-extension/tsconfig.test.json`, extends its -// own sibling instead) +// THIS FILE is extended by 73 of the 87, every one of them under `packages/`: +// 37 of the 38 `packages/*/tsconfig.json` +// all 35 `packages/*/tsconfig.test.json` // `packages/types/tsconfig.examples.json` // Nothing under `apps/` or `examples/` extends it. // @@ -27,16 +25,16 @@ // Its full header carries the rest, including why `tsconfig.scripts.json` is // NOT among them although objectui#9330's ruling names it. // -// `packages/runner/tsconfig.json` and `packages/vscode-extension/tsconfig.json` -// extend NOTHING — the two of forty that inherit from neither root config. +// `packages/runner/tsconfig.json` extends NOTHING — the one of thirty-eight +// that inherits from neither root config. // Recorded per the ruling, ⛔ not changed by it; objectui#7212's population // question is not settled here either. // // ⚠️ objectui#9330's card body says "all 30 `packages/*/tsconfig.json`" extend // this file and its ruling says 38. Same population, and the card's own stated // commit c64975e9f measures 38 as well — 30 matches no population in this repo -// at either commit, so it is a miscount, not a narrower reading. Use 38, or -// re-measure. +// at either commit, so it is a miscount, not a narrower reading. Neither is +// today's figure (37 since #25910): re-measure. // // Comments here are `//`, not `/* */`: a glob containing `**` followed by `/` // closes a block comment early, and a tsconfig that silently fails to parse diff --git a/ui/tsconfig.tier-base.json b/ui/tsconfig.tier-base.json index 7f920e70d32..9d16f28fc63 100644 --- a/ui/tsconfig.tier-base.json +++ b/ui/tsconfig.tier-base.json @@ -15,10 +15,11 @@ // // ## The measured `extends` graph // -// Counted, not recalled: every one of the 94 tracked `tsconfig*.json` files in +// Counted, not recalled: every one of the 87 tracked `tsconfig*.json` files in // the repo, read with TypeScript's own JSONC reader (`ts.readConfigFile`), at -// cb725e78f. Re-derive it rather than trusting this block if it matters — the -// numbers below are a reading with a date on it, not a contract. +// 4d3a077f6 with #25910's package removal applied. Re-derive it rather than +// trusting this block if it matters — the numbers below are a reading with a +// date on it, not a contract. // // THIS FILE is extended by 2 files and by nothing else: // tsconfig.node.json editor / reference only; NO script @@ -31,14 +32,14 @@ // `examples/byo-backend-console`, the one real compile that did, was deleted // (#25922); turbo's task inputs no longer name it for that reason. // -// The root `tsconfig.json` is extended by 75 of the 94, every one of them -// under `packages/`: 38 of the 40 `packages/*/tsconfig.json`, 36 of the 37 +// The root `tsconfig.json` is extended by 73 of the 87, every one of them +// under `packages/`: 37 of the 38 `packages/*/tsconfig.json`, all 35 // `packages/*/tsconfig.test.json`, and `packages/types/tsconfig.examples.json`. // Nothing under `apps/` or `examples/` extends it. // -// `packages/runner/tsconfig.json` and `packages/vscode-extension/tsconfig.json` -// extend NOTHING — they are the two of forty that inherit from neither root -// config. Recorded here per the ruling, ⛔ not changed by it. +// `packages/runner/tsconfig.json` extends NOTHING — it is the one of +// thirty-eight that inherits from neither root config. Recorded here per the +// ruling, ⛔ not changed by it. // // ⚠️ Two figures in objectui#9330's own thread disagree and neither may be // copied forward. The card body says "all 30 `packages/*/tsconfig.json`"; the