@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* astryx --json upgrade --list
|
|
6
6
|
*/
|
|
7
7
|
export type UpgradeListResponse = {
|
|
8
8
|
type: "upgrade.list";
|
|
@@ -12,6 +12,10 @@ export type UpgradeListEntry = {
|
|
|
12
12
|
name: string;
|
|
13
13
|
title: string;
|
|
14
14
|
version: string;
|
|
15
|
+
/**
|
|
16
|
+
* True when the codemod runs only if named with `--codemod`.
|
|
17
|
+
*/
|
|
18
|
+
optional: boolean;
|
|
15
19
|
};
|
|
16
20
|
/**
|
|
17
21
|
* State of the managed agent-docs block (`<!-- ASTRYX:START --> … END -->`)
|
|
@@ -121,14 +125,39 @@ export type RegistryCompositionSummary = {
|
|
|
121
125
|
items: RegistryCompositionItemSummary[];
|
|
122
126
|
};
|
|
123
127
|
/**
|
|
124
|
-
*
|
|
128
|
+
* astryx --json upgrade --registry [--apply]
|
|
125
129
|
*/
|
|
126
130
|
export type UpgradeRegistryResponse = {
|
|
127
131
|
type: "upgrade.registry";
|
|
128
132
|
data: RegistryCompositionSummary;
|
|
129
133
|
};
|
|
130
134
|
/**
|
|
131
|
-
*
|
|
135
|
+
* A required codemod change blocked by effective working-tree protection.
|
|
136
|
+
*/
|
|
137
|
+
export type ProtectedCodemodFile = {
|
|
138
|
+
/**
|
|
139
|
+
* Project-relative path.
|
|
140
|
+
*/
|
|
141
|
+
file: string;
|
|
142
|
+
/**
|
|
143
|
+
* Codemods that still require a change.
|
|
144
|
+
*/
|
|
145
|
+
codemods: string[];
|
|
146
|
+
/**
|
|
147
|
+
* Protection categories (generated, vendored, ignored, and hard boundaries).
|
|
148
|
+
*/
|
|
149
|
+
reasons: string[];
|
|
150
|
+
/**
|
|
151
|
+
* Effective declarations that protect the file.
|
|
152
|
+
*/
|
|
153
|
+
declarations: string[];
|
|
154
|
+
/**
|
|
155
|
+
* Exact regeneration commands found in generated headers, when present.
|
|
156
|
+
*/
|
|
157
|
+
commands: string[];
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* astryx --json upgrade [--apply]
|
|
132
161
|
*/
|
|
133
162
|
export type UpgradeRunResponse = {
|
|
134
163
|
type: "upgrade.run";
|
|
@@ -140,7 +169,16 @@ export type UpgradeRunResponse = {
|
|
|
140
169
|
agentDocsRefreshed: boolean;
|
|
141
170
|
agentDocs: AgentDocsSummary;
|
|
142
171
|
registryCompositions?: RegistryCompositionSummary | undefined;
|
|
172
|
+
complete?: boolean | undefined;
|
|
173
|
+
errorCode?: "ERR_CODEMOD_PROTECTED" | undefined;
|
|
143
174
|
filesChanged?: number | undefined;
|
|
175
|
+
modifiedFiles?: string[] | undefined;
|
|
176
|
+
protectedFiles?: ProtectedCodemodFile[] | undefined;
|
|
177
|
+
declinedCandidates?: {
|
|
178
|
+
file: string;
|
|
179
|
+
location?: string;
|
|
180
|
+
reason: string;
|
|
181
|
+
}[] | undefined;
|
|
144
182
|
transformsApplied?: number | undefined;
|
|
145
183
|
errors?: {
|
|
146
184
|
file: string;
|
|
@@ -150,7 +188,7 @@ export type UpgradeRunResponse = {
|
|
|
150
188
|
};
|
|
151
189
|
};
|
|
152
190
|
/**
|
|
153
|
-
*
|
|
191
|
+
* astryx --json upgrade — short-circuit status results.
|
|
154
192
|
*
|
|
155
193
|
* - `up_to_date`: `--from` is >= installed target and `--force` was not passed.
|
|
156
194
|
* - `no_codemods`: no codemods (core or integration) apply to the range.
|
|
@@ -211,7 +249,7 @@ export type UpgradeOptions = {
|
|
|
211
249
|
*/
|
|
212
250
|
skipCodemod?: string[] | undefined;
|
|
213
251
|
/**
|
|
214
|
-
* Explicit integration
|
|
252
|
+
* Explicit integration specifiers resolved beneath node_modules; absolute paths and `.` or `..` segments are rejected.
|
|
215
253
|
*/
|
|
216
254
|
integration?: string[] | undefined;
|
|
217
255
|
/**
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
* @file Colocated types for the `upgrade` command — source of truth for the
|
|
5
5
|
* upgrade command JSON responses. Re-exported by `types/upgrade.d.ts`.
|
|
6
6
|
*
|
|
7
|
-
* Invocation
|
|
7
|
+
* Invocation -> type discriminator
|
|
8
8
|
* ------------------------------------------------------------------
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* (version detection failure)
|
|
9
|
+
* astryx --json upgrade --list -> upgrade.list
|
|
10
|
+
* astryx --json upgrade [--apply] -> upgrade.run
|
|
11
|
+
* astryx --json upgrade --registry [--apply] -> upgrade.registry
|
|
12
|
+
* astryx --json upgrade (status short-circuit) -> upgrade.status
|
|
13
|
+
* (version detection failure) -> CLIError
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* astryx --json upgrade --list
|
|
18
18
|
* @typedef {object} UpgradeListResponse
|
|
19
19
|
* @property {'upgrade.list'} type
|
|
20
20
|
* @property {UpgradeListEntry[]} data
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* @property {string} name
|
|
26
26
|
* @property {string} title
|
|
27
27
|
* @property {string} version
|
|
28
|
+
* @property {boolean} optional True when the codemod runs only if named with `--codemod`.
|
|
28
29
|
*/
|
|
29
30
|
|
|
30
31
|
/**
|
|
@@ -88,14 +89,24 @@
|
|
|
88
89
|
*/
|
|
89
90
|
|
|
90
91
|
/**
|
|
91
|
-
*
|
|
92
|
+
* astryx --json upgrade --registry [--apply]
|
|
92
93
|
* @typedef {object} UpgradeRegistryResponse
|
|
93
94
|
* @property {'upgrade.registry'} type
|
|
94
95
|
* @property {RegistryCompositionSummary} data
|
|
95
96
|
*/
|
|
96
97
|
|
|
97
98
|
/**
|
|
98
|
-
*
|
|
99
|
+
* A required codemod change blocked by effective working-tree protection.
|
|
100
|
+
* @typedef {object} ProtectedCodemodFile
|
|
101
|
+
* @property {string} file Project-relative path.
|
|
102
|
+
* @property {string[]} codemods Codemods that still require a change.
|
|
103
|
+
* @property {string[]} reasons Protection categories (generated, vendored, ignored, and hard boundaries).
|
|
104
|
+
* @property {string[]} declarations Effective declarations that protect the file.
|
|
105
|
+
* @property {string[]} commands Exact regeneration commands found in generated headers, when present.
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* astryx --json upgrade [--apply]
|
|
99
110
|
* @typedef {object} UpgradeRunResponse
|
|
100
111
|
* @property {'upgrade.run'} type
|
|
101
112
|
* @property {object} data
|
|
@@ -106,13 +117,18 @@
|
|
|
106
117
|
* @property {boolean} data.agentDocsRefreshed
|
|
107
118
|
* @property {AgentDocsSummary} data.agentDocs
|
|
108
119
|
* @property {RegistryCompositionSummary} [data.registryCompositions]
|
|
120
|
+
* @property {boolean} [data.complete] False when protected required changes remain.
|
|
121
|
+
* @property {'ERR_CODEMOD_PROTECTED'} [data.errorCode] Stable incomplete-result code when complete is false.
|
|
109
122
|
* @property {number} [data.filesChanged] Total files changed across core + integration codemods (apply mode).
|
|
123
|
+
* @property {string[]} [data.modifiedFiles] Project-relative files changed or previewed.
|
|
124
|
+
* @property {ProtectedCodemodFile[]} [data.protectedFiles] Protected files that still require a codemod change after regeneration.
|
|
125
|
+
* @property {Array<{file: string, location?: string, reason: string}>} [data.declinedCandidates] Candidates left unchanged because proof was insufficient.
|
|
110
126
|
* @property {number} [data.transformsApplied] Total transforms that reported a change.
|
|
111
127
|
* @property {Array<{file: string, codemod: string, error: string}>} [data.errors] Per-codemod errors, when any codemod failed.
|
|
112
128
|
*/
|
|
113
129
|
|
|
114
130
|
/**
|
|
115
|
-
*
|
|
131
|
+
* astryx --json upgrade — short-circuit status results.
|
|
116
132
|
*
|
|
117
133
|
* - `up_to_date`: `--from` is >= installed target and `--force` was not passed.
|
|
118
134
|
* - `no_codemods`: no codemods (core or integration) apply to the range.
|
|
@@ -135,7 +151,7 @@
|
|
|
135
151
|
* @property {boolean} [force] Run codemods even if `from` >= installed.
|
|
136
152
|
* @property {string} [codemod] Run a single named transform.
|
|
137
153
|
* @property {string[]} [skipCodemod] Exclude named codemods (re-run past a failure).
|
|
138
|
-
* @property {string[]} [integration] Explicit integration
|
|
154
|
+
* @property {string[]} [integration] Explicit integration specifiers resolved beneath node_modules; absolute paths and `.` or `..` segments are rejected.
|
|
139
155
|
* @property {string} [path] Source directory to scan (default `./src`).
|
|
140
156
|
* @property {boolean} [installDeps] Auto-install jscodeshift without prompting.
|
|
141
157
|
* @property {boolean} [registry] Reconcile only ShadCN-copied compositions; `from` is not required.
|
|
@@ -21,6 +21,40 @@ afterEach(() => {
|
|
|
21
21
|
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
+
describe('runCodemods — ordered dry-run state', () => {
|
|
25
|
+
it('feeds each previewed code transform into the next transform', async () => {
|
|
26
|
+
const srcDir = path.join(tmpDir, 'src');
|
|
27
|
+
fs.mkdirSync(srcDir);
|
|
28
|
+
fs.writeFileSync(path.join(srcDir, 'a.ts'), 'const value = "a";\n');
|
|
29
|
+
const transforms = [
|
|
30
|
+
{
|
|
31
|
+
name: 'a-to-b',
|
|
32
|
+
meta: {title: 'a to b'},
|
|
33
|
+
transform: file => file.source.replace('"a"', '"b"'),
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'b-to-c',
|
|
37
|
+
meta: {title: 'b to c'},
|
|
38
|
+
transform: file => file.source.replace('"b"', '"c"'),
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
const preview = await runCodemods([{version: '1.0.0', transforms}], {
|
|
43
|
+
apply: false,
|
|
44
|
+
path: srcDir,
|
|
45
|
+
root: tmpDir,
|
|
46
|
+
silent: true,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
expect(preview.totalFilesChanged).toBe(2);
|
|
50
|
+
expect(preview.changedFiles).toEqual([
|
|
51
|
+
path.join(srcDir, 'a.ts'),
|
|
52
|
+
path.join(srcDir, 'a.ts'),
|
|
53
|
+
]);
|
|
54
|
+
expect(fs.readFileSync(path.join(srcDir, 'a.ts'), 'utf8')).toContain('"a"');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
24
58
|
describe('runCodemods — unified config codemod path', () => {
|
|
25
59
|
it('routes a core config codemod through the (file, api) runner to edit astryx.config.*', async () => {
|
|
26
60
|
fs.writeFileSync(
|
|
@@ -195,17 +229,219 @@ describe('runCodemods — unified config codemod path', () => {
|
|
|
195
229
|
});
|
|
196
230
|
});
|
|
197
231
|
|
|
198
|
-
describe('
|
|
232
|
+
describe('runCodemods — project plans honor existing-file protection', () => {
|
|
233
|
+
it('applies new and owned writes while blocking protected replacements and deletes', async () => {
|
|
234
|
+
fs.writeFileSync(
|
|
235
|
+
path.join(tmpDir, '.gitattributes'),
|
|
236
|
+
'generated/** linguist-generated=true\n',
|
|
237
|
+
);
|
|
238
|
+
fs.mkdirSync(path.join(tmpDir, 'generated'), {recursive: true});
|
|
239
|
+
fs.writeFileSync(path.join(tmpDir, 'generated', 'replace.ts'), 'old\n');
|
|
240
|
+
fs.writeFileSync(path.join(tmpDir, 'generated', 'remove.ts'), 'old\n');
|
|
241
|
+
fs.writeFileSync(path.join(tmpDir, 'owned.ts'), 'old\n');
|
|
242
|
+
|
|
243
|
+
const manifests = [
|
|
244
|
+
{
|
|
245
|
+
version: '1.0.0',
|
|
246
|
+
transforms: [
|
|
247
|
+
{
|
|
248
|
+
name: 'project-plan',
|
|
249
|
+
meta: {title: 'project plan', codemodType: 'project'},
|
|
250
|
+
transform: async root => ({
|
|
251
|
+
writes: [
|
|
252
|
+
{
|
|
253
|
+
path: path.join(root, 'generated', 'replace.ts'),
|
|
254
|
+
contents: 'new\n',
|
|
255
|
+
},
|
|
256
|
+
{path: path.join(root, 'owned.ts'), contents: 'new\n'},
|
|
257
|
+
{path: path.join(root, 'created.ts'), contents: 'new\n'},
|
|
258
|
+
],
|
|
259
|
+
deletes: [path.join(root, 'generated', 'remove.ts')],
|
|
260
|
+
problems: [],
|
|
261
|
+
}),
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
|
|
267
|
+
const result = await runCodemods(manifests, {
|
|
268
|
+
apply: true,
|
|
269
|
+
path: './missing',
|
|
270
|
+
root: tmpDir,
|
|
271
|
+
silent: true,
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
expect(
|
|
275
|
+
fs.readFileSync(path.join(tmpDir, 'generated', 'replace.ts'), 'utf8'),
|
|
276
|
+
).toBe('old\n');
|
|
277
|
+
expect(fs.existsSync(path.join(tmpDir, 'generated', 'remove.ts'))).toBe(
|
|
278
|
+
true,
|
|
279
|
+
);
|
|
280
|
+
expect(fs.readFileSync(path.join(tmpDir, 'owned.ts'), 'utf8')).toBe(
|
|
281
|
+
'new\n',
|
|
282
|
+
);
|
|
283
|
+
expect(fs.readFileSync(path.join(tmpDir, 'created.ts'), 'utf8')).toBe(
|
|
284
|
+
'new\n',
|
|
285
|
+
);
|
|
286
|
+
expect(result.totalFilesChanged).toBe(2);
|
|
287
|
+
expect(result.protectedFiles.map(item => item.file).sort()).toEqual([
|
|
288
|
+
'generated/remove.ts',
|
|
289
|
+
'generated/replace.ts',
|
|
290
|
+
]);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it('blocks an existing file protected by a declaration in the same plan', async () => {
|
|
294
|
+
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
295
|
+
fs.writeFileSync(path.join(tmpDir, 'src', 'out.ts'), 'old\n');
|
|
296
|
+
const manifests = [
|
|
297
|
+
{
|
|
298
|
+
version: '1.0.0',
|
|
299
|
+
transforms: [
|
|
300
|
+
{
|
|
301
|
+
name: 'declare-and-replace',
|
|
302
|
+
meta: {title: 'declare and replace', codemodType: 'project'},
|
|
303
|
+
transform: async root => ({
|
|
304
|
+
writes: [
|
|
305
|
+
{
|
|
306
|
+
path: path.join(root, '.gitattributes'),
|
|
307
|
+
contents: 'src/out.ts linguist-generated\n',
|
|
308
|
+
},
|
|
309
|
+
{path: path.join(root, 'src', 'out.ts'), contents: 'new\n'},
|
|
310
|
+
],
|
|
311
|
+
deletes: [],
|
|
312
|
+
problems: [],
|
|
313
|
+
}),
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
];
|
|
318
|
+
|
|
319
|
+
const result = await runCodemods(manifests, {
|
|
320
|
+
apply: true,
|
|
321
|
+
path: './missing',
|
|
322
|
+
root: tmpDir,
|
|
323
|
+
silent: true,
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
expect(fs.readFileSync(path.join(tmpDir, 'src', 'out.ts'), 'utf8')).toBe(
|
|
327
|
+
'old\n',
|
|
328
|
+
);
|
|
329
|
+
expect(fs.readFileSync(path.join(tmpDir, '.gitattributes'), 'utf8')).toBe(
|
|
330
|
+
'src/out.ts linguist-generated\n',
|
|
331
|
+
);
|
|
332
|
+
expect(result.protectedFiles).toEqual([
|
|
333
|
+
expect.objectContaining({
|
|
334
|
+
file: 'src/out.ts',
|
|
335
|
+
declaration: 'linguist-generated in .gitattributes:1',
|
|
336
|
+
}),
|
|
337
|
+
]);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('does not apply rules from a blocked staged declaration', async () => {
|
|
341
|
+
fs.writeFileSync(
|
|
342
|
+
path.join(tmpDir, '.gitattributes'),
|
|
343
|
+
'.gitattributes linguist-generated\n',
|
|
344
|
+
);
|
|
345
|
+
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
346
|
+
fs.writeFileSync(path.join(tmpDir, 'src', 'out.ts'), 'old\n');
|
|
347
|
+
const result = await runCodemods(
|
|
348
|
+
[
|
|
349
|
+
{
|
|
350
|
+
version: '1.0.0',
|
|
351
|
+
transforms: [
|
|
352
|
+
{
|
|
353
|
+
name: 'blocked-declaration',
|
|
354
|
+
meta: {title: 'blocked declaration', codemodType: 'project'},
|
|
355
|
+
transform: async root => ({
|
|
356
|
+
writes: [
|
|
357
|
+
{
|
|
358
|
+
path: path.join(root, '.gitattributes'),
|
|
359
|
+
contents: 'src/out.ts linguist-generated\n',
|
|
360
|
+
},
|
|
361
|
+
{path: path.join(root, 'src', 'out.ts'), contents: 'new\n'},
|
|
362
|
+
],
|
|
363
|
+
deletes: [],
|
|
364
|
+
problems: [],
|
|
365
|
+
}),
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
{apply: true, path: './missing', root: tmpDir, silent: true},
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
expect(fs.readFileSync(path.join(tmpDir, 'src', 'out.ts'), 'utf8')).toBe(
|
|
374
|
+
'new\n',
|
|
375
|
+
);
|
|
376
|
+
expect(result.protectedFiles).toEqual([
|
|
377
|
+
expect.objectContaining({file: '.gitattributes'}),
|
|
378
|
+
]);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('refreshes declarations written by an earlier project codemod before later writes', async () => {
|
|
382
|
+
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
383
|
+
fs.writeFileSync(path.join(tmpDir, 'src', 'out.ts'), 'const foo = 1;\n');
|
|
384
|
+
const manifests = [
|
|
385
|
+
{
|
|
386
|
+
version: '1.0.0',
|
|
387
|
+
transforms: [
|
|
388
|
+
{
|
|
389
|
+
name: 'declare-generated',
|
|
390
|
+
meta: {title: 'declare generated', codemodType: 'project'},
|
|
391
|
+
transform: async root => ({
|
|
392
|
+
writes: [
|
|
393
|
+
{
|
|
394
|
+
path: path.join(root, '.gitattributes'),
|
|
395
|
+
contents: 'src/out.ts linguist-generated=true\n',
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
deletes: [],
|
|
399
|
+
problems: [],
|
|
400
|
+
}),
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
name: 'rename-after-declaration',
|
|
404
|
+
meta: {title: 'rename after declaration'},
|
|
405
|
+
transform: file => file.source.replace('foo', 'bar'),
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
},
|
|
409
|
+
];
|
|
410
|
+
|
|
411
|
+
const result = await runCodemods(manifests, {
|
|
412
|
+
apply: true,
|
|
413
|
+
path: path.join(tmpDir, 'src'),
|
|
414
|
+
root: tmpDir,
|
|
415
|
+
silent: true,
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
expect(
|
|
419
|
+
fs.readFileSync(path.join(tmpDir, 'src', 'out.ts'), 'utf8'),
|
|
420
|
+
).toContain('foo');
|
|
421
|
+
expect(result.protectedFiles).toEqual([
|
|
422
|
+
expect.objectContaining({
|
|
423
|
+
file: 'src/out.ts',
|
|
424
|
+
declaration: 'linguist-generated in .gitattributes:1',
|
|
425
|
+
}),
|
|
426
|
+
]);
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
describe('findSourceFiles — scan boundaries (symlink + declared protection)', () => {
|
|
199
431
|
const manifests = [
|
|
200
432
|
{
|
|
201
433
|
version: '0.1.3',
|
|
202
434
|
transforms: [
|
|
203
|
-
{
|
|
435
|
+
{
|
|
436
|
+
name: 'p',
|
|
437
|
+
meta: {title: 'p'},
|
|
438
|
+
transform: f => f.source.replace(/foo/g, 'bar'),
|
|
439
|
+
},
|
|
204
440
|
],
|
|
205
441
|
},
|
|
206
442
|
];
|
|
207
443
|
|
|
208
|
-
it('
|
|
444
|
+
it('reports a symlinked file without writing through it', async () => {
|
|
209
445
|
const outside = path.join(tmpDir, 'outside');
|
|
210
446
|
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
211
447
|
fs.mkdirSync(outside, {recursive: true});
|
|
@@ -214,13 +450,45 @@ describe('findSourceFiles — scan boundaries (symlink + build dirs)', () => {
|
|
|
214
450
|
fs.writeFileSync(path.join(tmpDir, 'src', 'real.ts'), 'const foo = 2;\n');
|
|
215
451
|
fs.symlinkSync(secret, path.join(tmpDir, 'src', 'link.ts'));
|
|
216
452
|
|
|
217
|
-
const r = await runCodemods(manifests, {
|
|
453
|
+
const r = await runCodemods(manifests, {
|
|
454
|
+
apply: true,
|
|
455
|
+
path: './src',
|
|
456
|
+
silent: true,
|
|
457
|
+
});
|
|
218
458
|
// the symlink target (outside the tree) must be untouched
|
|
219
459
|
expect(fs.readFileSync(secret, 'utf-8')).toBe('const foo = 1;\n');
|
|
220
460
|
expect(r.writtenFiles.map(f => path.basename(f))).toEqual(['real.ts']);
|
|
461
|
+
expect(r.protectedFiles).toEqual([
|
|
462
|
+
expect.objectContaining({file: 'src/link.ts', reason: 'symlink'}),
|
|
463
|
+
]);
|
|
221
464
|
});
|
|
222
465
|
|
|
223
|
-
it('
|
|
466
|
+
it('reports matching descendants of a symlinked directory without writing through it', async () => {
|
|
467
|
+
const targetDir = path.join(tmpDir, 'target');
|
|
468
|
+
const srcDir = path.join(tmpDir, 'src');
|
|
469
|
+
fs.mkdirSync(targetDir, {recursive: true});
|
|
470
|
+
fs.mkdirSync(srcDir, {recursive: true});
|
|
471
|
+
const target = path.join(targetDir, 'nested.ts');
|
|
472
|
+
fs.writeFileSync(target, 'const foo = 1;\n');
|
|
473
|
+
fs.symlinkSync(targetDir, path.join(srcDir, 'linked'));
|
|
474
|
+
|
|
475
|
+
const result = await runCodemods(manifests, {
|
|
476
|
+
apply: true,
|
|
477
|
+
path: srcDir,
|
|
478
|
+
root: tmpDir,
|
|
479
|
+
silent: true,
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
expect(fs.readFileSync(target, 'utf8')).toContain('foo');
|
|
483
|
+
expect(result.protectedFiles).toEqual([
|
|
484
|
+
expect.objectContaining({
|
|
485
|
+
file: 'src/linked/nested.ts',
|
|
486
|
+
reason: 'symlink',
|
|
487
|
+
}),
|
|
488
|
+
]);
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
it('does not infer protection from generated-looking directory names', async () => {
|
|
224
492
|
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
225
493
|
fs.mkdirSync(path.join(tmpDir, 'dist'), {recursive: true});
|
|
226
494
|
fs.mkdirSync(path.join(tmpDir, 'build'), {recursive: true});
|
|
@@ -228,8 +496,62 @@ describe('findSourceFiles — scan boundaries (symlink + build dirs)', () => {
|
|
|
228
496
|
fs.writeFileSync(path.join(tmpDir, 'dist', 'b.js'), 'const foo = 2;\n');
|
|
229
497
|
fs.writeFileSync(path.join(tmpDir, 'build', 'c.js'), 'const foo = 3;\n');
|
|
230
498
|
|
|
231
|
-
const r = await runCodemods(manifests, {
|
|
232
|
-
|
|
233
|
-
|
|
499
|
+
const r = await runCodemods(manifests, {
|
|
500
|
+
apply: true,
|
|
501
|
+
path: '.',
|
|
502
|
+
silent: true,
|
|
503
|
+
});
|
|
504
|
+
expect(r.writtenFiles.map(f => path.basename(f)).sort()).toEqual([
|
|
505
|
+
'a.ts',
|
|
506
|
+
'b.js',
|
|
507
|
+
'c.js',
|
|
508
|
+
]);
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
it('changes owned files but reports generated files without writing them', async () => {
|
|
512
|
+
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
513
|
+
fs.mkdirSync(path.join(tmpDir, 'dist'), {recursive: true});
|
|
514
|
+
fs.writeFileSync(
|
|
515
|
+
path.join(tmpDir, '.gitattributes'),
|
|
516
|
+
'dist/** linguist-generated=true\n',
|
|
517
|
+
);
|
|
518
|
+
fs.writeFileSync(path.join(tmpDir, 'src', 'owned.ts'), 'const foo = 1;\n');
|
|
519
|
+
fs.writeFileSync(
|
|
520
|
+
path.join(tmpDir, 'dist', 'output.js'),
|
|
521
|
+
'const foo = 2;\n',
|
|
522
|
+
);
|
|
523
|
+
|
|
524
|
+
const r = await runCodemods(manifests, {
|
|
525
|
+
apply: true,
|
|
526
|
+
path: '.',
|
|
527
|
+
silent: true,
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
expect(
|
|
531
|
+
fs.readFileSync(path.join(tmpDir, 'src', 'owned.ts'), 'utf-8'),
|
|
532
|
+
).toContain('bar');
|
|
533
|
+
expect(
|
|
534
|
+
fs.readFileSync(path.join(tmpDir, 'dist', 'output.js'), 'utf-8'),
|
|
535
|
+
).toContain('foo');
|
|
536
|
+
expect(r.protectedFiles).toEqual([
|
|
537
|
+
expect.objectContaining({
|
|
538
|
+
file: 'dist/output.js',
|
|
539
|
+
reason: 'generated',
|
|
540
|
+
declaration: 'linguist-generated in .gitattributes:1',
|
|
541
|
+
}),
|
|
542
|
+
]);
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it('fails closed before an owned write when a declaration is malformed', async () => {
|
|
546
|
+
fs.mkdirSync(path.join(tmpDir, 'src'), {recursive: true});
|
|
547
|
+
fs.writeFileSync(path.join(tmpDir, 'src', 'owned.ts'), 'const foo = 1;\n');
|
|
548
|
+
fs.writeFileSync(path.join(tmpDir, '.hgignore'), 'syntax: regexp\n[bad\n');
|
|
549
|
+
|
|
550
|
+
await expect(
|
|
551
|
+
runCodemods(manifests, {apply: true, path: '.', silent: true}),
|
|
552
|
+
).rejects.toThrow(/file-protection source \.hgignore/);
|
|
553
|
+
expect(
|
|
554
|
+
fs.readFileSync(path.join(tmpDir, 'src', 'owned.ts'), 'utf-8'),
|
|
555
|
+
).toContain('foo');
|
|
234
556
|
});
|
|
235
557
|
});
|
|
@@ -32,6 +32,40 @@ import {semverCompare} from '../../foundation/env/semver.mjs';
|
|
|
32
32
|
/** File extensions recognized as codemod modules. */
|
|
33
33
|
const CODEMOD_EXTENSIONS = ['.ts', '.mjs', '.js'];
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Directories never walked for codemods: a test directory beside a transform is
|
|
37
|
+
* the natural place to put its test, and every file found here is loaded and
|
|
38
|
+
* validated as a codemod.
|
|
39
|
+
*/
|
|
40
|
+
const SKIP_DIRS = new Set([
|
|
41
|
+
'node_modules',
|
|
42
|
+
'.git',
|
|
43
|
+
'__tests__',
|
|
44
|
+
'__fixtures__',
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Whether a file name is a test or fixture rather than a codemod.
|
|
49
|
+
*
|
|
50
|
+
* The trap this closes: EVERY `.ts`/`.mjs`/`.js` under a version folder used to
|
|
51
|
+
* be loaded as a codemod, so a test file colocated with its transform failed
|
|
52
|
+
* validation and — because a definition error is a hard error — took every
|
|
53
|
+
* codemod in that package's version with it. `astryx upgrade` then applied no
|
|
54
|
+
* transforms and reported success, which is the worst shape a failure can take.
|
|
55
|
+
*
|
|
56
|
+
* Core's own codemods never hit this: they are enumerated in a registry, and
|
|
57
|
+
* their colocated tests are simply not in it. Only integrations are discovered
|
|
58
|
+
* by walking a directory, so only integrations carry the landmine — which is why
|
|
59
|
+
* this is a loader fix and not a documentation one. It protects the integrations
|
|
60
|
+
* that already exist, which no authoring tool can reach.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} name a file's base name
|
|
63
|
+
* @returns {boolean}
|
|
64
|
+
*/
|
|
65
|
+
function isTestFile(name) {
|
|
66
|
+
return /\.(test|spec)\.[^.]+$/.test(name) || /\.fixture\.[^.]+$/.test(name);
|
|
67
|
+
}
|
|
68
|
+
|
|
35
69
|
/**
|
|
36
70
|
* Recursively collect codemod module files under a version folder. Returns
|
|
37
71
|
* entries of {id, file} where id is the extension-less relative path
|
|
@@ -49,14 +83,18 @@ function collectCodemodFiles(versionDir) {
|
|
|
49
83
|
for (const entry of entries) {
|
|
50
84
|
const full = path.join(dir, entry.name);
|
|
51
85
|
if (entry.isDirectory()) {
|
|
52
|
-
if (
|
|
86
|
+
if (SKIP_DIRS.has(entry.name)) continue;
|
|
53
87
|
walk(full);
|
|
54
88
|
continue;
|
|
55
89
|
}
|
|
56
90
|
const ext = path.extname(entry.name);
|
|
57
91
|
if (!CODEMOD_EXTENSIONS.includes(ext)) continue;
|
|
92
|
+
if (isTestFile(entry.name)) continue;
|
|
58
93
|
const rel = path.relative(versionDir, full);
|
|
59
|
-
const id = rel
|
|
94
|
+
const id = rel
|
|
95
|
+
.slice(0, rel.length - ext.length)
|
|
96
|
+
.split(path.sep)
|
|
97
|
+
.join('/');
|
|
60
98
|
out.push({id, file: full});
|
|
61
99
|
}
|
|
62
100
|
}
|
|
@@ -68,7 +106,7 @@ function collectCodemodFiles(versionDir) {
|
|
|
68
106
|
/**
|
|
69
107
|
* Discover file-based codemods contributed by configured integrations.
|
|
70
108
|
*
|
|
71
|
-
* @param {Array<{name?: string, codemods?: string, __spec?: string}>} loadedIntegrations
|
|
109
|
+
* @param {Array<{name?: string, codemods?: string, __spec?: string, __packageDir?: string}>} loadedIntegrations
|
|
72
110
|
* @returns {Promise<Map<string, Array<{id: string, type: 'code'|'config', codemod: object, package: string}>>>}
|
|
73
111
|
* Map keyed by version string; each value is the list of discovered codemods
|
|
74
112
|
* for that version (across all integrations).
|
|
@@ -107,7 +145,13 @@ export async function discoverIntegrationCodemods(loadedIntegrations = []) {
|
|
|
107
145
|
const seenInVersion = new Set();
|
|
108
146
|
|
|
109
147
|
for (const {id, file} of files) {
|
|
110
|
-
const
|
|
148
|
+
const shown = integration.__packageDir
|
|
149
|
+
? path
|
|
150
|
+
.relative(integration.__packageDir, file)
|
|
151
|
+
.split(path.sep)
|
|
152
|
+
.join('/')
|
|
153
|
+
: file;
|
|
154
|
+
const label = `Integration "${pkgLabel}" codemod ${version}/${id} (${shown})`;
|
|
111
155
|
|
|
112
156
|
if (seenInVersion.has(id)) {
|
|
113
157
|
throw new Error(
|