@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +194 -0
- package/README.md +121 -85
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +36 -13
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +166 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +104 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +2 -3
- package/api/index.mjs +5 -4
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
- package/api/integration/pack-check.mjs +111 -10
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -1
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +142 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1008 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +46 -9
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +359 -60
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +353 -104
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +11 -3
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +31 -8
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +5 -4
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +6 -5
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +48 -6
- package/authoring/doctypes/reference/type.ts +70 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/command-result-coverage.test.mjs +7 -7
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +24 -7
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +222 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +702 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -34
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +90 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- package/clients/cli/lib/json-shim.test.mjs +69 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +39 -10
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +775 -84
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +606 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +46 -38
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/browser.d.mts +3 -3
- package/foundation/xle/browser.mjs +3 -3
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +6 -5
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/parse.mjs +1 -1
- package/foundation/xle/print.mjs +2 -2
- package/foundation/xle/splice.mjs +1 -1
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/api/layout/_adapter.d.mts +0 -34
- package/api/layout/_adapter.mjs +0 -133
- package/api/layout/check/check.d.mts +0 -16
- package/api/layout/check/check.mjs +0 -40
- package/api/layout/expand/expand.d.mts +0 -22
- package/api/layout/expand/expand.mjs +0 -153
- package/api/layout/grammar/grammar.d.mts +0 -13
- package/api/layout/grammar/grammar.mjs +0 -86
- package/api/layout/layout.d.mts +0 -6
- package/api/layout/layout.mjs +0 -17
- package/api/layout/layout.test.mjs +0 -297
- package/api/layout/layout.type.d.mts +0 -89
- package/api/layout/layout.type.mjs +0 -103
- package/api/layout/layoutCheck.doc.d.mts +0 -11
- package/api/layout/layoutCheck.doc.mjs +0 -84
- package/api/layout/layoutExpand.doc.d.mts +0 -11
- package/api/layout/layoutExpand.doc.mjs +0 -106
- package/api/layout/layoutGrammar.doc.d.mts +0 -11
- package/api/layout/layoutGrammar.doc.mjs +0 -56
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/layout-check.doc.mjs +0 -54
- package/clients/cli/commands/layout-expand.doc.mjs +0 -66
- package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
- package/clients/cli/commands/layout.doc.mjs +0 -34
- package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
- package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
- package/clients/cli/commands/layout.mjs +0 -263
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
|
@@ -29,6 +29,8 @@ export interface Suggestion {
|
|
|
29
29
|
* human-readable `error` string, which changes freely.
|
|
30
30
|
*/
|
|
31
31
|
export interface CLIError {
|
|
32
|
+
/** Version of the JSON envelope contract, as on the success envelope. */
|
|
33
|
+
apiVersion: number;
|
|
32
34
|
error: string;
|
|
33
35
|
code: ErrorCode;
|
|
34
36
|
suggestions?: Suggestion[];
|
|
@@ -36,13 +38,15 @@ export interface CLIError {
|
|
|
36
38
|
|
|
37
39
|
/** Returned by the fallback hook for commands without --json support. */
|
|
38
40
|
export interface CLIUnsupportedError {
|
|
41
|
+
apiVersion: number;
|
|
39
42
|
error: `JSON output is not supported for the '${string}' command`;
|
|
40
43
|
code: ErrorCode;
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
/**
|
|
44
|
-
* A success response
|
|
45
|
-
*
|
|
47
|
+
* A success response: a `type` discriminator, its `data` payload, and an
|
|
48
|
+
* optional `meta` sidecar (emitted as a sibling of `data`, never merged in).
|
|
49
|
+
* `--json` prints it with `apiVersion` added (see `parseResponse`).
|
|
46
50
|
*
|
|
47
51
|
* Structural by design — there is no central union of every response `type`.
|
|
48
52
|
* A specific command narrows `data` via its own return type.
|
|
@@ -75,7 +79,7 @@ export function jsonError(
|
|
|
75
79
|
/** Parse raw CLI output (string or object) into a typed result. */
|
|
76
80
|
export function parseResponse(
|
|
77
81
|
raw: unknown,
|
|
78
|
-
): CLIResponse | CLIError | CLIUnsupportedError;
|
|
82
|
+
): (CLIResponse & {apiVersion: number}) | CLIError | CLIUnsupportedError;
|
|
79
83
|
|
|
80
84
|
/** Type guard: returns true if result is an error. */
|
|
81
85
|
export function isError(
|
|
@@ -90,7 +94,7 @@ export function isError(
|
|
|
90
94
|
export function assertResponse<T extends string>(
|
|
91
95
|
raw: unknown,
|
|
92
96
|
type: T,
|
|
93
|
-
): CLIResponse & {type: T};
|
|
97
|
+
): CLIResponse & {apiVersion: number; type: T};
|
|
94
98
|
|
|
95
99
|
declare global {
|
|
96
100
|
namespace NodeJS {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* One complete row for an accepted selector.
|
|
6
|
+
*/
|
|
7
|
+
export type BatchRow<TResult, TCandidate> = ({
|
|
8
|
+
selector: string;
|
|
9
|
+
status: "found";
|
|
10
|
+
result: TResult;
|
|
11
|
+
} | {
|
|
12
|
+
selector: string;
|
|
13
|
+
status: "ambiguous";
|
|
14
|
+
code: string;
|
|
15
|
+
error: string;
|
|
16
|
+
candidates: TCandidate[];
|
|
17
|
+
} | {
|
|
18
|
+
selector: string;
|
|
19
|
+
status: "not_found" | "error";
|
|
20
|
+
code: string;
|
|
21
|
+
error: string;
|
|
22
|
+
suggestions?: import("./base").Suggestion[];
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* One ordered batch receipt inside the shared `{type, data}` success envelope.
|
|
26
|
+
*/
|
|
27
|
+
export type BatchResponse<TType extends string, TResult, TCandidate> = {
|
|
28
|
+
type: TType;
|
|
29
|
+
data: {
|
|
30
|
+
count: number;
|
|
31
|
+
results: BatchRow<TResult, TCandidate>[];
|
|
32
|
+
};
|
|
33
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Shared published types for complete multi-selector lookup receipts.
|
|
5
|
+
* Adopting API subjects specialize these types with their single-result and
|
|
6
|
+
* ambiguity-candidate types instead of defining command-specific row shapes.
|
|
7
|
+
*
|
|
8
|
+
* @input One exact selector, its single-result response, and its candidate shape.
|
|
9
|
+
* @output BatchRow and BatchResponse for every AST-053 lookup adopter.
|
|
10
|
+
* @position packages/cli/foundation/response — shared JSON response types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* One complete row for an accepted selector.
|
|
15
|
+
* @template TResult
|
|
16
|
+
* @template TCandidate
|
|
17
|
+
* @typedef {(
|
|
18
|
+
* | {selector: string; status: 'found'; result: TResult}
|
|
19
|
+
* | {selector: string; status: 'ambiguous'; code: string; error: string; candidates: TCandidate[]}
|
|
20
|
+
* | {selector: string; status: 'not_found' | 'error'; code: string; error: string; suggestions?: import('./base').Suggestion[]}
|
|
21
|
+
* )} BatchRow
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* One ordered batch receipt inside the shared `{type, data}` success envelope.
|
|
26
|
+
* @template {string} TType
|
|
27
|
+
* @template TResult
|
|
28
|
+
* @template TCandidate
|
|
29
|
+
* @typedef {object} BatchResponse
|
|
30
|
+
* @property {TType} type
|
|
31
|
+
* @property {{count: number; results: BatchRow<TResult, TCandidate>[]}} data
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
export {};
|
|
@@ -75,6 +75,8 @@ export function allErrorCodes(): string[];
|
|
|
75
75
|
* | 'ERR_UNKNOWN_FEATURE'
|
|
76
76
|
* | 'ERR_UNKNOWN_CODEMOD'
|
|
77
77
|
* | 'ERR_CODEMOD_FAILED'
|
|
78
|
+
* | 'ERR_CODEMOD_PROTECTED'
|
|
79
|
+
* | 'ERR_CODEMOD_PROTECTION_SOURCE'
|
|
78
80
|
* | 'ERR_NOT_FOUND'
|
|
79
81
|
* | 'ERR_NO_DOC'
|
|
80
82
|
* | 'ERR_NO_SHOWCASE'
|
|
@@ -107,4 +109,4 @@ export const ERROR_CODES: Readonly<Record<ErrorCode, ErrorCode>>;
|
|
|
107
109
|
/**
|
|
108
110
|
* Stable error-code string union. Append-only.
|
|
109
111
|
*/
|
|
110
|
-
export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
|
|
112
|
+
export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_CODEMOD_PROTECTED" | "ERR_CODEMOD_PROTECTION_SOURCE" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'enum',
|
|
13
13
|
name: 'error-codes',
|
|
14
14
|
displayName: 'Error Codes',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/api',
|
|
16
16
|
description:
|
|
17
17
|
'Stable, append-only machine-readable error codes on the --json error envelope (envelope.code). Codes never change or get removed; branch on these, not on prose.',
|
|
18
18
|
members: [
|
|
@@ -154,6 +154,16 @@ export const doc = {
|
|
|
154
154
|
value: 'ERR_CODEMOD_FAILED',
|
|
155
155
|
description: 'One or more codemods failed during an upgrade run.',
|
|
156
156
|
},
|
|
157
|
+
{
|
|
158
|
+
value: 'ERR_CODEMOD_PROTECTED',
|
|
159
|
+
description:
|
|
160
|
+
'A required codemod change remains blocked by a protected consumer file.',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
value: 'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
164
|
+
description:
|
|
165
|
+
'A working-tree protection declaration could not be read or parsed.',
|
|
166
|
+
},
|
|
157
167
|
{
|
|
158
168
|
value: 'ERR_NOT_FOUND',
|
|
159
169
|
description:
|
|
@@ -187,8 +197,7 @@ export const doc = {
|
|
|
187
197
|
},
|
|
188
198
|
{
|
|
189
199
|
value: 'ERR_FILE_EXISTS',
|
|
190
|
-
description:
|
|
191
|
-
'Refused to overwrite an existing file in non-interactive mode.',
|
|
200
|
+
description: 'Refused to overwrite an existing file.',
|
|
192
201
|
},
|
|
193
202
|
{
|
|
194
203
|
value: 'ERR_PATH_TRAVERSAL',
|
|
@@ -204,7 +213,7 @@ export const doc = {
|
|
|
204
213
|
{
|
|
205
214
|
value: 'ERR_THEME_INVALID',
|
|
206
215
|
description:
|
|
207
|
-
'A theme definition or contributed theme
|
|
216
|
+
'A theme definition or contributed theme descriptor is invalid.',
|
|
208
217
|
},
|
|
209
218
|
{
|
|
210
219
|
value: 'ERR_THEME_LOAD',
|
|
@@ -64,6 +64,8 @@
|
|
|
64
64
|
* | 'ERR_UNKNOWN_FEATURE'
|
|
65
65
|
* | 'ERR_UNKNOWN_CODEMOD'
|
|
66
66
|
* | 'ERR_CODEMOD_FAILED'
|
|
67
|
+
* | 'ERR_CODEMOD_PROTECTED'
|
|
68
|
+
* | 'ERR_CODEMOD_PROTECTION_SOURCE'
|
|
67
69
|
* | 'ERR_NOT_FOUND'
|
|
68
70
|
* | 'ERR_NO_DOC'
|
|
69
71
|
* | 'ERR_NO_SHOWCASE'
|
|
@@ -161,6 +163,10 @@ export const ERROR_CODES = Object.freeze({
|
|
|
161
163
|
ERR_UNKNOWN_CODEMOD: 'ERR_UNKNOWN_CODEMOD',
|
|
162
164
|
/** One or more codemods failed during an upgrade run. */
|
|
163
165
|
ERR_CODEMOD_FAILED: 'ERR_CODEMOD_FAILED',
|
|
166
|
+
/** A required codemod change remains blocked by a protected consumer file. */
|
|
167
|
+
ERR_CODEMOD_PROTECTED: 'ERR_CODEMOD_PROTECTED',
|
|
168
|
+
/** A working-tree protection declaration could not be read or parsed. */
|
|
169
|
+
ERR_CODEMOD_PROTECTION_SOURCE: 'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
164
170
|
/** A generic discover/lookup query matched nothing in any package. */
|
|
165
171
|
ERR_NOT_FOUND: 'ERR_NOT_FOUND',
|
|
166
172
|
|
|
@@ -177,7 +183,7 @@ export const ERROR_CODES = Object.freeze({
|
|
|
177
183
|
// ── Filesystem ───────────────────────────────────────────────────
|
|
178
184
|
/** A required input file did not exist. */
|
|
179
185
|
ERR_FILE_NOT_FOUND: 'ERR_FILE_NOT_FOUND',
|
|
180
|
-
/** Refused to overwrite an existing file
|
|
186
|
+
/** Refused to overwrite an existing file. */
|
|
181
187
|
ERR_FILE_EXISTS: 'ERR_FILE_EXISTS',
|
|
182
188
|
/** A path escaped its allowed root, or a name contained traversal markers. */
|
|
183
189
|
ERR_PATH_TRAVERSAL: 'ERR_PATH_TRAVERSAL',
|
|
@@ -185,7 +191,7 @@ export const ERROR_CODES = Object.freeze({
|
|
|
185
191
|
ERR_WRITE_FAILED: 'ERR_WRITE_FAILED',
|
|
186
192
|
|
|
187
193
|
// ── Theme build ──────────────────────────────────────────────────
|
|
188
|
-
/** A theme definition or contributed theme
|
|
194
|
+
/** A theme definition or contributed theme descriptor is invalid. */
|
|
189
195
|
ERR_THEME_INVALID: 'ERR_THEME_INVALID',
|
|
190
196
|
/** A theme file could not be loaded / parsed into a defineTheme result. */
|
|
191
197
|
ERR_THEME_LOAD: 'ERR_THEME_LOAD',
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {describe, it, expect} from 'vitest';
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as os from 'node:os';
|
|
20
|
+
import * as path from 'node:path';
|
|
18
21
|
import {ERROR_CODES, isErrorCode, allErrorCodes} from './error-codes.mjs';
|
|
19
22
|
import {runCli} from '../../test-utils/run-cli.mjs';
|
|
20
23
|
|
|
@@ -75,20 +78,126 @@ describe('error-codes taxonomy', () => {
|
|
|
75
78
|
});
|
|
76
79
|
});
|
|
77
80
|
|
|
81
|
+
describe('error codes: shipped set', () => {
|
|
82
|
+
// Every code a release has published. INV3: a shipped code is never removed
|
|
83
|
+
// or respelled. Add a code here once it ships; never delete an entry.
|
|
84
|
+
const SHIPPED = [
|
|
85
|
+
'ERR_AMBIGUOUS_COMPONENT',
|
|
86
|
+
'ERR_AMBIGUOUS_TEMPLATE',
|
|
87
|
+
'ERR_AMBIGUOUS_THEME',
|
|
88
|
+
'ERR_CODEMOD_FAILED',
|
|
89
|
+
'ERR_CODEMOD_PROTECTED',
|
|
90
|
+
'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
91
|
+
'ERR_CORE_INCOMPATIBLE',
|
|
92
|
+
'ERR_CORE_NOT_FOUND',
|
|
93
|
+
'ERR_DEP_MISSING',
|
|
94
|
+
'ERR_FETCH_FAILED',
|
|
95
|
+
'ERR_FILE_EXISTS',
|
|
96
|
+
'ERR_FILE_NOT_FOUND',
|
|
97
|
+
'ERR_GH_CLI',
|
|
98
|
+
'ERR_INTEGRATION_EXPORT_CONFLICT',
|
|
99
|
+
'ERR_INTEGRATION_ROOT_CONFLICT',
|
|
100
|
+
'ERR_INVALID_ARGUMENT',
|
|
101
|
+
'ERR_INVALID_DETAIL',
|
|
102
|
+
'ERR_INVALID_DOC',
|
|
103
|
+
'ERR_INVALID_LANG',
|
|
104
|
+
'ERR_INVALID_OPTION',
|
|
105
|
+
'ERR_INVALID_VERSION',
|
|
106
|
+
'ERR_LAYOUT_INVALID',
|
|
107
|
+
'ERR_LAYOUT_PARSE',
|
|
108
|
+
'ERR_MISSING_ARGUMENT',
|
|
109
|
+
'ERR_NODE_VERSION',
|
|
110
|
+
'ERR_NOT_FOUND',
|
|
111
|
+
'ERR_NO_DOC',
|
|
112
|
+
'ERR_NO_SHOWCASE',
|
|
113
|
+
'ERR_NO_SOURCE',
|
|
114
|
+
'ERR_PALETTE_GENERATION',
|
|
115
|
+
'ERR_PATH_TRAVERSAL',
|
|
116
|
+
'ERR_SIGNAL_TERMINATED',
|
|
117
|
+
'ERR_THEME_INVALID',
|
|
118
|
+
'ERR_THEME_LOAD',
|
|
119
|
+
'ERR_UNCLASSIFIED_EXIT',
|
|
120
|
+
'ERR_UNKNOWN',
|
|
121
|
+
'ERR_UNKNOWN_AGENT',
|
|
122
|
+
'ERR_UNKNOWN_CATEGORY',
|
|
123
|
+
'ERR_UNKNOWN_CODEMOD',
|
|
124
|
+
'ERR_UNKNOWN_COMMAND',
|
|
125
|
+
'ERR_UNKNOWN_COMPONENT',
|
|
126
|
+
'ERR_UNKNOWN_FEATURE',
|
|
127
|
+
'ERR_UNKNOWN_HOOK',
|
|
128
|
+
'ERR_UNKNOWN_PACKAGE',
|
|
129
|
+
'ERR_UNKNOWN_POST',
|
|
130
|
+
'ERR_UNKNOWN_SECTION',
|
|
131
|
+
'ERR_UNKNOWN_SUBCOMMAND',
|
|
132
|
+
'ERR_UNKNOWN_TEMPLATE',
|
|
133
|
+
'ERR_UNKNOWN_THEME',
|
|
134
|
+
'ERR_UNKNOWN_TOPIC',
|
|
135
|
+
'ERR_VERSION_DETECT',
|
|
136
|
+
'ERR_WRITE_FAILED',
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
it('still carries every shipped code, spelled the same', () => {
|
|
140
|
+
const missing = SHIPPED.filter(
|
|
141
|
+
code => !isErrorCode(code) || ERROR_CODES[code] !== code,
|
|
142
|
+
);
|
|
143
|
+
expect(missing, 'shipped codes removed or respelled').toEqual([]);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
78
147
|
describe('error codes: end-to-end JSON envelopes', () => {
|
|
79
148
|
const cases = [
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
149
|
+
{
|
|
150
|
+
name: 'unknown component',
|
|
151
|
+
args: ['component', 'Bogus', '--json'],
|
|
152
|
+
code: 'ERR_UNKNOWN_COMPONENT',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'unknown hook',
|
|
156
|
+
args: ['hook', 'bogusHook', '--json'],
|
|
157
|
+
code: 'ERR_UNKNOWN_HOOK',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'unknown topic',
|
|
161
|
+
args: ['docs', 'bogusTopic', '--json'],
|
|
162
|
+
code: 'ERR_UNKNOWN_TOPIC',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'unknown template',
|
|
166
|
+
args: ['template', 'bogusTemplate', '--json'],
|
|
167
|
+
code: 'ERR_UNKNOWN_TEMPLATE',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: 'unknown command',
|
|
171
|
+
args: ['bogus-cmd', '--json'],
|
|
172
|
+
code: 'ERR_UNKNOWN_COMMAND',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'invalid --lang',
|
|
176
|
+
args: ['docs', 'color', '--lang', 'fr', '--json'],
|
|
177
|
+
code: 'ERR_INVALID_LANG',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'invalid --detail',
|
|
181
|
+
args: ['docs', 'color', '--detail', 'bogus', '--json'],
|
|
182
|
+
code: 'ERR_INVALID_DETAIL',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: 'unknown option',
|
|
186
|
+
args: ['component', 'Button', '--bogus-flag', '--json'],
|
|
187
|
+
code: 'ERR_INVALID_OPTION',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: 'missing argument',
|
|
191
|
+
args: ['theme', 'build', '--json'],
|
|
192
|
+
code: 'ERR_MISSING_ARGUMENT',
|
|
193
|
+
},
|
|
89
194
|
// `theme` is not on the --json allowlist, so --json on any theme subcommand
|
|
90
195
|
// is rejected at the preAction gate with a stable invalid-option code.
|
|
91
|
-
{
|
|
196
|
+
{
|
|
197
|
+
name: 'json not supported',
|
|
198
|
+
args: ['theme', 'bogus-sub', '--json'],
|
|
199
|
+
code: 'ERR_INVALID_OPTION',
|
|
200
|
+
},
|
|
92
201
|
];
|
|
93
202
|
|
|
94
203
|
for (const {name, args, code} of cases) {
|
|
@@ -104,6 +213,24 @@ describe('error codes: end-to-end JSON envelopes', () => {
|
|
|
104
213
|
});
|
|
105
214
|
}
|
|
106
215
|
|
|
216
|
+
it('a filesystem failure carries a registered code, never the Node errno', async () => {
|
|
217
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-errno-'));
|
|
218
|
+
try {
|
|
219
|
+
// A file where the target directory should be: mkdir fails with ENOTDIR.
|
|
220
|
+
fs.writeFileSync(path.join(dir, 'blocker'), 'x');
|
|
221
|
+
const {status, stdout} = await runCli(
|
|
222
|
+
['template', 'dashboard', 'blocker/out', '--json'],
|
|
223
|
+
{cwd: dir},
|
|
224
|
+
);
|
|
225
|
+
expect(status).toBe(1);
|
|
226
|
+
const env = envelope(stdout);
|
|
227
|
+
expect(env.error).toMatch(/ENOTDIR/);
|
|
228
|
+
expect(isErrorCode(env.code)).toBe(true);
|
|
229
|
+
} finally {
|
|
230
|
+
fs.rmSync(dir, {recursive: true, force: true});
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
107
234
|
it('every error envelope carries a code (even unmatched paths fall back to ERR_UNKNOWN)', async () => {
|
|
108
235
|
const {stdout} = await runCli(['component', 'Bogus', '--json']);
|
|
109
236
|
const env = envelope(stdout);
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
import {describe, it, expect, beforeEach, afterEach, vi} from 'vitest';
|
|
15
15
|
import {spawnSync} from 'node:child_process';
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as os from 'node:os';
|
|
16
18
|
import * as path from 'node:path';
|
|
17
19
|
import {fileURLToPath} from 'node:url';
|
|
18
20
|
import {
|
|
@@ -27,10 +29,20 @@ import {
|
|
|
27
29
|
} from './json.mjs';
|
|
28
30
|
|
|
29
31
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
-
const CLI = path.resolve(
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const CLI = path.resolve(
|
|
33
|
+
__dirname,
|
|
34
|
+
'..',
|
|
35
|
+
'..',
|
|
36
|
+
'clients',
|
|
37
|
+
'cli',
|
|
38
|
+
'bin',
|
|
39
|
+
'astryx.mjs',
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
/** @param {string[]} args @param {{cwd?: string}} [options] */
|
|
43
|
+
function runCli(args, {cwd = process.cwd()} = {}) {
|
|
33
44
|
return spawnSync(process.execPath, [CLI, ...args], {
|
|
45
|
+
cwd,
|
|
34
46
|
encoding: 'utf8',
|
|
35
47
|
timeout: 20_000,
|
|
36
48
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -42,7 +54,9 @@ describe('json envelope shape', () => {
|
|
|
42
54
|
let logs;
|
|
43
55
|
beforeEach(() => {
|
|
44
56
|
logs = [];
|
|
45
|
-
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
57
|
+
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
58
|
+
logs.push(a.join(' ')),
|
|
59
|
+
);
|
|
46
60
|
setJsonMode(false);
|
|
47
61
|
});
|
|
48
62
|
afterEach(() => {
|
|
@@ -80,11 +94,13 @@ describe('json envelope shape', () => {
|
|
|
80
94
|
});
|
|
81
95
|
|
|
82
96
|
it('toErrorEnvelope honors an explicit code argument', () => {
|
|
83
|
-
expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual(
|
|
98
|
+
{
|
|
99
|
+
apiVersion: API_VERSION,
|
|
100
|
+
error: 'boom',
|
|
101
|
+
code: 'ERR_UNKNOWN_COMPONENT',
|
|
102
|
+
},
|
|
103
|
+
);
|
|
88
104
|
});
|
|
89
105
|
|
|
90
106
|
it('toErrorEnvelope reads a code carried on a thrown Error', () => {
|
|
@@ -96,6 +112,17 @@ describe('json envelope shape', () => {
|
|
|
96
112
|
});
|
|
97
113
|
});
|
|
98
114
|
|
|
115
|
+
it('toErrorEnvelope never emits an unregistered code', () => {
|
|
116
|
+
// A Node system error carries `code: 'EACCES'`; that is not an Astryx code.
|
|
117
|
+
const sysErr = Object.assign(new Error('EACCES: permission denied'), {
|
|
118
|
+
code: 'EACCES',
|
|
119
|
+
});
|
|
120
|
+
expect(toErrorEnvelope(sysErr).code).toBe('ERR_UNKNOWN');
|
|
121
|
+
expect(toErrorEnvelope('boom', undefined, 'ENOENT').code).toBe('ERR_UNKNOWN');
|
|
122
|
+
const docErr = Object.assign(new Error('no doc'), {code: 'ERR_NO_DOC'});
|
|
123
|
+
expect(toErrorEnvelope(docErr, undefined, 'ENOENT').code).toBe('ERR_NO_DOC');
|
|
124
|
+
});
|
|
125
|
+
|
|
99
126
|
it('toErrorEnvelope includes suggestions when present', () => {
|
|
100
127
|
const env = toErrorEnvelope('x', [{name: 'Button', reason: 'close match'}]);
|
|
101
128
|
expect(env.suggestions).toEqual([{name: 'Button', reason: 'close match'}]);
|
|
@@ -109,8 +136,12 @@ describe('json envelope shape', () => {
|
|
|
109
136
|
// The guard is `Array.isArray(...) && .length`, not a bare `?.length` — a
|
|
110
137
|
// string ("hello".length === 5) or a `{length: n}` object must NOT slip
|
|
111
138
|
// through as `suggestions`, which is contractually a Suggestion[].
|
|
112
|
-
expect(
|
|
113
|
-
|
|
139
|
+
expect(
|
|
140
|
+
'suggestions' in toErrorEnvelope('x', /** @type {any} */ ('hello')),
|
|
141
|
+
).toBe(false);
|
|
142
|
+
expect(
|
|
143
|
+
'suggestions' in toErrorEnvelope('x', /** @type {any} */ ({length: 3})),
|
|
144
|
+
).toBe(false);
|
|
114
145
|
});
|
|
115
146
|
});
|
|
116
147
|
|
|
@@ -119,8 +150,12 @@ describe('stdout discipline (humanLog / humanWarn)', () => {
|
|
|
119
150
|
beforeEach(() => {
|
|
120
151
|
logs = [];
|
|
121
152
|
errs = [];
|
|
122
|
-
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
123
|
-
|
|
153
|
+
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
154
|
+
logs.push(a.join(' ')),
|
|
155
|
+
);
|
|
156
|
+
vi.spyOn(console, 'error').mockImplementation((...a) =>
|
|
157
|
+
errs.push(a.join(' ')),
|
|
158
|
+
);
|
|
124
159
|
});
|
|
125
160
|
afterEach(() => {
|
|
126
161
|
vi.restoreAllMocks();
|
|
@@ -174,10 +209,15 @@ describe('contract: every --json emission is valid JSON with apiVersion', () =>
|
|
|
174
209
|
});
|
|
175
210
|
|
|
176
211
|
it('init emits its install receipt', () => {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
212
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-json-contract-'));
|
|
213
|
+
try {
|
|
214
|
+
const r = runCli(['init', '--json'], {cwd});
|
|
215
|
+
const env = JSON.parse(r.stdout);
|
|
216
|
+
expect(env.apiVersion).toBe(API_VERSION);
|
|
217
|
+
expect(env.type).toBe('init.run');
|
|
218
|
+
} finally {
|
|
219
|
+
fs.rmSync(cwd, {recursive: true, force: true});
|
|
220
|
+
}
|
|
181
221
|
});
|
|
182
222
|
|
|
183
223
|
it('supported command (discover) emits clean JSON, no human chatter leak', () => {
|
|
@@ -50,8 +50,10 @@ export function jsonOut(response: {
|
|
|
50
50
|
*
|
|
51
51
|
* The `code` is resolved in priority order: an explicit `code` argument,
|
|
52
52
|
* then a `code` property carried on a thrown Error/AstryxError, then the
|
|
53
|
-
* generic `ERR_UNKNOWN` fallback.
|
|
54
|
-
*
|
|
53
|
+
* generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
|
|
54
|
+
* taken from either source, so a Node system error's `ENOENT` never reaches
|
|
55
|
+
* the envelope. It always appears on the envelope so consumers can branch on
|
|
56
|
+
* it unconditionally.
|
|
55
57
|
*
|
|
56
58
|
* @param {unknown} err
|
|
57
59
|
* @param {import('./base').Suggestion[]} [suggestions]
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* Version of the JSON envelope contract. Bump on breaking shape changes so
|
|
29
29
|
* consumers can negotiate. Exposed on every envelope as `apiVersion`.
|
|
30
30
|
*/
|
|
31
|
-
import {ERROR_CODES} from './error-codes.mjs';
|
|
31
|
+
import {ERROR_CODES, isErrorCode} from './error-codes.mjs';
|
|
32
32
|
import {recordEnvelope, setOutcome} from '../debug/index.mjs';
|
|
33
33
|
|
|
34
34
|
export const API_VERSION = 1;
|
|
@@ -118,8 +118,10 @@ export function jsonOut(response) {
|
|
|
118
118
|
*
|
|
119
119
|
* The `code` is resolved in priority order: an explicit `code` argument,
|
|
120
120
|
* then a `code` property carried on a thrown Error/AstryxError, then the
|
|
121
|
-
* generic `ERR_UNKNOWN` fallback.
|
|
122
|
-
*
|
|
121
|
+
* generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
|
|
122
|
+
* taken from either source, so a Node system error's `ENOENT` never reaches
|
|
123
|
+
* the envelope. It always appears on the envelope so consumers can branch on
|
|
124
|
+
* it unconditionally.
|
|
123
125
|
*
|
|
124
126
|
* @param {unknown} err
|
|
125
127
|
* @param {import('./base').Suggestion[]} [suggestions]
|
|
@@ -130,13 +132,9 @@ export function jsonOut(response) {
|
|
|
130
132
|
export function toErrorEnvelope(err, suggestions, code) {
|
|
131
133
|
const message =
|
|
132
134
|
err instanceof Error ? err.message : typeof err === 'string' ? err : String(err);
|
|
133
|
-
const
|
|
134
|
-
code
|
|
135
|
-
|
|
136
|
-
typeof (/** @type {any} */ (err).code) === 'string'
|
|
137
|
-
? /** @type {any} */ (err).code
|
|
138
|
-
: undefined) ||
|
|
139
|
-
ERROR_CODES.ERR_UNKNOWN;
|
|
135
|
+
const carried =
|
|
136
|
+
err && typeof err === 'object' ? /** @type {any} */ (err).code : undefined;
|
|
137
|
+
const resolvedCode = [code, carried].find(isErrorCode) ?? ERROR_CODES.ERR_UNKNOWN;
|
|
140
138
|
/** @type {any} */
|
|
141
139
|
const env = {apiVersion: API_VERSION, error: message, code: resolvedCode};
|
|
142
140
|
if (Array.isArray(suggestions) && suggestions.length) env.suggestions = suggestions;
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
* @file EnumDoc for the `type` discriminant carried on every --json success
|
|
6
6
|
* envelope. The vocabulary mirrors the RESPONSE_TYPES map (each command's
|
|
7
7
|
* `jsonOut(...)` call sites) in `clients/cli/lib/manifest.mjs`; a consumer
|
|
8
|
-
* switches on `type` to narrow the `data` payload.
|
|
8
|
+
* switches on `type` to narrow the `data` payload. Descriptions follow the
|
|
9
|
+
* currently published response projection, not a future package-version boundary.
|
|
10
|
+
*
|
|
11
|
+
* @input Public response discriminants and their currently released payloads.
|
|
12
|
+
* @output Generated consumer reference for every typed JSON success response.
|
|
9
13
|
* @position packages/cli/foundation/response — enum documentation
|
|
10
14
|
*/
|
|
11
15
|
/** @type {import('@astryxdesign/cli/authoring').EnumDoc} */
|