@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
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Provider resolution — one resolver and one package identity for every
|
|
5
|
+
* path that decides which integration package contributes under a provider ID.
|
|
6
|
+
*
|
|
7
|
+
* Project resolves configured, then autolinked, then local packages here.
|
|
8
|
+
* `upgrade` resolves the same set plus its own candidates here, under the
|
|
9
|
+
* codemod policy. `markProviderConflicts` is a wrapper over the same conflict
|
|
10
|
+
* pass. Besides the resolved list, every resolution returns a ledger with
|
|
11
|
+
* exactly one outcome for every package directory it was handed, so no
|
|
12
|
+
* candidate can leave the list without a record.
|
|
13
|
+
*
|
|
14
|
+
* Identity is the real package directory. `name@version` labels an entry for
|
|
15
|
+
* display. It also decides whether two DIFFERENT directories hold one published
|
|
16
|
+
* package (an npm alias installed as a copy), because precedence has always
|
|
17
|
+
* treated those as one package, but it never keys the ledger.
|
|
18
|
+
*
|
|
19
|
+
* @input Candidates in precedence order, each a loaded integration record or a
|
|
20
|
+
* load failure, tagged with the source that reached it; a policy.
|
|
21
|
+
* @output The resolved LoadedIntegration list, and the ledger keyed by real
|
|
22
|
+
* package directory.
|
|
23
|
+
* @position foundation/integrations — the only place precedence is decided;
|
|
24
|
+
* callers load packages, this module picks winners.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import * as fs from 'node:fs';
|
|
28
|
+
import * as path from 'node:path';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @typedef {import('./integrations.mjs').LoadedIntegration} LoadedIntegration
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Where a candidate came from. Precedence follows candidate order; the source
|
|
36
|
+
* selects which rules apply.
|
|
37
|
+
* - `configured`: named by astryx.config; listed even when its manifest fails
|
|
38
|
+
* - `autolinked`: a declared dependency that ships one root manifest
|
|
39
|
+
* - `local`: the package being authored, loaded from its working bytes
|
|
40
|
+
* - `installed`: codemod policy — the installed copy of a package being
|
|
41
|
+
* authored that lists itself
|
|
42
|
+
* - `extra`: codemod policy — a package named with `upgrade --integration`
|
|
43
|
+
* @typedef {'configured' | 'autolinked' | 'local' | 'installed' | 'extra'} CandidateSource
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* One package reached by one input. A candidate without `integration` failed
|
|
48
|
+
* to load (`error`) or reached a directory an earlier candidate already
|
|
49
|
+
* reached (`repeat`).
|
|
50
|
+
* @typedef {object} ProviderCandidate
|
|
51
|
+
* @property {CandidateSource} source
|
|
52
|
+
* @property {LoadedIntegration} [integration]
|
|
53
|
+
* @property {string} [spec] the input that reached the package
|
|
54
|
+
* @property {string} [packageDir] required when `integration` is absent
|
|
55
|
+
* @property {string} [error] why loading threw
|
|
56
|
+
* @property {boolean} [repeat] another input for a directory already reached
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @typedef {'contributes' | 'set-aside' | 'load-failed' | 'alias-of'} ProviderOutcome
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Why a package is set aside.
|
|
65
|
+
* - `claimed-earlier`: a package earlier in precedence claims its provider ID
|
|
66
|
+
* - `authored-claims`: the package being authored claims its provider ID
|
|
67
|
+
* - `replaced-by-authored`: it is the installed copy of the package being
|
|
68
|
+
* authored, whose working bytes are used instead
|
|
69
|
+
* - `installed-stands-in`: codemod policy — the package being authored is
|
|
70
|
+
* represented by its installed copy
|
|
71
|
+
* @typedef {'claimed-earlier' | 'authored-claims' | 'replaced-by-authored' | 'installed-stands-in'} SetAsideReason
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The one outcome for one real package directory.
|
|
76
|
+
* @typedef {object} ProviderLedgerEntry
|
|
77
|
+
* @property {string} key real package directory
|
|
78
|
+
* @property {string} label `name@version`, for display only
|
|
79
|
+
* @property {ProviderOutcome} outcome
|
|
80
|
+
* @property {ProviderCandidate} candidate the candidate this outcome belongs to
|
|
81
|
+
* @property {ProviderCandidate[]} refs every candidate that reached this
|
|
82
|
+
* directory, in order
|
|
83
|
+
* @property {string} [providerId]
|
|
84
|
+
* @property {string} [winner] set-aside: key of the package used instead
|
|
85
|
+
* @property {SetAsideReason} [reason] set-aside: why
|
|
86
|
+
* @property {string} [aliasOf] alias-of: key of the package this one repeats
|
|
87
|
+
* @property {LoadedIntegration} [integration] the record this package left in
|
|
88
|
+
* the resolved list, when it left one
|
|
89
|
+
* @property {string} [error] load-failed: the load error
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
/** @typedef {Map<string, ProviderLedgerEntry>} ProviderLedger */
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @typedef {object} ProviderPolicy
|
|
96
|
+
* @property {boolean} [codemods] upgrade's codemod rule. Candidates are an
|
|
97
|
+
* already resolved Project list plus `installed` and `extra` candidates. The
|
|
98
|
+
* installed copy stands in for a package being authored that lists itself or
|
|
99
|
+
* is named as an extra, and an extra stands in for the autolinked package it
|
|
100
|
+
* repeats. Autolinked and local packages still claim provider IDs, but they
|
|
101
|
+
* are not listed: upgrade has never run their codemods.
|
|
102
|
+
* @property {ProviderLedger} [prior] the ledger this resolution builds on. A
|
|
103
|
+
* record it already set aside keeps that winner, and its entries this
|
|
104
|
+
* resolution never reaches are carried over unchanged.
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @typedef {object} CandidateState
|
|
109
|
+
* @property {ProviderCandidate} candidate
|
|
110
|
+
* @property {LoadedIntegration | undefined} record
|
|
111
|
+
* @property {string} key
|
|
112
|
+
* @property {ProviderOutcome} [outcome]
|
|
113
|
+
* @property {CandidateState} [winner]
|
|
114
|
+
* @property {SetAsideReason} [reason]
|
|
115
|
+
* @property {CandidateState} [aliasOf]
|
|
116
|
+
* @property {LoadedIntegration} [listed]
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @typedef {object} Slot
|
|
121
|
+
* @property {CandidateState} state
|
|
122
|
+
* @property {LoadedIntegration} record
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
/** Lower wins when several candidates reach one directory. */
|
|
126
|
+
const OUTCOME_RANK = /** @type {const} */ ({
|
|
127
|
+
contributes: 0,
|
|
128
|
+
'set-aside': 1,
|
|
129
|
+
'load-failed': 2,
|
|
130
|
+
'alias-of': 3,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The identity of a package directory: its real path, so every symlinked
|
|
135
|
+
* spelling of one pnpm store entry is one package.
|
|
136
|
+
* @param {string} packageDir
|
|
137
|
+
* @returns {string}
|
|
138
|
+
*/
|
|
139
|
+
export function packageKey(packageDir) {
|
|
140
|
+
try {
|
|
141
|
+
return fs.realpathSync(packageDir);
|
|
142
|
+
} catch {
|
|
143
|
+
return path.resolve(packageDir);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @param {ProviderCandidate} candidate
|
|
149
|
+
* @param {number} index
|
|
150
|
+
* @returns {string}
|
|
151
|
+
*/
|
|
152
|
+
function candidateKey(candidate, index) {
|
|
153
|
+
const dir = candidate.integration?.__packageDir ?? candidate.packageDir;
|
|
154
|
+
// Only a hand-built record lacks a directory; it is its own package.
|
|
155
|
+
return typeof dir === 'string' && dir.length > 0
|
|
156
|
+
? packageKey(dir)
|
|
157
|
+
: `#${index}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Whether an entry contributes under its provider ID: it has one, its manifest
|
|
162
|
+
* loaded, and it has not already been set aside.
|
|
163
|
+
* @param {LoadedIntegration | undefined} integration
|
|
164
|
+
* @returns {boolean}
|
|
165
|
+
*/
|
|
166
|
+
function claimsProvider(integration) {
|
|
167
|
+
return (
|
|
168
|
+
integration?.providerId != null &&
|
|
169
|
+
integration.__loadError == null &&
|
|
170
|
+
integration.__providerConflict == null
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The display label of a package: `name@version`, plus the spec that reached
|
|
176
|
+
* it when that differs from the name.
|
|
177
|
+
* @param {LoadedIntegration} integration
|
|
178
|
+
* @returns {string}
|
|
179
|
+
*/
|
|
180
|
+
function describeIntegration(integration) {
|
|
181
|
+
const id = integration.version
|
|
182
|
+
? `${integration.name}@${integration.version}`
|
|
183
|
+
: integration.name;
|
|
184
|
+
return integration.__spec && integration.__spec !== integration.name
|
|
185
|
+
? `${id} (from "${integration.__spec}")`
|
|
186
|
+
: id;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* An inert record for a package whose provider ID is already claimed. It keeps
|
|
191
|
+
* the package's identity and location for reporting, and drops every
|
|
192
|
+
* contribution root and handler.
|
|
193
|
+
* @param {LoadedIntegration} integration
|
|
194
|
+
* @param {LoadedIntegration} claimant
|
|
195
|
+
* @returns {LoadedIntegration}
|
|
196
|
+
*/
|
|
197
|
+
function providerConflict(integration, claimant) {
|
|
198
|
+
const providerId =
|
|
199
|
+
/** @type {import('../../authoring/identity/type').ProviderId} */ (
|
|
200
|
+
integration.providerId
|
|
201
|
+
);
|
|
202
|
+
const winner = describeIntegration(claimant);
|
|
203
|
+
const setAside = describeIntegration(integration);
|
|
204
|
+
const reason = claimant.__local
|
|
205
|
+
? 'is the package being authored, so it is used'
|
|
206
|
+
: 'loads first and is used';
|
|
207
|
+
return {
|
|
208
|
+
name: integration.name,
|
|
209
|
+
providerId,
|
|
210
|
+
version: integration.version,
|
|
211
|
+
__spec: integration.__spec,
|
|
212
|
+
__packageDir: integration.__packageDir,
|
|
213
|
+
__manifestFile: integration.__manifestFile,
|
|
214
|
+
...(integration.__local ? {__local: true} : {}),
|
|
215
|
+
...(integration.__autolinked
|
|
216
|
+
? {__autolinked: true, __dependencyField: integration.__dependencyField}
|
|
217
|
+
: {}),
|
|
218
|
+
__providerConflict: {
|
|
219
|
+
providerId,
|
|
220
|
+
claimedBy: claimant.name,
|
|
221
|
+
message:
|
|
222
|
+
`${setAside} and ${winner} both claim provider ID "${providerId}". ` +
|
|
223
|
+
`${winner} ${reason}; ${setAside} contributes nothing ` +
|
|
224
|
+
'until one package changes its providerId.',
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* `name@version`, the display label of a package.
|
|
231
|
+
* @param {LoadedIntegration} integration
|
|
232
|
+
* @returns {string}
|
|
233
|
+
*/
|
|
234
|
+
function packageLabel(integration) {
|
|
235
|
+
return integration.version
|
|
236
|
+
? `${integration.name}@${integration.version}`
|
|
237
|
+
: integration.name;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* One published package at one version. Two directories that share it hold
|
|
242
|
+
* the same package; it never keys the ledger.
|
|
243
|
+
* @param {LoadedIntegration} integration
|
|
244
|
+
* @returns {string}
|
|
245
|
+
*/
|
|
246
|
+
function publishedIdentity(integration) {
|
|
247
|
+
return `${integration.name}\u0000${integration.version ?? ''}`;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* @param {CandidateState} state
|
|
252
|
+
* @param {ProviderOutcome} outcome
|
|
253
|
+
* @param {Partial<Pick<CandidateState, 'winner' | 'reason' | 'aliasOf' | 'listed'>>} [detail]
|
|
254
|
+
*/
|
|
255
|
+
function settle(state, outcome, detail = {}) {
|
|
256
|
+
state.outcome = outcome;
|
|
257
|
+
state.winner = detail.winner;
|
|
258
|
+
state.reason = detail.reason;
|
|
259
|
+
state.aliasOf = detail.aliasOf;
|
|
260
|
+
state.listed = detail.listed;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Project precedence: configured packages in config order, then autolinked
|
|
265
|
+
* packages that do not repeat one already loaded, then the package being
|
|
266
|
+
* authored, which replaces the first entry with its name.
|
|
267
|
+
* @param {CandidateState[]} states
|
|
268
|
+
* @returns {Slot[]}
|
|
269
|
+
*/
|
|
270
|
+
function assembleProject(states) {
|
|
271
|
+
/** @type {Slot[]} */
|
|
272
|
+
const slots = [];
|
|
273
|
+
// Published identities of configured entries and of kept autolinked ones.
|
|
274
|
+
/** @type {Map<string, CandidateState>} */
|
|
275
|
+
const loaded = new Map();
|
|
276
|
+
for (const state of states) {
|
|
277
|
+
const {candidate, record} = state;
|
|
278
|
+
if (candidate.repeat) {
|
|
279
|
+
settle(state, 'alias-of');
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (candidate.source === 'autolinked') {
|
|
283
|
+
// A dependency the project never named cannot fail its load, so a
|
|
284
|
+
// broken one is recorded here and listed nowhere.
|
|
285
|
+
if (record == null || record.__loadError != null) {
|
|
286
|
+
settle(state, 'load-failed');
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const repeated = loaded.get(publishedIdentity(record));
|
|
290
|
+
if (repeated != null) {
|
|
291
|
+
settle(state, 'alias-of', {aliasOf: repeated});
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
loaded.set(publishedIdentity(record), state);
|
|
295
|
+
slots.push({state, record});
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (candidate.source === 'local' && record != null) {
|
|
299
|
+
const replaced = slots.findIndex(
|
|
300
|
+
slot => slot.record?.name === record.name,
|
|
301
|
+
);
|
|
302
|
+
if (replaced === -1) {
|
|
303
|
+
slots.push({state, record});
|
|
304
|
+
} else {
|
|
305
|
+
settle(slots[replaced].state, 'set-aside', {
|
|
306
|
+
winner: state,
|
|
307
|
+
reason: 'replaced-by-authored',
|
|
308
|
+
});
|
|
309
|
+
slots[replaced] = {state, record};
|
|
310
|
+
}
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (record != null && typeof record === 'object') {
|
|
314
|
+
const identity = publishedIdentity(record);
|
|
315
|
+
if (!loaded.has(identity)) loaded.set(identity, state);
|
|
316
|
+
}
|
|
317
|
+
slots.push({state, record: /** @type {LoadedIntegration} */ (record)});
|
|
318
|
+
}
|
|
319
|
+
return slots;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Upgrade precedence under the codemod policy, over an already resolved
|
|
324
|
+
* Project list: configured packages (the installed copy in place of a package
|
|
325
|
+
* being authored that lists itself), then claimants, then extras.
|
|
326
|
+
* @param {CandidateState[]} states
|
|
327
|
+
* @returns {{slots: Slot[], claimants: CandidateState[]}}
|
|
328
|
+
*/
|
|
329
|
+
function assembleCodemods(states) {
|
|
330
|
+
const configured = states.filter(
|
|
331
|
+
state => state.candidate.source === 'configured' && !state.candidate.repeat,
|
|
332
|
+
);
|
|
333
|
+
const installed = states.filter(
|
|
334
|
+
state => state.candidate.source === 'installed',
|
|
335
|
+
);
|
|
336
|
+
const extras = states.filter(state => state.candidate.source === 'extra');
|
|
337
|
+
const local = states.find(
|
|
338
|
+
state => state.record?.__local && !state.candidate.repeat,
|
|
339
|
+
);
|
|
340
|
+
const selfListed = local != null && configured.includes(local);
|
|
341
|
+
|
|
342
|
+
/** @type {CandidateState[]} */
|
|
343
|
+
const participants = [...configured];
|
|
344
|
+
if (local != null && selfListed && installed.length > 0) {
|
|
345
|
+
participants.splice(participants.indexOf(local), 1, ...installed);
|
|
346
|
+
settle(local, 'set-aside', {
|
|
347
|
+
winner: installed[0],
|
|
348
|
+
reason: 'installed-stands-in',
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
const namedLocal =
|
|
352
|
+
local == null
|
|
353
|
+
? undefined
|
|
354
|
+
: extras.find(extra => extra.record?.name === local.record?.name);
|
|
355
|
+
const localStandsIn = local != null && (selfListed || namedLocal != null);
|
|
356
|
+
if (local != null && !selfListed && namedLocal != null) {
|
|
357
|
+
settle(local, 'set-aside', {
|
|
358
|
+
winner: namedLocal,
|
|
359
|
+
reason: 'installed-stands-in',
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** @type {Map<string, CandidateState>} */
|
|
364
|
+
const extraIdentities = new Map();
|
|
365
|
+
for (const extra of extras) {
|
|
366
|
+
if (extra.record == null) continue;
|
|
367
|
+
const identity = publishedIdentity(extra.record);
|
|
368
|
+
if (!extraIdentities.has(identity)) extraIdentities.set(identity, extra);
|
|
369
|
+
}
|
|
370
|
+
/** @type {CandidateState[]} */
|
|
371
|
+
const claimants = [];
|
|
372
|
+
for (const state of states) {
|
|
373
|
+
const {candidate, record} = state;
|
|
374
|
+
if (candidate.repeat || record == null) continue;
|
|
375
|
+
const claimant =
|
|
376
|
+
candidate.source === 'autolinked' ||
|
|
377
|
+
(candidate.source === 'local' && !localStandsIn);
|
|
378
|
+
if (!claimant) continue;
|
|
379
|
+
const named = extraIdentities.get(publishedIdentity(record));
|
|
380
|
+
if (named != null) {
|
|
381
|
+
settle(state, 'alias-of', {aliasOf: named});
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
claimants.push(state);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
for (const state of states) {
|
|
388
|
+
if (state.candidate.repeat) settle(state, 'alias-of');
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const slots = [...participants, ...claimants, ...extras].map(state => ({
|
|
392
|
+
state,
|
|
393
|
+
record: /** @type {LoadedIntegration} */ (state.record),
|
|
394
|
+
}));
|
|
395
|
+
return {slots, claimants};
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* The provider-ID pass over assembled entries. The package being authored
|
|
400
|
+
* claims first; everything else claims in order. A later claimant that is the
|
|
401
|
+
* same published package as the winner is the same package reached twice and
|
|
402
|
+
* loads once; any other later claimant becomes an inert conflict record.
|
|
403
|
+
* @param {Slot[]} slots
|
|
404
|
+
* @returns {LoadedIntegration[]}
|
|
405
|
+
*/
|
|
406
|
+
function markConflicts(slots) {
|
|
407
|
+
/** @type {Map<string, Slot>} */
|
|
408
|
+
const claims = new Map();
|
|
409
|
+
for (const slot of slots) {
|
|
410
|
+
if (slot.record?.__local && claimsProvider(slot.record)) {
|
|
411
|
+
const providerId = /** @type {string} */ (slot.record.providerId);
|
|
412
|
+
if (!claims.has(providerId)) claims.set(providerId, slot);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** @type {LoadedIntegration[]} */
|
|
416
|
+
const resolved = [];
|
|
417
|
+
for (const slot of slots) {
|
|
418
|
+
const {state, record} = slot;
|
|
419
|
+
if (!claimsProvider(record)) {
|
|
420
|
+
resolved.push(record);
|
|
421
|
+
if (record?.__providerConflict != null) {
|
|
422
|
+
settle(state, 'set-aside', {listed: record});
|
|
423
|
+
} else if (record == null || record.__loadError != null) {
|
|
424
|
+
settle(state, 'load-failed', {listed: record});
|
|
425
|
+
} else {
|
|
426
|
+
settle(state, 'contributes', {listed: record});
|
|
427
|
+
}
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
const providerId = /** @type {string} */ (record.providerId);
|
|
431
|
+
const claimant = claims.get(providerId);
|
|
432
|
+
if (claimant == null) {
|
|
433
|
+
claims.set(providerId, slot);
|
|
434
|
+
resolved.push(record);
|
|
435
|
+
settle(state, 'contributes', {listed: record});
|
|
436
|
+
} else if (claimant.record === record) {
|
|
437
|
+
resolved.push(record);
|
|
438
|
+
settle(state, 'contributes', {listed: record});
|
|
439
|
+
} else if (
|
|
440
|
+
claimant.record.name !== record.name ||
|
|
441
|
+
claimant.record.version !== record.version
|
|
442
|
+
) {
|
|
443
|
+
const conflict = providerConflict(record, claimant.record);
|
|
444
|
+
resolved.push(conflict);
|
|
445
|
+
settle(state, 'set-aside', {
|
|
446
|
+
winner: claimant.state,
|
|
447
|
+
reason: claimant.record.__local ? 'authored-claims' : 'claimed-earlier',
|
|
448
|
+
listed: conflict,
|
|
449
|
+
});
|
|
450
|
+
} else {
|
|
451
|
+
settle(state, 'alias-of', {aliasOf: claimant.state});
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return resolved;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Fold candidate outcomes into one entry per real package directory. A
|
|
459
|
+
* directory reached by several candidates keeps the strongest outcome among
|
|
460
|
+
* them; every candidate stays listed in `refs`.
|
|
461
|
+
* @param {CandidateState[]} states
|
|
462
|
+
* @param {ProviderLedger | undefined} prior
|
|
463
|
+
* @param {Set<LoadedIntegration>} listed records in the final list
|
|
464
|
+
* @returns {ProviderLedger}
|
|
465
|
+
*/
|
|
466
|
+
function buildLedger(states, prior, listed) {
|
|
467
|
+
/** @type {Map<string, CandidateState>} */
|
|
468
|
+
const chosen = new Map();
|
|
469
|
+
/** @type {Map<string, ProviderCandidate[]>} */
|
|
470
|
+
const refs = new Map();
|
|
471
|
+
for (const state of states) {
|
|
472
|
+
const current = chosen.get(state.key);
|
|
473
|
+
const outcome = state.outcome ?? 'load-failed';
|
|
474
|
+
if (
|
|
475
|
+
current == null ||
|
|
476
|
+
OUTCOME_RANK[outcome] < OUTCOME_RANK[current.outcome ?? 'load-failed']
|
|
477
|
+
) {
|
|
478
|
+
chosen.set(state.key, state);
|
|
479
|
+
}
|
|
480
|
+
const list = refs.get(state.key) ?? [];
|
|
481
|
+
list.push(state.candidate);
|
|
482
|
+
refs.set(state.key, list);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/** @type {ProviderLedger} */
|
|
486
|
+
const ledger = new Map();
|
|
487
|
+
for (const [key, state] of chosen) {
|
|
488
|
+
const {candidate, record} = state;
|
|
489
|
+
const outcome = state.outcome ?? 'load-failed';
|
|
490
|
+
const previous = prior?.get(key);
|
|
491
|
+
/** @type {ProviderLedgerEntry} */
|
|
492
|
+
const entry = {
|
|
493
|
+
key,
|
|
494
|
+
label:
|
|
495
|
+
record != null && typeof record === 'object' && record.name
|
|
496
|
+
? packageLabel(record)
|
|
497
|
+
: (candidate.spec ?? key),
|
|
498
|
+
outcome,
|
|
499
|
+
candidate,
|
|
500
|
+
// A resolution on top of a prior ledger re-reads that ledger's records;
|
|
501
|
+
// only its own new inputs join the inputs already recorded there.
|
|
502
|
+
refs:
|
|
503
|
+
previous == null
|
|
504
|
+
? (refs.get(key) ?? [candidate])
|
|
505
|
+
: [
|
|
506
|
+
...previous.refs,
|
|
507
|
+
...(refs.get(key) ?? []).filter(
|
|
508
|
+
ref => ref.source === 'installed' || ref.source === 'extra',
|
|
509
|
+
),
|
|
510
|
+
],
|
|
511
|
+
};
|
|
512
|
+
if (record?.providerId != null) entry.providerId = record.providerId;
|
|
513
|
+
if (outcome === 'set-aside') {
|
|
514
|
+
const winner = state.winner?.key ?? previous?.winner;
|
|
515
|
+
if (winner != null) entry.winner = winner;
|
|
516
|
+
const reason = state.reason ?? previous?.reason;
|
|
517
|
+
if (reason != null) entry.reason = reason;
|
|
518
|
+
}
|
|
519
|
+
if (outcome === 'alias-of') entry.aliasOf = state.aliasOf?.key ?? key;
|
|
520
|
+
if (state.listed != null && listed.has(state.listed)) {
|
|
521
|
+
entry.integration = state.listed;
|
|
522
|
+
}
|
|
523
|
+
const error = record?.__loadError ?? candidate.error;
|
|
524
|
+
if (outcome === 'load-failed' && error != null) entry.error = error;
|
|
525
|
+
ledger.set(key, entry);
|
|
526
|
+
}
|
|
527
|
+
for (const [key, entry] of prior ?? []) {
|
|
528
|
+
if (!ledger.has(key)) ledger.set(key, entry);
|
|
529
|
+
}
|
|
530
|
+
return ledger;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Resolve provider identity over candidates in precedence order.
|
|
535
|
+
*
|
|
536
|
+
* Returns the resolved integration list every command reads, and a ledger
|
|
537
|
+
* with one outcome for every real package directory among the candidates:
|
|
538
|
+
* `contributes`, `set-aside` (with the winner and a reason), `load-failed`, or
|
|
539
|
+
* `alias-of` (the same published package already loaded from another
|
|
540
|
+
* directory, or another input for a directory already reached).
|
|
541
|
+
*
|
|
542
|
+
* @param {ProviderCandidate[]} candidates in precedence order
|
|
543
|
+
* @param {ProviderPolicy} [policy]
|
|
544
|
+
* @returns {{integrations: LoadedIntegration[], ledger: ProviderLedger}}
|
|
545
|
+
*/
|
|
546
|
+
export function resolveProviders(candidates, policy = {}) {
|
|
547
|
+
/** @type {CandidateState[]} */
|
|
548
|
+
const states = candidates.map((candidate, index) => ({
|
|
549
|
+
candidate,
|
|
550
|
+
record: candidate.integration,
|
|
551
|
+
key: candidateKey(candidate, index),
|
|
552
|
+
}));
|
|
553
|
+
|
|
554
|
+
/** @type {LoadedIntegration[]} */
|
|
555
|
+
let integrations;
|
|
556
|
+
if (policy.codemods) {
|
|
557
|
+
const {slots, claimants} = assembleCodemods(states);
|
|
558
|
+
const resolved = markConflicts(slots);
|
|
559
|
+
// Claimants leave by package directory: the pass can hand one back as a
|
|
560
|
+
// new conflict record, and upgrade must not report a package every other
|
|
561
|
+
// command uses as set aside.
|
|
562
|
+
const claimantDirs = new Set(
|
|
563
|
+
claimants.map(state => state.record?.__packageDir),
|
|
564
|
+
);
|
|
565
|
+
integrations = resolved.filter(
|
|
566
|
+
integration =>
|
|
567
|
+
integration.__packageDir == null ||
|
|
568
|
+
!claimantDirs.has(integration.__packageDir),
|
|
569
|
+
);
|
|
570
|
+
} else {
|
|
571
|
+
integrations = markConflicts(assembleProject(states));
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
const ledger = buildLedger(states, policy.prior, new Set(integrations));
|
|
575
|
+
return {integrations, ledger};
|
|
576
|
+
}
|