@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d
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/README.md +117 -79
- 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 +268 -47
- package/api/docs/_adapter.mjs +970 -149
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.d.mts +0 -15
- package/api/docs/detail/detail.mjs +22 -78
- package/api/docs/detail/section/section.mjs +39 -24
- package/api/docs/detail/section/section.test.mjs +19 -9
- package/api/docs/docs.d.mts +5 -3
- package/api/docs/docs.doc.mjs +39 -17
- package/api/docs/docs.mjs +44 -8
- package/api/docs/docs.test.mjs +158 -4
- package/api/docs/docs.type.d.mts +185 -6
- package/api/docs/docs.type.mjs +127 -13
- package/api/docs/index/index.mjs +15 -6
- package/api/docs/index/index.test.mjs +1 -1
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +14 -14
- 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 +54 -4
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +332 -21
- package/api/doctor/doctor.test.mjs +420 -7
- 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 +1 -1
- 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 +2 -0
- 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 +61 -10
- 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 +14 -2
- 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.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +11 -13
- 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 +124 -73
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -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 +8 -2
- package/api/upgrade/upgrade.type.d.mts +42 -4
- package/api/upgrade/upgrade.type.mjs +26 -10
- 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/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/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -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/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} +95 -39
- 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/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 +7 -7
- 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 +240 -128
- package/authoring/doctypes/_schema.mjs +198 -16
- package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
- package/authoring/doctypes/base/type.ts +9 -4
- 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 +4 -4
- package/authoring/doctypes/component/component.doc.mjs +5 -2
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +3 -3
- 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 +2 -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 +4 -3
- 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 +3 -3
- package/authoring/doctypes/legacy.d.mts +6 -6
- package/authoring/doctypes/legacy.mjs +3 -3
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
- package/authoring/doctypes/namespace/parse.d.mts +2 -2
- package/authoring/doctypes/namespace/parse.mjs +1 -1
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +6 -3
- package/authoring/doctypes/parse.d.mts +22 -20
- package/authoring/doctypes/parse.mjs +19 -14
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +1 -1
- package/authoring/doctypes/reference/reference.doc.mjs +39 -6
- package/authoring/doctypes/reference/type.ts +31 -14
- 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 +3 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +37 -1
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +12 -1
- 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 -11
- 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 +9 -9
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.mjs +3 -2
- package/authoring/identity/type.ts +10 -10
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +32 -19
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/schema.d.mts +4 -4
- package/authoring/integration/schema.mjs +3 -3
- package/authoring/integration/type.ts +5 -11
- 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 +21 -9
- package/clients/cli/commands/docs.mjs +184 -70
- package/clients/cli/commands/docs.test.mjs +120 -16
- 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 +3 -3
- 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 +20 -8
- 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 +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -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 +32 -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 +246 -89
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +38 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
- 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 +38 -0
- package/foundation/discovery/component-discovery.mjs +48 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +114 -9
- package/foundation/discovery/docs-discovery.mjs +239 -30
- package/foundation/discovery/docs-discovery.test.mjs +150 -35
- package/foundation/discovery/docs-output-budget.d.mts +2 -2
- package/foundation/discovery/docs-output-budget.mjs +1 -1
- package/foundation/discovery/docs-section-key.d.mts +28 -10
- package/foundation/discovery/docs-section-key.mjs +134 -33
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- 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 +772 -82
- 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/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -52
- 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 +51 -26
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +17 -1
- package/foundation/integrations/integrations.mjs +52 -98
- package/foundation/integrations/integrations.test.mjs +31 -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.mjs +121 -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 +11 -0
- 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 +37 -22
- 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
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,17 +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';
|
|
36
|
-
import {
|
|
37
|
-
|
|
38
|
-
markProviderConflicts,
|
|
39
|
-
} from '../../foundation/integrations/integrations.mjs';
|
|
38
|
+
import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
|
|
39
|
+
import {loadIntegrations} from '../../foundation/integrations/integrations.mjs';
|
|
40
|
+
import {resolveProviders} from '../../foundation/integrations/provider-resolution.mjs';
|
|
40
41
|
import {warnOnIntegrationIssues} from '../../foundation/integrations/integration-warnings.mjs';
|
|
41
42
|
import {logger} from '../logger.mjs';
|
|
42
43
|
|
|
43
44
|
// Re-exported for the run leaf's lightweight agent-docs inspection path
|
|
44
45
|
// (config_fixable short-circuit, where the full render cannot load config).
|
|
45
|
-
export {
|
|
46
|
+
export {inspectAgentDocs};
|
|
46
47
|
|
|
47
48
|
const execFileAsync = promisify(execFile);
|
|
48
49
|
|
|
@@ -104,6 +105,27 @@ export function uniqueFiles(files) {
|
|
|
104
105
|
];
|
|
105
106
|
}
|
|
106
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
|
+
|
|
107
129
|
/**
|
|
108
130
|
* Run the app config's post-codemod hooks (config.hooks.postCodemod).
|
|
109
131
|
* Dry-run PREVIEWS (buildCommand still called, so a throw fails); apply executes.
|
|
@@ -123,7 +145,9 @@ export async function runPostCodemodHooks(hooks, context) {
|
|
|
123
145
|
);
|
|
124
146
|
}
|
|
125
147
|
|
|
126
|
-
const cmd = await
|
|
148
|
+
const cmd = await withStdoutOnStderr(() =>
|
|
149
|
+
hook.buildCommand({packageDir, files}),
|
|
150
|
+
);
|
|
127
151
|
if (!cmd) {
|
|
128
152
|
logger.log(`Post-codemod hook ${label} produced no command; skipping.`);
|
|
129
153
|
continue;
|
|
@@ -147,7 +171,7 @@ export async function runPostCodemodHooks(hooks, context) {
|
|
|
147
171
|
env: {...process.env, ...(cmd.options?.env ?? {})},
|
|
148
172
|
}),
|
|
149
173
|
);
|
|
150
|
-
logger.log(
|
|
174
|
+
logger.log(`[ok] Post-codemod hook ${label} completed.`);
|
|
151
175
|
}
|
|
152
176
|
}
|
|
153
177
|
|
|
@@ -186,7 +210,7 @@ export async function prepareAgentDocsRefresh({
|
|
|
186
210
|
if (initial.status === 'missing') {
|
|
187
211
|
summary.action = 'nudge-init';
|
|
188
212
|
logger.warn(
|
|
189
|
-
`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.`,
|
|
190
214
|
);
|
|
191
215
|
return {cwd, renderedBlock: null, summary};
|
|
192
216
|
}
|
|
@@ -240,7 +264,7 @@ export function applyAgentDocsRefresh(plan) {
|
|
|
240
264
|
summary.files = written;
|
|
241
265
|
summary.action = summary.refreshed ? 'refreshed' : 'error';
|
|
242
266
|
if (summary.refreshed) {
|
|
243
|
-
logger.log(
|
|
267
|
+
logger.log(`[ok] Agent docs refreshed -> ${written.join(', ')}`);
|
|
244
268
|
} else {
|
|
245
269
|
logger.warn(
|
|
246
270
|
`Agent docs look stale but couldn't be refreshed. Run \`${formatCliCommand('astryx init --features agents')}\` to reinstall the block.`,
|
|
@@ -268,7 +292,13 @@ export async function collectAllCodemods() {
|
|
|
268
292
|
);
|
|
269
293
|
for (const {version, transforms} of manifests) {
|
|
270
294
|
for (const {name, meta, optional} of transforms) {
|
|
271
|
-
codemods.push({
|
|
295
|
+
codemods.push({
|
|
296
|
+
name,
|
|
297
|
+
title: meta.title,
|
|
298
|
+
version,
|
|
299
|
+
pr: meta.pr,
|
|
300
|
+
optional: !!optional,
|
|
301
|
+
});
|
|
272
302
|
}
|
|
273
303
|
}
|
|
274
304
|
return codemods;
|
|
@@ -299,33 +329,36 @@ export async function ensureCodemodDeps({installDeps} = {}) {
|
|
|
299
329
|
* Run the CORE registry codemods. Runs BEFORE the config is loaded so a core
|
|
300
330
|
* CONFIG codemod can repair a config the strict loader would otherwise reject.
|
|
301
331
|
* @param {CoreVersionManifest[]} versionManifests
|
|
302
|
-
* @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
|
|
303
333
|
*/
|
|
304
|
-
export async function runCoreCodemods(
|
|
334
|
+
export async function runCoreCodemods(
|
|
335
|
+
versionManifests,
|
|
336
|
+
{apply, path: srcPath, codemod, skipCodemods, root, protection, silent},
|
|
337
|
+
) {
|
|
305
338
|
return runCodemods(versionManifests, {
|
|
306
339
|
apply,
|
|
307
340
|
path: srcPath,
|
|
308
341
|
codemod,
|
|
309
342
|
skipCodemods,
|
|
310
|
-
silent: logger.silent,
|
|
343
|
+
silent: silent ?? logger.silent,
|
|
344
|
+
root,
|
|
345
|
+
protection,
|
|
311
346
|
});
|
|
312
347
|
}
|
|
313
348
|
|
|
314
|
-
/**
|
|
315
|
-
* One installed package at one version; two specs that reach it share this.
|
|
316
|
-
* @param {{name: string, version?: string}} integration
|
|
317
|
-
* @returns {string}
|
|
318
|
-
*/
|
|
319
|
-
function packageIdentity(integration) {
|
|
320
|
-
return `${integration.name}\u0000${integration.version ?? ''}`;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
349
|
/**
|
|
324
350
|
* Load the consumer project's config + integrations. Throws on invalid config;
|
|
325
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
|
+
*
|
|
326
359
|
* @param {string} cwd
|
|
327
360
|
* @param {string[]} [extraIntegrationSpecs] explicit `--integration` specs
|
|
328
|
-
* @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}>}
|
|
329
362
|
*/
|
|
330
363
|
export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
|
|
331
364
|
// The CLI debug preflight may already have imported this config before core
|
|
@@ -337,23 +370,38 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
|
|
|
337
370
|
// Configured packages come from Project, which has already resolved provider
|
|
338
371
|
// identity over configured, autolinked, and local packages. Loading them
|
|
339
372
|
// again here would let upgrade run codemods from a package Project set aside.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
+
});
|
|
344
389
|
// A package that lists itself runs its installed copy's released codemods,
|
|
345
|
-
// never the work in progress being authored
|
|
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.
|
|
346
393
|
const local = project.loadedIntegrations.find(
|
|
347
394
|
integration => integration.__local,
|
|
348
395
|
);
|
|
349
|
-
const selfListed =
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
+
: [];
|
|
357
405
|
const extraSpecs = uniqueFiles(extraIntegrationSpecs ?? []).filter(
|
|
358
406
|
spec => !configuredSpecs.has(spec),
|
|
359
407
|
);
|
|
@@ -361,38 +409,23 @@ export async function loadProjectContext(cwd, extraIntegrationSpecs = []) {
|
|
|
361
409
|
extraSpecs.length === 0
|
|
362
410
|
? []
|
|
363
411
|
: await loadIntegrations(extraSpecs, {resolveProviders: false});
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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)},
|
|
378
427
|
);
|
|
379
|
-
|
|
380
|
-
...configured,
|
|
381
|
-
...claimantsOnly,
|
|
382
|
-
...extras,
|
|
383
|
-
]);
|
|
384
|
-
// Claimants leave by package directory, not object identity: the pass can
|
|
385
|
-
// return one as a new conflict entry, and upgrade must not warn that a
|
|
386
|
-
// package every other command uses contributes nothing.
|
|
387
|
-
const claimantDirs = new Set(
|
|
388
|
-
claimantsOnly.map(integration => integration.__packageDir),
|
|
389
|
-
);
|
|
390
|
-
const integrations = resolved.filter(
|
|
391
|
-
integration =>
|
|
392
|
-
integration.__packageDir == null ||
|
|
393
|
-
!claimantDirs.has(integration.__packageDir),
|
|
394
|
-
);
|
|
395
|
-
return {postCodemodHooks, integrations};
|
|
428
|
+
return {postCodemodHooks, integrations, ledger};
|
|
396
429
|
}
|
|
397
430
|
|
|
398
431
|
/**
|
|
@@ -427,7 +460,10 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
|
|
|
427
460
|
try {
|
|
428
461
|
const byVersion = await discoverIntegrationCodemods([integration]);
|
|
429
462
|
for (const [version, rawList] of byVersion) {
|
|
430
|
-
const list =
|
|
463
|
+
const list =
|
|
464
|
+
/** @type {Array<import('../../authoring/codemod/type').CodemodEntry>} */ (
|
|
465
|
+
/** @type {unknown} */ (rawList)
|
|
466
|
+
);
|
|
431
467
|
const existing = integrationCodemodsByVersion.get(version);
|
|
432
468
|
if (existing) existing.push(...list);
|
|
433
469
|
else integrationCodemodsByVersion.set(version, [...list]);
|
|
@@ -444,9 +480,21 @@ export async function selectIntegrationCodemodsFor(integrations, from, to) {
|
|
|
444
480
|
/**
|
|
445
481
|
* Run the file-based INTEGRATION codemods (config codemods first, then code).
|
|
446
482
|
* @param {Array<{version: string, codemods: import('../../authoring/codemod/type').CodemodEntry[]}>} versionGroups
|
|
447
|
-
* @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
|
|
448
484
|
*/
|
|
449
|
-
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
|
+
) {
|
|
450
498
|
const jscodeshift = (await import('jscodeshift')).default;
|
|
451
499
|
return runIntegrationCodemods(versionGroups, {
|
|
452
500
|
apply,
|
|
@@ -454,6 +502,9 @@ export async function runIntegrationCodemodsStep(versionGroups, {apply, path: sr
|
|
|
454
502
|
codemod,
|
|
455
503
|
skipCodemods,
|
|
456
504
|
jscodeshift,
|
|
457
|
-
silent: logger.silent,
|
|
505
|
+
silent: silent ?? logger.silent,
|
|
506
|
+
root,
|
|
507
|
+
protection,
|
|
508
|
+
contents,
|
|
458
509
|
});
|
|
459
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
|
+
});
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Where `upgrade` and Project still disagree on a provider ID's winner.
|
|
5
|
+
*
|
|
6
|
+
* Both repros are `it.fails`: each asserts the agreeing result, and fails
|
|
7
|
+
* today. `upgrade` lets an `--integration` extra of the same name@version stand
|
|
8
|
+
* in for an autolinked package, from any directory, and orders that extra with
|
|
9
|
+
* the extras. So another extra can take the provider ID in `upgrade` while
|
|
10
|
+
* every other command gives it to the autolinked package. The provider ledger
|
|
11
|
+
* property test carves out exactly this shape.
|
|
12
|
+
*
|
|
13
|
+
* Fixtures live under a repo-local temp dir, not /tmp, because Vite refuses to
|
|
14
|
+
* dynamically import a module from outside the project root.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import {loadProjectContext} from './_adapter.mjs';
|
|
21
|
+
import {Project, providerLedgerOf} from '../../foundation/config/project.mjs';
|
|
22
|
+
|
|
23
|
+
let tmpDir;
|
|
24
|
+
let originalCwd;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
originalCwd = process.cwd();
|
|
28
|
+
tmpDir = fs.mkdtempSync(
|
|
29
|
+
path.join(process.cwd(), '.astryx-upgrade-agreement-'),
|
|
30
|
+
);
|
|
31
|
+
process.chdir(tmpDir);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
process.chdir(originalCwd);
|
|
36
|
+
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Install a package under node_modules/<dir>.
|
|
41
|
+
* @param {string} dir
|
|
42
|
+
* @param {{name: string, version: string}} pkg
|
|
43
|
+
* @param {string} manifest manifest module source
|
|
44
|
+
*/
|
|
45
|
+
function install(dir, pkg, manifest) {
|
|
46
|
+
const pkgDir = path.join(tmpDir, 'node_modules', ...dir.split('/'));
|
|
47
|
+
fs.mkdirSync(pkgDir, {recursive: true});
|
|
48
|
+
fs.writeFileSync(path.join(pkgDir, 'package.json'), JSON.stringify(pkg));
|
|
49
|
+
fs.writeFileSync(path.join(pkgDir, 'astryx.integration.mjs'), manifest);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** An autolinked `@acme/a` and an `@acme/other` that claims its provider ID. */
|
|
53
|
+
function autolinkedWithRival() {
|
|
54
|
+
fs.writeFileSync(
|
|
55
|
+
path.join(tmpDir, 'package.json'),
|
|
56
|
+
JSON.stringify({name: 'consumer', dependencies: {'@acme/a': '1.0.0'}}),
|
|
57
|
+
);
|
|
58
|
+
install(
|
|
59
|
+
'@acme/a',
|
|
60
|
+
{name: '@acme/a', version: '1.0.0'},
|
|
61
|
+
'export default {};\n',
|
|
62
|
+
);
|
|
63
|
+
install(
|
|
64
|
+
'@acme/other',
|
|
65
|
+
{name: '@acme/other', version: '1.0.0'},
|
|
66
|
+
"export default {providerId: '@acme/a'};\n",
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The package each resolution lets contribute under a provider ID.
|
|
72
|
+
* @param {Map<string, any>} ledger
|
|
73
|
+
* @param {string} providerId
|
|
74
|
+
*/
|
|
75
|
+
function winnerOf(ledger, providerId) {
|
|
76
|
+
return [...ledger.values()].find(
|
|
77
|
+
entry => entry.outcome === 'contributes' && entry.providerId === providerId,
|
|
78
|
+
)?.key;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** @param {Array<import('../../foundation/integrations/integrations.mjs').LoadedIntegration>} integrations */
|
|
82
|
+
function claims(integrations) {
|
|
83
|
+
return integrations.map(integration => [
|
|
84
|
+
integration.name,
|
|
85
|
+
integration.__providerConflict?.claimedBy ?? null,
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
describe('upgrade and Project on an autolinked package named with --integration', () => {
|
|
90
|
+
it('agree when the autolinked package is named first', async () => {
|
|
91
|
+
autolinkedWithRival();
|
|
92
|
+
const project = await Project.load(tmpDir, {fresh: true});
|
|
93
|
+
const upgrade = await loadProjectContext(tmpDir, [
|
|
94
|
+
'@acme/a',
|
|
95
|
+
'@acme/other',
|
|
96
|
+
]);
|
|
97
|
+
|
|
98
|
+
expect(claims(upgrade.integrations)).toEqual([
|
|
99
|
+
['@acme/a', null],
|
|
100
|
+
['@acme/other', '@acme/a'],
|
|
101
|
+
]);
|
|
102
|
+
expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
|
|
103
|
+
winnerOf(providerLedgerOf(project), '@acme/a'),
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it.fails(
|
|
108
|
+
'agree when an extra that claims its ID is named first',
|
|
109
|
+
async () => {
|
|
110
|
+
autolinkedWithRival();
|
|
111
|
+
const project = await Project.load(tmpDir, {fresh: true});
|
|
112
|
+
// Today upgrade runs @acme/other and reports @acme/a, which every other
|
|
113
|
+
// command uses, as contributing nothing.
|
|
114
|
+
const upgrade = await loadProjectContext(tmpDir, [
|
|
115
|
+
'@acme/other',
|
|
116
|
+
'@acme/a',
|
|
117
|
+
]);
|
|
118
|
+
|
|
119
|
+
expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
|
|
120
|
+
winnerOf(providerLedgerOf(project), '@acme/a'),
|
|
121
|
+
);
|
|
122
|
+
expect(claims(upgrade.integrations)).toEqual([
|
|
123
|
+
['@acme/other', '@acme/a'],
|
|
124
|
+
['@acme/a', null],
|
|
125
|
+
]);
|
|
126
|
+
},
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
it.fails(
|
|
130
|
+
'agree when a copy of it in another directory is named',
|
|
131
|
+
async () => {
|
|
132
|
+
autolinkedWithRival();
|
|
133
|
+
// The same name@version in another directory, with a manifest that fails.
|
|
134
|
+
install(
|
|
135
|
+
'@acme/a-copy',
|
|
136
|
+
{name: '@acme/a', version: '1.0.0'},
|
|
137
|
+
"throw new Error('broken copy');\n",
|
|
138
|
+
);
|
|
139
|
+
const project = await Project.load(tmpDir, {fresh: true});
|
|
140
|
+
// Today the broken copy stands in for @acme/a by name@version, so upgrade
|
|
141
|
+
// has no claimant left for the ID and @acme/other takes it.
|
|
142
|
+
const upgrade = await loadProjectContext(tmpDir, [
|
|
143
|
+
'@acme/a-copy',
|
|
144
|
+
'@acme/other',
|
|
145
|
+
]);
|
|
146
|
+
|
|
147
|
+
expect(winnerOf(upgrade.ledger, '@acme/a')).toBe(
|
|
148
|
+
winnerOf(providerLedgerOf(project), '@acme/a'),
|
|
149
|
+
);
|
|
150
|
+
},
|
|
151
|
+
);
|
|
152
|
+
});
|