@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683
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 +117 -78
- 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 +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -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 +164 -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 +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +548 -1
- package/api/doctor/doctor.test.mjs +610 -1
- 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 +1 -1
- package/api/index.mjs +1 -0
- 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.mjs +83 -7
- 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 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- 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 +124 -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 +1072 -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 +45 -8
- 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/run.mjs +356 -59
- 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 +27 -11
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- 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 +350 -102
- 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/{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 +10 -2
- 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 +29 -6
- 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 +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- 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/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 +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -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 +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- 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 +193 -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/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -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 +719 -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 -30
- 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 +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +37 -2
- package/clients/cli/lib/manifest.test.mjs +17 -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 +774 -83
- 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 +1642 -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 +598 -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/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 +41 -21
- package/foundation/response/response-types.doc.test.mjs +158 -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/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- 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
|
@@ -12,6 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'function',
|
|
13
13
|
kind: 'api',
|
|
14
14
|
name: 'themeBuild',
|
|
15
|
+
namespace: 'cli/api',
|
|
15
16
|
displayName: 'themeBuild()',
|
|
16
17
|
summary: 'Compile a defineTheme file to CSS + JS + type declarations.',
|
|
17
18
|
description:
|
|
@@ -73,7 +74,7 @@ export const doc = {
|
|
|
73
74
|
{
|
|
74
75
|
type: 'theme.build',
|
|
75
76
|
description:
|
|
76
|
-
'Build receipt: theme name
|
|
77
|
+
'Build receipt {name, tokenCount, componentCount, sizeKB, outputs, warnings, notices}: the theme name; how many tokens (portable plus theme-local) and component targets it overrides; the CSS size in KB; the written outputs {css, js, dts, and variantsDts when custom prop values were augmented}; warnings, the defects the author should fix, including exact canonical replacements for deprecated component target keys and declarations the generator dropped; and notices, advisories about a correct theme, such as a font it names but does not load. Resolves to null instead when the theme produced no CSS (nothing to build).',
|
|
77
78
|
},
|
|
78
79
|
{
|
|
79
80
|
type: 'theme.build.check',
|
|
@@ -87,10 +88,13 @@ export const doc = {
|
|
|
87
88
|
code: 'ERR_THEME_LOAD',
|
|
88
89
|
when: 'the file cannot be loaded or parsed into a defineTheme() result',
|
|
89
90
|
},
|
|
90
|
-
{
|
|
91
|
+
{
|
|
92
|
+
code: 'ERR_THEME_INVALID',
|
|
93
|
+
when: 'the resolved theme is invalid, for example it has no name, or a custom Heading type has no standalone rule with a declaration the compiler can emit',
|
|
94
|
+
},
|
|
91
95
|
{
|
|
92
96
|
code: 'ERR_PATH_TRAVERSAL',
|
|
93
|
-
when: 'the theme name contains a path separator or traversal marker',
|
|
97
|
+
when: 'the theme name contains a path separator or traversal marker, or a relative `out` path resolves outside cwd (including through a symlink)',
|
|
94
98
|
},
|
|
95
99
|
{
|
|
96
100
|
code: 'ERR_CORE_NOT_FOUND',
|
|
@@ -102,7 +106,7 @@ export const doc = {
|
|
|
102
106
|
},
|
|
103
107
|
{
|
|
104
108
|
code: 'ERR_WRITE_FAILED',
|
|
105
|
-
when: 'writing the outputs fails (staged temp files are rolled back)',
|
|
109
|
+
when: 'creating the output directory or writing the outputs fails (staged temp files are rolled back)',
|
|
106
110
|
},
|
|
107
111
|
],
|
|
108
112
|
examples: [
|
|
@@ -9,10 +9,11 @@ export const doc = {
|
|
|
9
9
|
type: 'function',
|
|
10
10
|
kind: 'api',
|
|
11
11
|
name: 'themeList',
|
|
12
|
+
namespace: 'cli/api',
|
|
12
13
|
displayName: 'themeList()',
|
|
13
14
|
summary: 'List themes bundled with this CLI build.',
|
|
14
15
|
description:
|
|
15
|
-
'Projects the bundled
|
|
16
|
+
'Projects the bundled typed theme descriptors into a synchronous theme.list envelope. This preserves the original programmatic API contract. The CLI command uses themeListAvailable() so installed integrations also appear.',
|
|
16
17
|
importPath: '@astryxdesign/cli/api',
|
|
17
18
|
signature: 'themeList(): ThemeListResponse',
|
|
18
19
|
keywords: ['theme', 'list', 'themes', 'bundled', 'available'],
|
|
@@ -27,9 +28,11 @@ export const doc = {
|
|
|
27
28
|
throws: [
|
|
28
29
|
{
|
|
29
30
|
code: 'ERR_NO_SOURCE',
|
|
30
|
-
when: 'the bundled
|
|
31
|
+
when: 'the bundled theme descriptors cannot be read or parsed',
|
|
31
32
|
},
|
|
32
33
|
],
|
|
33
|
-
examples: [
|
|
34
|
+
examples: [
|
|
35
|
+
{label: 'List bundled themes', code: 'const {data} = themeList();'},
|
|
36
|
+
],
|
|
34
37
|
related: ['themeListAvailable', 'themeAdd', 'listThemes'],
|
|
35
38
|
};
|
|
@@ -9,10 +9,11 @@ export const doc = {
|
|
|
9
9
|
type: 'function',
|
|
10
10
|
kind: 'api',
|
|
11
11
|
name: 'themeListAvailable',
|
|
12
|
+
namespace: 'cli/api',
|
|
12
13
|
displayName: 'themeListAvailable()',
|
|
13
14
|
summary: 'List bundled and installed integration themes.',
|
|
14
15
|
description:
|
|
15
|
-
'Loads Project for the requested directory, combines the CLI bundle with source themes from installed integrations, and projects each entry with its owner package. An unreadable project configuration degrades to the bundled
|
|
16
|
+
'Loads Project for the requested directory, combines the CLI bundle with source themes from installed integrations, and projects each entry with its owner package. An unreadable project configuration degrades to the bundled descriptors.',
|
|
16
17
|
importPath: '@astryxdesign/cli/api',
|
|
17
18
|
signature:
|
|
18
19
|
'themeListAvailable(options?: {cwd?: string, package?: string}): Promise<ThemeListResponse>',
|
|
@@ -21,7 +22,8 @@ export const doc = {
|
|
|
21
22
|
{
|
|
22
23
|
name: 'options.cwd',
|
|
23
24
|
type: 'string',
|
|
24
|
-
description:
|
|
25
|
+
description:
|
|
26
|
+
'Project directory whose installed integrations contribute themes.',
|
|
25
27
|
},
|
|
26
28
|
{
|
|
27
29
|
name: 'options.package',
|
|
@@ -39,7 +41,7 @@ export const doc = {
|
|
|
39
41
|
throws: [
|
|
40
42
|
{
|
|
41
43
|
code: 'ERR_NO_SOURCE',
|
|
42
|
-
when: 'the CLI bundled-theme
|
|
44
|
+
when: 'the CLI bundled-theme descriptors cannot be read or parsed',
|
|
43
45
|
},
|
|
44
46
|
],
|
|
45
47
|
examples: [
|
|
@@ -12,6 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'function',
|
|
13
13
|
kind: 'api',
|
|
14
14
|
name: 'themeTemplate',
|
|
15
|
+
namespace: 'cli/api',
|
|
15
16
|
displayName: 'themeTemplate()',
|
|
16
17
|
summary: 'Write the annotated theme template into a project.',
|
|
17
18
|
description:
|
|
@@ -23,7 +24,7 @@ export const doc = {
|
|
|
23
24
|
'`overwrite`, so it is safe to re-run.',
|
|
24
25
|
importPath: '@astryxdesign/cli/api',
|
|
25
26
|
signature:
|
|
26
|
-
'themeTemplate(options?: {targetPath?: string, overwrite?: boolean, cwd?: string}):
|
|
27
|
+
'themeTemplate(options?: {targetPath?: string, overwrite?: boolean, cwd?: string}): ThemeTemplateResponse',
|
|
27
28
|
keywords: ['theme', 'template', 'starter', 'defineTheme', 'scaffold', 'reference', 'tokens'],
|
|
28
29
|
params: [
|
|
29
30
|
{
|
|
@@ -51,7 +52,10 @@ export const doc = {
|
|
|
51
52
|
'Receipt: the path (relative to cwd), whether it was written, and the reason it was not. `exists` when a file was already there, which is a success, not a failure.',
|
|
52
53
|
},
|
|
53
54
|
],
|
|
54
|
-
throws: [
|
|
55
|
+
throws: [
|
|
56
|
+
{code: 'ERR_PATH_TRAVERSAL', when: 'the target path escapes cwd'},
|
|
57
|
+
{code: 'ERR_WRITE_FAILED', when: 'the template file cannot be written'},
|
|
58
|
+
],
|
|
55
59
|
examples: [
|
|
56
60
|
{label: 'Write it at the project root', code: 'themeTemplate();'},
|
|
57
61
|
{
|
|
@@ -104,18 +104,27 @@ export function ensureCodemodDeps({ installDeps }?: {
|
|
|
104
104
|
* Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
|
|
105
105
|
* CONFIG codemod can repair a config the strict loader would otherwise reject.
|
|
106
106
|
* @param {CoreVersionManifest[]} versionManifests
|
|
107
|
-
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string
|
|
107
|
+
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, silent?: boolean}} options
|
|
108
108
|
*/
|
|
109
|
-
export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply, path: srcPath, codemod, skipCodemods }: {
|
|
109
|
+
export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply, path: srcPath, codemod, skipCodemods, root, protection, silent }: {
|
|
110
110
|
apply: boolean;
|
|
111
111
|
path: string;
|
|
112
112
|
codemod?: string;
|
|
113
113
|
skipCodemods: Set<string>;
|
|
114
|
+
root?: string;
|
|
115
|
+
protection?: {
|
|
116
|
+
root: string;
|
|
117
|
+
classify: (file: string) => import("../../foundation/fs/file-protection.mjs").FileProtection[];
|
|
118
|
+
};
|
|
119
|
+
silent?: boolean;
|
|
114
120
|
}): Promise<{
|
|
115
121
|
totalFilesChanged: number;
|
|
116
122
|
totalTransformsApplied: number;
|
|
117
123
|
totalValidationBlocked: number;
|
|
124
|
+
changedFiles: string[];
|
|
118
125
|
writtenFiles: string[];
|
|
126
|
+
stagedContents: Map<string, string>;
|
|
127
|
+
protectedFiles: import("../../authoring/codemod/type").CodemodRunResult["protectedFiles"];
|
|
119
128
|
errors: Array<{
|
|
120
129
|
file: string;
|
|
121
130
|
codemod: string;
|
|
@@ -139,13 +148,21 @@ export function runCoreCodemods(versionManifests: CoreVersionManifest[], { apply
|
|
|
139
148
|
/**
|
|
140
149
|
* Load the consumer project's config + integrations. Throws on invalid config;
|
|
141
150
|
* the run leaf decides between the config_fixable preview and a hard abort.
|
|
151
|
+
*
|
|
152
|
+
* Provider identity is resolved by the same resolver Project uses, on top of
|
|
153
|
+
* Project's ledger, under the codemod policy: a package that lists itself runs
|
|
154
|
+
* its installed copy's released codemods, never the work in progress being
|
|
155
|
+
* authored, and autolinked and local packages claim provider IDs without
|
|
156
|
+
* running codemods.
|
|
157
|
+
*
|
|
142
158
|
* @param {string} cwd
|
|
143
159
|
* @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
|
|
144
|
-
* @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]}>}
|
|
160
|
+
* @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[], ledger: import('../../foundation/integrations/provider-resolution.mjs').ProviderLedger}>}
|
|
145
161
|
*/
|
|
146
162
|
export function loadProjectContext(cwd: string, extraIntegrationSpecs?: string[]): Promise<{
|
|
147
163
|
postCodemodHooks: import("../../authoring/config/type").PostCodemodHook[];
|
|
148
164
|
integrations: import("../../foundation/integrations/integrations.mjs").LoadedIntegration[];
|
|
165
|
+
ledger: import("../../foundation/integrations/provider-resolution.mjs").ProviderLedger;
|
|
149
166
|
}>;
|
|
150
167
|
/**
|
|
151
168
|
* Non-blocking nudge for integration validation issues. Never throws (a broken
|
|
@@ -171,20 +188,30 @@ export function selectIntegrationCodemodsFor(integrations: Array<import("../../f
|
|
|
171
188
|
/**
|
|
172
189
|
* Run the file-based INTEGRATION codemods (config codemods first, then code).
|
|
173
190
|
* @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
|
|
174
|
-
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string
|
|
191
|
+
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, contents?: Map<string, string>, silent?: boolean}} options
|
|
175
192
|
*/
|
|
176
193
|
export function runIntegrationCodemodsStep(versionGroups: Array<{
|
|
177
194
|
version: string;
|
|
178
195
|
codemods: import("../../authoring/codemod/type").CodemodEntry[];
|
|
179
|
-
}>, { apply, path: srcPath, codemod, skipCodemods }: {
|
|
196
|
+
}>, { apply, path: srcPath, codemod, skipCodemods, root, protection, contents, silent, }: {
|
|
180
197
|
apply: boolean;
|
|
181
198
|
path: string;
|
|
182
199
|
codemod?: string;
|
|
183
200
|
skipCodemods: Set<string>;
|
|
201
|
+
root?: string;
|
|
202
|
+
protection?: {
|
|
203
|
+
root: string;
|
|
204
|
+
classify: (file: string) => import("../../foundation/fs/file-protection.mjs").FileProtection[];
|
|
205
|
+
};
|
|
206
|
+
contents?: Map<string, string>;
|
|
207
|
+
silent?: boolean;
|
|
184
208
|
}): Promise<{
|
|
185
209
|
totalFilesChanged: number;
|
|
186
210
|
totalTransformsApplied: number;
|
|
211
|
+
changedFiles: string[];
|
|
187
212
|
writtenFiles: string[];
|
|
213
|
+
stagedContents: Map<string, string>;
|
|
214
|
+
protectedFiles: import("../../authoring/codemod/type").CodemodRunResult["protectedFiles"];
|
|
188
215
|
errors: Array<{
|
|
189
216
|
file: string;
|
|
190
217
|
codemod: string;
|
package/api/upgrade/_adapter.mjs
CHANGED
|
@@ -19,7 +19,10 @@ import * as path from 'node:path';
|
|
|
19
19
|
import {execFile} from 'node:child_process';
|
|
20
20
|
import {promisify} from 'node:util';
|
|
21
21
|
import {ensureJscodeshift} from '../../assets/codemods/ensure-jscodeshift.mjs';
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
getTransformsBetween,
|
|
24
|
+
latestVersion,
|
|
25
|
+
} from '../../assets/codemods/registry.mjs';
|
|
23
26
|
import {runCodemods} from '../../assets/codemods/runner.mjs';
|
|
24
27
|
import {
|
|
25
28
|
discoverIntegrationCodemods,
|
|
@@ -32,14 +35,15 @@ import {
|
|
|
32
35
|
renderAgentDocsBlock,
|
|
33
36
|
} from '../../foundation/agent-docs/agent-docs.mjs';
|
|
34
37
|
import {formatCliCommand} from '../../foundation/env/package-manager.mjs';
|
|
35
|
-
import {Project} from '../../foundation/config/project.mjs';
|
|
38
|
+
import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
|
|
36
39
|
import {loadIntegrations} from '../../foundation/integrations/integrations.mjs';
|
|
40
|
+
import {resolveProviders} from '../../foundation/integrations/provider-resolution.mjs';
|
|
37
41
|
import {warnOnIntegrationIssues} from '../../foundation/integrations/integration-warnings.mjs';
|
|
38
42
|
import {logger} from '../logger.mjs';
|
|
39
43
|
|
|
40
44
|
// Re-exported for the run leaf's lightweight agent-docs inspection path
|
|
41
45
|
// (config_fixable short-circuit, where the full render cannot load config).
|
|
42
|
-
export {
|
|
46
|
+
export {inspectAgentDocs};
|
|
43
47
|
|
|
44
48
|
const execFileAsync = promisify(execFile);
|
|
45
49
|
|
|
@@ -101,6 +105,27 @@ export function uniqueFiles(files) {
|
|
|
101
105
|
];
|
|
102
106
|
}
|
|
103
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Run app code with its stdout writes sent to stderr. Stdout carries only the
|
|
110
|
+
* command's own output, so a hook that prints cannot corrupt `--json`.
|
|
111
|
+
* @template T
|
|
112
|
+
* @param {() => T | Promise<T>} fn
|
|
113
|
+
* @returns {Promise<T>}
|
|
114
|
+
*/
|
|
115
|
+
async function withStdoutOnStderr(fn) {
|
|
116
|
+
const realWrite = process.stdout.write;
|
|
117
|
+
process.stdout.write = /** @type {any} */ (
|
|
118
|
+
function (/** @type {any} */ chunk, /** @type {any[]} */ ...rest) {
|
|
119
|
+
return process.stderr.write(chunk, ...rest);
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
try {
|
|
123
|
+
return await fn();
|
|
124
|
+
} finally {
|
|
125
|
+
process.stdout.write = realWrite;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
104
129
|
/**
|
|
105
130
|
* Run the app config's post-codemod hooks (config.hooks.postCodemod).
|
|
106
131
|
* Dry-run PREVIEWS (buildCommand still called, so a throw fails); apply executes.
|
|
@@ -120,7 +145,9 @@ export async function runPostCodemodHooks(hooks, context) {
|
|
|
120
145
|
);
|
|
121
146
|
}
|
|
122
147
|
|
|
123
|
-
const cmd = await
|
|
148
|
+
const cmd = await withStdoutOnStderr(() =>
|
|
149
|
+
hook.buildCommand({packageDir, files}),
|
|
150
|
+
);
|
|
124
151
|
if (!cmd) {
|
|
125
152
|
logger.log(`Post-codemod hook ${label} produced no command; skipping.`);
|
|
126
153
|
continue;
|
|
@@ -144,7 +171,7 @@ export async function runPostCodemodHooks(hooks, context) {
|
|
|
144
171
|
env: {...process.env, ...(cmd.options?.env ?? {})},
|
|
145
172
|
}),
|
|
146
173
|
);
|
|
147
|
-
logger.log(
|
|
174
|
+
logger.log(`[ok] Post-codemod hook ${label} completed.`);
|
|
148
175
|
}
|
|
149
176
|
}
|
|
150
177
|
|
|
@@ -183,7 +210,7 @@ export async function prepareAgentDocsRefresh({
|
|
|
183
210
|
if (initial.status === 'missing') {
|
|
184
211
|
summary.action = 'nudge-init';
|
|
185
212
|
logger.warn(
|
|
186
|
-
`No Astryx agent-docs block found
|
|
213
|
+
`No Astryx agent-docs block found - AI agents have no component index. Run \`${formatCliCommand('astryx init --features agents')}\` to install it.`,
|
|
187
214
|
);
|
|
188
215
|
return {cwd, renderedBlock: null, summary};
|
|
189
216
|
}
|
|
@@ -237,7 +264,7 @@ export function applyAgentDocsRefresh(plan) {
|
|
|
237
264
|
summary.files = written;
|
|
238
265
|
summary.action = summary.refreshed ? 'refreshed' : 'error';
|
|
239
266
|
if (summary.refreshed) {
|
|
240
|
-
logger.log(
|
|
267
|
+
logger.log(`[ok] Agent docs refreshed -> ${written.join(', ')}`);
|
|
241
268
|
} else {
|
|
242
269
|
logger.warn(
|
|
243
270
|
`Agent docs look stale but couldn't be refreshed. Run \`${formatCliCommand('astryx init --features agents')}\` to reinstall the block.`,
|
|
@@ -265,7 +292,13 @@ export async function collectAllCodemods() {
|
|
|
265
292
|
);
|
|
266
293
|
for (const {version, transforms} of manifests) {
|
|
267
294
|
for (const {name, meta, optional} of transforms) {
|
|
268
|
-
codemods.push({
|
|
295
|
+
codemods.push({
|
|
296
|
+
name,
|
|
297
|
+
title: meta.title,
|
|
298
|
+
version,
|
|
299
|
+
pr: meta.pr,
|
|
300
|
+
optional: !!optional,
|
|
301
|
+
});
|
|
269
302
|
}
|
|
270
303
|
}
|
|
271
304
|
return codemods;
|
|
@@ -296,24 +329,36 @@ export async function ensureCodemodDeps({installDeps} = {}) {
|
|
|
296
329
|
* Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
|
|
297
330
|
* CONFIG codemod can repair a config the strict loader would otherwise reject.
|
|
298
331
|
* @param {CoreVersionManifest[]} versionManifests
|
|
299
|
-
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string
|
|
332
|
+
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, silent?: boolean}} options
|
|
300
333
|
*/
|
|
301
|
-
export async function runCoreCodemods(
|
|
334
|
+
export async function runCoreCodemods(
|
|
335
|
+
versionManifests,
|
|
336
|
+
{apply, path: srcPath, codemod, skipCodemods, root, protection, silent},
|
|
337
|
+
) {
|
|
302
338
|
return runCodemods(versionManifests, {
|
|
303
339
|
apply,
|
|
304
340
|
path: srcPath,
|
|
305
341
|
codemod,
|
|
306
342
|
skipCodemods,
|
|
307
|
-
silent: logger.silent,
|
|
343
|
+
silent: silent ?? logger.silent,
|
|
344
|
+
root,
|
|
345
|
+
protection,
|
|
308
346
|
});
|
|
309
347
|
}
|
|
310
348
|
|
|
311
349
|
/**
|
|
312
350
|
* Load the consumer project's config + integrations. Throws on invalid config;
|
|
313
351
|
* the run leaf decides between the config_fixable preview and a hard abort.
|
|
352
|
+
*
|
|
353
|
+
* Provider identity is resolved by the same resolver Project uses, on top of
|
|
354
|
+
* Project's ledger, under the codemod policy: a package that lists itself runs
|
|
355
|
+
* its installed copy's released codemods, never the work in progress being
|
|
356
|
+
* authored, and autolinked and local packages claim provider IDs without
|
|
357
|
+
* running codemods.
|
|
358
|
+
*
|
|
314
359
|
* @param {string} cwd
|
|
315
360
|
* @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
|
|
316
|
-
* @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]}>}
|
|
361
|
+
* @returns {Promise<{postCodemodHooks: import('../../authoring/config/type').PostCodemodHook[], integrations: import('../../foundation/integrations/integrations.mjs').LoadedIntegration[], ledger: import('../../foundation/integrations/provider-resolution.mjs').ProviderLedger}>}
|
|
317
362
|
*/
|
|
318
363
|
export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
|
|
319
364
|
// The CLI debug preflight may already have imported this config before core
|
|
@@ -321,12 +366,66 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
|
|
|
321
366
|
// cache entry; ordinary Project discovery remains cached by default.
|
|
322
367
|
const project = await Project.load(cwd, {fresh: true});
|
|
323
368
|
const postCodemodHooks = project.config.hooks?.postCodemod ?? [];
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
369
|
+
const configuredSpecs = new Set(project.integrations ?? []);
|
|
370
|
+
// Configured packages come from Project, which has already resolved provider
|
|
371
|
+
// identity over configured, autolinked, and local packages. Loading them
|
|
372
|
+
// again here would let upgrade run codemods from a package Project set aside.
|
|
373
|
+
// Autolinked packages and the package being authored join only as claimants:
|
|
374
|
+
// every other command uses them for their provider IDs, but upgrade has
|
|
375
|
+
// never run their codemods.
|
|
376
|
+
const candidates = project.loadedIntegrations.flatMap(integration => {
|
|
377
|
+
const source =
|
|
378
|
+
!integration.__autolinked && configuredSpecs.has(integration.__spec)
|
|
379
|
+
? /** @type {const} */ ('configured')
|
|
380
|
+
: integration.__autolinked
|
|
381
|
+
? /** @type {const} */ ('autolinked')
|
|
382
|
+
: integration.__local
|
|
383
|
+
? /** @type {const} */ ('local')
|
|
384
|
+
: null;
|
|
385
|
+
return source == null
|
|
386
|
+
? []
|
|
387
|
+
: [{source, integration, spec: integration.__spec}];
|
|
388
|
+
});
|
|
389
|
+
// A package that lists itself runs its installed copy's released codemods,
|
|
390
|
+
// never the work in progress being authored; the resolver puts that copy in
|
|
391
|
+
// its place. Naming the package being authored with --integration asks for
|
|
392
|
+
// the installed copy too.
|
|
393
|
+
const local = project.loadedIntegrations.find(
|
|
394
|
+
integration => integration.__local,
|
|
395
|
+
);
|
|
396
|
+
const selfListed =
|
|
397
|
+
local != null && !local.__autolinked && configuredSpecs.has(local.__spec);
|
|
398
|
+
const installed =
|
|
399
|
+
local != null && selfListed && project.configPath
|
|
400
|
+
? await loadIntegrations([local.__spec], {
|
|
401
|
+
cwd: path.dirname(project.configPath),
|
|
402
|
+
resolveProviders: false,
|
|
403
|
+
})
|
|
404
|
+
: [];
|
|
405
|
+
const extraSpecs = uniqueFiles(extraIntegrationSpecs ?? []).filter(
|
|
406
|
+
spec => !configuredSpecs.has(spec),
|
|
407
|
+
);
|
|
408
|
+
const extras =
|
|
409
|
+
extraSpecs.length === 0
|
|
410
|
+
? []
|
|
411
|
+
: await loadIntegrations(extraSpecs, {resolveProviders: false});
|
|
412
|
+
const {integrations, ledger} = resolveProviders(
|
|
413
|
+
[
|
|
414
|
+
...candidates,
|
|
415
|
+
...installed.map(integration => ({
|
|
416
|
+
source: /** @type {const} */ ('installed'),
|
|
417
|
+
integration,
|
|
418
|
+
spec: integration.__spec,
|
|
419
|
+
})),
|
|
420
|
+
...extras.map(integration => ({
|
|
421
|
+
source: /** @type {const} */ ('extra'),
|
|
422
|
+
integration,
|
|
423
|
+
spec: integration.__spec,
|
|
424
|
+
})),
|
|
425
|
+
],
|
|
426
|
+
{codemods: true, prior: providerLedgerOf(project)},
|
|
427
|
+
);
|
|
428
|
+
return {postCodemodHooks, integrations, ledger};
|
|
330
429
|
}
|
|
331
430
|
|
|
332
431
|
/**
|
|
@@ -361,7 +460,10 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
|
|
|
361
460
|
try {
|
|
362
461
|
const byVersion = await discoverIntegrationCodemods([integration]);
|
|
363
462
|
for (const [version, rawList] of byVersion) {
|
|
364
|
-
const list =
|
|
463
|
+
const list =
|
|
464
|
+
/** @type {Array<import('../../authoring/codemod/type').CodemodEntry>} */ (
|
|
465
|
+
/** @type {unknown} */ (rawList)
|
|
466
|
+
);
|
|
365
467
|
const existing = integrationCodemodsByVersion.get(version);
|
|
366
468
|
if (existing) existing.push(...list);
|
|
367
469
|
else integrationCodemodsByVersion.set(version, [...list]);
|
|
@@ -378,9 +480,21 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
|
|
|
378
480
|
/**
|
|
379
481
|
* Run the file-based INTEGRATION codemods (config codemods first, then code).
|
|
380
482
|
* @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
|
|
381
|
-
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string
|
|
483
|
+
* @param {{apply: boolean, path: string, codemod?: string, skipCodemods: Set<string>, root?: string, protection?: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, contents?: Map<string, string>, silent?: boolean}} options
|
|
382
484
|
*/
|
|
383
|
-
export async function runIntegrationCodemodsStep(
|
|
485
|
+
export async function runIntegrationCodemodsStep(
|
|
486
|
+
versionGroups,
|
|
487
|
+
{
|
|
488
|
+
apply,
|
|
489
|
+
path: srcPath,
|
|
490
|
+
codemod,
|
|
491
|
+
skipCodemods,
|
|
492
|
+
root,
|
|
493
|
+
protection,
|
|
494
|
+
contents,
|
|
495
|
+
silent,
|
|
496
|
+
},
|
|
497
|
+
) {
|
|
384
498
|
const jscodeshift = (await import('jscodeshift')).default;
|
|
385
499
|
return runIntegrationCodemods(versionGroups, {
|
|
386
500
|
apply,
|
|
@@ -388,6 +502,9 @@ export async function runIntegrationCodemodsStep(versionGroups, {apply, path: sr
|
|
|
388
502
|
codemod,
|
|
389
503
|
skipCodemods,
|
|
390
504
|
jscodeshift,
|
|
391
|
-
silent: logger.silent,
|
|
505
|
+
silent: silent ?? logger.silent,
|
|
506
|
+
root,
|
|
507
|
+
protection,
|
|
508
|
+
contents,
|
|
392
509
|
});
|
|
393
510
|
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import {collectAllCodemods} from '../_adapter.mjs';
|
|
12
12
|
import {logger} from '../../logger.mjs';
|
|
13
|
+
import {toAscii} from '../../../assets/codemods/term-log.mjs';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* List every available codemod (oldest→newest).
|
|
@@ -19,7 +20,7 @@ export async function list() {
|
|
|
19
20
|
const codemods = await collectAllCodemods();
|
|
20
21
|
logger.log('Available codemods:');
|
|
21
22
|
for (const {name, title, pr, optional} of codemods) {
|
|
22
|
-
logger.log(` ${name}
|
|
23
|
+
logger.log(` ${name} - ${toAscii(title)}${optional ? ' (optional)' : ''} (${pr})`);
|
|
23
24
|
}
|
|
24
25
|
logger.log('Done\n');
|
|
25
26
|
return {
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Colocated tests for the upgrade.list leaf: every field an entry
|
|
5
|
+
* carries is declared on the canonical `UpgradeListEntry` type, and every
|
|
6
|
+
* declared field is present on every entry.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {describe, it, expect} from 'vitest';
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import {fileURLToPath} from 'node:url';
|
|
12
|
+
import ts from 'typescript';
|
|
13
|
+
import {list} from './list.mjs';
|
|
14
|
+
|
|
15
|
+
const TYPE_FILE = fileURLToPath(
|
|
16
|
+
new URL('../upgrade.type.mjs', import.meta.url),
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Property names a JSDoc `@typedef {object}` declares, parsed from the file.
|
|
21
|
+
* @param {string} typedefName
|
|
22
|
+
* @returns {string[]}
|
|
23
|
+
*/
|
|
24
|
+
function declaredProperties(typedefName) {
|
|
25
|
+
const source = ts.createSourceFile(
|
|
26
|
+
TYPE_FILE,
|
|
27
|
+
fs.readFileSync(TYPE_FILE, 'utf8'),
|
|
28
|
+
ts.ScriptTarget.Latest,
|
|
29
|
+
true,
|
|
30
|
+
ts.ScriptKind.JS,
|
|
31
|
+
);
|
|
32
|
+
/** @type {string[]} */
|
|
33
|
+
const names = [];
|
|
34
|
+
for (const statement of source.statements) {
|
|
35
|
+
for (const doc of /** @type {any} */ (statement).jsDoc ?? []) {
|
|
36
|
+
for (const tag of doc.tags ?? []) {
|
|
37
|
+
if (
|
|
38
|
+
!ts.isJSDocTypedefTag(tag) ||
|
|
39
|
+
tag.name?.getText(source) !== typedefName
|
|
40
|
+
) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const literal = tag.typeExpression;
|
|
44
|
+
if (literal && ts.isJSDocTypeLiteral(literal)) {
|
|
45
|
+
for (const property of literal.jsDocPropertyTags ?? []) {
|
|
46
|
+
names.push(property.name.getText(source));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return names.sort();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe('upgrade.list entries', () => {
|
|
56
|
+
it('carry exactly the fields UpgradeListEntry declares', async () => {
|
|
57
|
+
const declared = declaredProperties('UpgradeListEntry');
|
|
58
|
+
expect(declared.length).toBeGreaterThan(0);
|
|
59
|
+
|
|
60
|
+
const {type, data} = await list();
|
|
61
|
+
expect(type).toBe('upgrade.list');
|
|
62
|
+
expect(data.length).toBeGreaterThan(0);
|
|
63
|
+
for (const entry of data) {
|
|
64
|
+
expect(Object.keys(entry).sort()).toEqual(declared);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('marks optional codemods with a boolean', async () => {
|
|
69
|
+
const {data} = await list();
|
|
70
|
+
for (const entry of data) expect(typeof entry.optional).toBe('boolean');
|
|
71
|
+
expect(data.some(entry => entry.optional)).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
});
|