@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.f04b501
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 +106 -72
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/build.doc.mjs +4 -3
- package/api/build/build.test.mjs +14 -3
- package/api/build/build.type.d.mts +36 -2
- package/api/build/build.type.mjs +25 -4
- package/api/build/help/help.d.mts +8 -5
- package/api/build/help/help.mjs +56 -6
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +31 -2
- 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 +37 -9
- package/api/discover/discover.doc.mjs +2 -1
- package/api/discover/discover.type.d.mts +4 -4
- package/api/discover/discover.type.mjs +10 -10
- package/api/docs/_adapter.d.mts +32 -24
- package/api/docs/_adapter.mjs +81 -87
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +14 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +44 -20
- package/api/docs/detail/section/section.test.mjs +41 -0
- package/api/docs/docs.d.mts +7 -2
- package/api/docs/docs.doc.mjs +28 -10
- package/api/docs/docs.mjs +16 -9
- package/api/docs/docs.test.mjs +6 -0
- package/api/docs/docs.type.d.mts +40 -3
- package/api/docs/docs.type.mjs +36 -8
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +32 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integrationDocs.test.mjs +106 -0
- package/api/docs/list/list.mjs +3 -7
- package/api/doctor/doctor.d.mts +70 -0
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +404 -0
- package/api/doctor/doctor.test.mjs +522 -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/init/init.doc.mjs +5 -0
- 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.mjs +23 -10
- package/api/integration/add-contribution.test.mjs +121 -7
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.test.mjs +8 -4
- package/api/integration/integration-authoring.type.d.mts +1 -1
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +8 -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 +1 -0
- 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 +1 -0
- package/api/integration/integrationPackCheck.doc.mjs +1 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +1 -0
- package/api/integration/pack-check.mjs +49 -7
- package/api/integration/pack-check.test.mjs +266 -47
- package/api/integration/summarizeIssues.doc.mjs +1 -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 +176 -23
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +2 -1
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- 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 +3 -10
- package/api/search/search.doc.mjs +6 -1
- package/api/search/search.mjs +31 -14
- package/api/search/search.test.mjs +34 -0
- package/api/search/search.type.d.mts +2 -2
- package/api/search/search.type.mjs +1 -1
- 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/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +3 -1
- package/api/template/template.type.d.mts +6 -6
- package/api/template/template.type.mjs +12 -12
- 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 +20 -3
- package/api/theme/add/add.staging.test.mjs +66 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.mjs +133 -42
- 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.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 +15 -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 +5 -1
- package/api/upgrade/_adapter.d.mts +12 -3
- package/api/upgrade/_adapter.mjs +123 -19
- 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 +1 -0
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +7 -4
- package/api/upgrade/upgrade.type.d.mts +9 -5
- package/api/upgrade/upgrade.type.mjs +12 -11
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/runner.mjs +115 -5
- 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-theme-catalog-to-descriptors.test.mjs +216 -0
- package/assets/codemods/transforms/next/index.mjs +11 -1
- 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/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/cli-integrations.doc.mjs +78 -20
- package/assets/docs/cli.doc.mjs +15 -0
- package/assets/docs/styling-libraries.doc.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/working-with-ai.doc.mjs +1 -1
- 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/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/config/config.doc.mjs +2 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +13 -13
- package/authoring/config/parse.mjs +8 -8
- package/authoring/config/type.ts +18 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +5 -5
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/doctypes/_schema.d.mts +788 -23
- package/authoring/doctypes/_schema.mjs +492 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +62 -0
- package/authoring/doctypes/base/type.ts +40 -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 +4 -3
- 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 +5 -1
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +7 -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 +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +208 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +132 -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 +165 -0
- package/authoring/doctypes/namespace/type.ts +71 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -12
- 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 +18 -5
- package/authoring/doctypes/reference/type.ts +53 -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 +92 -1
- package/authoring/doctypes/template/parse.mjs +36 -2
- package/authoring/doctypes/template/parse.test.mjs +8 -2
- package/authoring/doctypes/template/template.doc.mjs +7 -3
- package/authoring/doctypes/template/type.ts +5 -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 +2 -0
- package/authoring/index.d.ts +51 -17
- package/authoring/index.mjs +3 -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 +18 -7
- 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.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 +5 -5
- 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 +5 -2
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +32 -47
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +40 -0
- package/clients/cli/commands/component/index.mjs +2 -7
- 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 +48 -0
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +5 -3
- package/clients/cli/commands/discover.mjs +3 -3
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +14 -4
- package/clients/cli/commands/docs.mjs +121 -21
- package/clients/cli/commands/docs.test.mjs +88 -0
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -1
- 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 +15 -7
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +6 -16
- 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 +22 -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/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 +17 -7
- package/clients/cli/commands/search.test.mjs +75 -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 +29 -7
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.path-help.test.mjs +40 -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.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 -9
- 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/formatters/index.mjs +162 -1
- package/clients/cli/formatters/index.test.mjs +91 -0
- package/clients/cli/index.mjs +13 -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 +29 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +4 -0
- package/foundation/agent-docs/agent-docs.mjs +69 -3
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +8 -0
- package/foundation/config/project.mjs +190 -32
- package/foundation/config/project.test.mjs +129 -16
- package/foundation/discovery/authoring-self-docs.d.mts +75 -0
- package/foundation/discovery/authoring-self-docs.mjs +224 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +154 -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 +113 -0
- package/foundation/discovery/cli-self-docs.mjs +514 -0
- package/foundation/discovery/cli-self-docs.test.mjs +437 -0
- package/foundation/discovery/component-discovery.d.mts +1 -1
- package/foundation/discovery/component-discovery.mjs +2 -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 +12 -4
- package/foundation/discovery/docs-discovery.mjs +214 -98
- package/foundation/discovery/docs-discovery.test.mjs +284 -15
- 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 +98 -0
- package/foundation/discovery/docs-section-key.mjs +221 -0
- package/foundation/discovery/docs-section-key.test.mjs +224 -0
- package/foundation/discovery/template-adapter.d.mts +21 -5
- 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 +321 -66
- package/foundation/discovery/template-adapter.test.mjs +15 -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 +218 -0
- package/foundation/doc-compiler/bundle.test.mjs +255 -0
- package/foundation/doc-compiler/compile.d.mts +362 -0
- package/foundation/doc-compiler/compile.mjs +511 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +277 -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 +286 -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 +464 -0
- package/foundation/doc-compiler/lenses.d.mts +33 -0
- package/foundation/doc-compiler/lenses.mjs +127 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +492 -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 +126 -0
- package/foundation/doc-compiler/read.mjs +320 -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/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/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +1 -1
- package/foundation/integrations/contribution-inventory.mjs +17 -20
- package/foundation/integrations/contribution-inventory.test.mjs +67 -27
- package/foundation/integrations/integration-warnings.mjs +6 -0
- package/foundation/integrations/integrations.d.mts +49 -2
- package/foundation/integrations/integrations.mjs +81 -8
- package/foundation/integrations/integrations.test.mjs +384 -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 +114 -10
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.doc.mjs +3 -4
- package/foundation/response/error-codes.mjs +2 -2
- package/foundation/response/error-codes.test.mjs +83 -0
- 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.mjs +16 -11
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.mjs +22 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +3 -2
- package/foundation/xle/expand.test.mjs +54 -0
- package/package.json +9 -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
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
17
|
* Compute the files the tarball must contain for an integration's
|
|
18
|
-
* contributions to be visible.
|
|
18
|
+
* contributions to be visible. Walks descriptor-owned directories;
|
|
19
19
|
* never imports or executes authored modules.
|
|
20
20
|
*
|
|
21
21
|
* @param {import('./integrations.mjs').LoadedIntegration} loaded
|
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
import * as fs from 'node:fs';
|
|
15
15
|
import * as path from 'node:path';
|
|
16
16
|
import {isDeepStrictEqual} from 'node:util';
|
|
17
|
-
import {
|
|
18
|
-
|
|
17
|
+
import {
|
|
18
|
+
discoverIntegrationThemes,
|
|
19
|
+
isThemeFolder,
|
|
20
|
+
listThemeFiles,
|
|
21
|
+
} from '../discovery/theme-discovery.mjs';
|
|
19
22
|
import {discoverIntegrationComponents} from '../discovery/component-discovery.mjs';
|
|
20
23
|
import {loadComponentDoc} from '../discovery/component-loader.mjs';
|
|
21
24
|
import {discoverIntegrationTemplatesForOne} from '../discovery/template-adapter.mjs';
|
|
@@ -65,27 +68,21 @@ function rel(packageDir, file) {
|
|
|
65
68
|
|
|
66
69
|
/** @param {string} root @param {string} pkgDir */
|
|
67
70
|
function enumerateThemeFiles(root, pkgDir) {
|
|
71
|
+
if (!root || !fs.existsSync(root) || !fs.statSync(root).isDirectory()) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
// Exactly what `theme add` copies: each theme folder's files, including
|
|
75
|
+
// tests and fixtures, but no dot entry or file npm never publishes. Files
|
|
76
|
+
// beside the theme folders belong to no theme.
|
|
68
77
|
/** @type {string[]} */
|
|
69
78
|
const files = [];
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const data = JSON.parse(fs.readFileSync(catalog, 'utf-8'));
|
|
75
|
-
if (data?.version !== 1 || !Array.isArray(data.themes)) return files;
|
|
76
|
-
for (const theme of data.themes) {
|
|
77
|
-
if (typeof theme.slug !== 'string' || !Array.isArray(theme.files))
|
|
78
|
-
continue;
|
|
79
|
-
for (const f of theme.files) {
|
|
80
|
-
if (typeof f === 'string') {
|
|
81
|
-
files.push(rel(pkgDir, path.join(root, theme.slug, f)));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
79
|
+
for (const entry of fs.readdirSync(root, {withFileTypes: true})) {
|
|
80
|
+
const full = path.join(root, entry.name);
|
|
81
|
+
if (entry.isDirectory() && isThemeFolder(full)) {
|
|
82
|
+
files.push(...listThemeFiles(full).map(file => path.join(full, file)));
|
|
84
83
|
}
|
|
85
|
-
} catch {
|
|
86
|
-
/* Phase 1 catches structural issues */
|
|
87
84
|
}
|
|
88
|
-
return files;
|
|
85
|
+
return files.sort().map(file => rel(pkgDir, file));
|
|
89
86
|
}
|
|
90
87
|
|
|
91
88
|
/** @param {string} root @param {string} pkgDir */
|
|
@@ -158,7 +155,7 @@ const ROOT_KINDS = /** @type {const} */ ([
|
|
|
158
155
|
|
|
159
156
|
/**
|
|
160
157
|
* Compute the files the tarball must contain for an integration's
|
|
161
|
-
* contributions to be visible.
|
|
158
|
+
* contributions to be visible. Walks descriptor-owned directories;
|
|
162
159
|
* never imports or executes authored modules.
|
|
163
160
|
*
|
|
164
161
|
* @param {import('./integrations.mjs').LoadedIntegration} loaded
|
|
@@ -37,30 +37,37 @@ function loaded(overrides = {}) {
|
|
|
37
37
|
|
|
38
38
|
function writeTheme(slug, files = [`${slug}Theme.ts`]) {
|
|
39
39
|
const root = path.join(tmpDir, 'themes');
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
const themeDir = path.join(root, slug);
|
|
41
|
+
fs.mkdirSync(themeDir, {recursive: true});
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
const target = path.join(themeDir, file);
|
|
44
|
+
fs.mkdirSync(path.dirname(target), {recursive: true});
|
|
45
|
+
fs.writeFileSync(target, `// ${file}\n`);
|
|
43
46
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
catalog.themes.push({
|
|
50
|
-
slug,
|
|
51
|
-
displayName: slug,
|
|
52
|
-
description: `${slug} theme.`,
|
|
53
|
-
maintained: true,
|
|
54
|
-
entry: files[0],
|
|
55
|
-
exportName: `${slug}Theme`,
|
|
56
|
-
files,
|
|
57
|
-
});
|
|
58
|
-
fs.writeFileSync(catalogPath, JSON.stringify(catalog, null, 2) + '\n');
|
|
47
|
+
fs.writeFileSync(
|
|
48
|
+
path.join(themeDir, `${slug}Theme.doc.mjs`),
|
|
49
|
+
`/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */\nexport default {type: 'theme', name: '${slug}', displayName: '${slug}', description: '${slug} theme.', maintained: true};\n`,
|
|
50
|
+
);
|
|
59
51
|
return root;
|
|
60
52
|
}
|
|
61
53
|
|
|
54
|
+
const UNPUBLISHED = [
|
|
55
|
+
'.DS_Store',
|
|
56
|
+
'._oceanTheme.ts',
|
|
57
|
+
'.gitignore',
|
|
58
|
+
'.npmignore',
|
|
59
|
+
'.npmrc',
|
|
60
|
+
'oceanTheme.ts.orig',
|
|
61
|
+
'npm-debug.log',
|
|
62
|
+
'palette/.DS_Store',
|
|
63
|
+
'palette/npm-debug.log',
|
|
64
|
+
'.git/HEAD',
|
|
65
|
+
'CVS/Entries',
|
|
66
|
+
'node_modules/dep/index.js',
|
|
67
|
+
];
|
|
68
|
+
|
|
62
69
|
describe('computeRequiredFiles', () => {
|
|
63
|
-
it('enumerates
|
|
70
|
+
it('enumerates each complete descriptor-owned theme directory', () => {
|
|
64
71
|
const root = writeTheme('ocean', ['oceanTheme.ts', 'tokens.ts']);
|
|
65
72
|
const inv = computeRequiredFiles(loaded({themes: root}));
|
|
66
73
|
|
|
@@ -69,13 +76,46 @@ describe('computeRequiredFiles', () => {
|
|
|
69
76
|
expect(inv.roots[0].kind).toBe('themes');
|
|
70
77
|
expect(inv.roots[0].files).toEqual(
|
|
71
78
|
expect.arrayContaining([
|
|
72
|
-
'themes/
|
|
79
|
+
'themes/ocean/oceanTheme.doc.mjs',
|
|
73
80
|
'themes/ocean/oceanTheme.ts',
|
|
74
81
|
'themes/ocean/tokens.ts',
|
|
75
82
|
]),
|
|
76
83
|
);
|
|
77
84
|
expect(inv.allFiles).toContain('astryx.integration.mjs');
|
|
78
|
-
expect(inv.allFiles).toContain('themes/
|
|
85
|
+
expect(inv.allFiles).toContain('themes/ocean/oceanTheme.doc.mjs');
|
|
86
|
+
expect(inv.allFiles).not.toContain('themes/manifest.json');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('requires no file npm leaves out, at any depth, and none beside the themes', () => {
|
|
90
|
+
const root = writeTheme('ocean', ['oceanTheme.ts', 'palette/tokens.ts']);
|
|
91
|
+
for (const file of [
|
|
92
|
+
...UNPUBLISHED.map(name => `ocean/${name}`),
|
|
93
|
+
'README.md',
|
|
94
|
+
'npm-debug.log',
|
|
95
|
+
]) {
|
|
96
|
+
fs.mkdirSync(path.dirname(path.join(root, file)), {recursive: true});
|
|
97
|
+
fs.writeFileSync(path.join(root, file), 'x\n');
|
|
98
|
+
}
|
|
99
|
+
expect(computeRequiredFiles(loaded({themes: root})).roots[0].files).toEqual(
|
|
100
|
+
[
|
|
101
|
+
'themes/ocean/oceanTheme.doc.mjs',
|
|
102
|
+
'themes/ocean/oceanTheme.ts',
|
|
103
|
+
'themes/ocean/palette/tokens.ts',
|
|
104
|
+
],
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('requires only the folders theme discovery reads', () => {
|
|
109
|
+
const root = writeTheme('ocean');
|
|
110
|
+
for (const file of ['shared/palette.ts', '.cache/state.json']) {
|
|
111
|
+
fs.mkdirSync(path.dirname(path.join(root, file)), {recursive: true});
|
|
112
|
+
fs.writeFileSync(path.join(root, file), '{}\n');
|
|
113
|
+
}
|
|
114
|
+
const inv = computeRequiredFiles(loaded({themes: root}));
|
|
115
|
+
expect(inv.roots[0].files).toEqual([
|
|
116
|
+
'themes/ocean/oceanTheme.doc.mjs',
|
|
117
|
+
'themes/ocean/oceanTheme.ts',
|
|
118
|
+
]);
|
|
79
119
|
});
|
|
80
120
|
|
|
81
121
|
it('enumerates paired component metadata and source files', () => {
|
|
@@ -139,31 +179,31 @@ describe('computeRequiredFiles', () => {
|
|
|
139
179
|
const root = path.join(tmpDir, 'templates');
|
|
140
180
|
fs.mkdirSync(path.join(root, 'dashboard'), {recursive: true});
|
|
141
181
|
fs.writeFileSync(
|
|
142
|
-
path.join(root, 'dashboard', 'dashboard.
|
|
182
|
+
path.join(root, 'dashboard', 'dashboard.doc.mjs'),
|
|
143
183
|
'// tmpl\n',
|
|
144
184
|
);
|
|
145
185
|
fs.writeFileSync(path.join(root, 'dashboard', 'dashboard.tsx'), '// src\n');
|
|
146
186
|
const inv = computeRequiredFiles(loaded({templates: root}));
|
|
147
187
|
|
|
148
188
|
expect(inv.roots[0].files).toContain(
|
|
149
|
-
'templates/dashboard/dashboard.
|
|
189
|
+
'templates/dashboard/dashboard.doc.mjs',
|
|
150
190
|
);
|
|
151
191
|
expect(inv.roots[0].files).toContain('templates/dashboard/dashboard.tsx');
|
|
152
192
|
});
|
|
153
193
|
|
|
154
|
-
it('enumerates
|
|
194
|
+
it('enumerates released .template compatibility metadata with paired sources', () => {
|
|
155
195
|
const root = path.join(tmpDir, 'templates');
|
|
156
196
|
fs.mkdirSync(path.join(root, 'dashboard'), {recursive: true});
|
|
157
197
|
fs.writeFileSync(
|
|
158
|
-
path.join(root, 'dashboard', 'dashboard.
|
|
159
|
-
'//
|
|
198
|
+
path.join(root, 'dashboard', 'dashboard.template.mjs'),
|
|
199
|
+
'// released compatibility template\n',
|
|
160
200
|
);
|
|
161
201
|
fs.writeFileSync(path.join(root, 'dashboard', 'dashboard.tsx'), '// src\n');
|
|
162
202
|
|
|
163
203
|
const inv = computeRequiredFiles(loaded({templates: root}));
|
|
164
204
|
|
|
165
205
|
expect(inv.roots[0].files).toEqual([
|
|
166
|
-
'templates/dashboard/dashboard.
|
|
206
|
+
'templates/dashboard/dashboard.template.mjs',
|
|
167
207
|
'templates/dashboard/dashboard.tsx',
|
|
168
208
|
]);
|
|
169
209
|
});
|
|
@@ -41,6 +41,12 @@ export async function warnOnIntegrationIssues(loadedIntegrations, {json = false}
|
|
|
41
41
|
}
|
|
42
42
|
for (const integration of loadedIntegrations) {
|
|
43
43
|
if (!integration || typeof integration !== 'object') continue;
|
|
44
|
+
// A package set aside for a provider-ID conflict is fine in isolation,
|
|
45
|
+
// so `doctor integration validate` would not explain it. Say it here.
|
|
46
|
+
if (integration.__providerConflict) {
|
|
47
|
+
console.error(`Warning: ${integration.__providerConflict.message}`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
44
50
|
let issues;
|
|
45
51
|
try {
|
|
46
52
|
issues = await validateLoadedIntegration(integration);
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Resolve provider identity across loaded integrations, in precedence order.
|
|
6
|
+
*
|
|
7
|
+
* Artifact and document IDs are provider-scoped, so two packages cannot both
|
|
8
|
+
* contribute under one provider ID. The same package reached twice (an npm
|
|
9
|
+
* alias beside the package it aliases, with the same name and version) loads
|
|
10
|
+
* once. Any other later claimant, including the same package at another
|
|
11
|
+
* version, stays as an inert entry that carries the conflict. The package being
|
|
12
|
+
* authored claims its ID before precedence order is considered, because the
|
|
13
|
+
* source being edited is authoritative. The winner still contributes; Project
|
|
14
|
+
* issues, Doctor, and the per-command warning name the one set aside instead of
|
|
15
|
+
* dropping it without a word.
|
|
16
|
+
*
|
|
17
|
+
* The conflict pass of {@link resolveProviders}, for a list that is already
|
|
18
|
+
* assembled.
|
|
19
|
+
*
|
|
20
|
+
* @param {LoadedIntegration[]} integrations in precedence order
|
|
21
|
+
* @returns {LoadedIntegration[]}
|
|
22
|
+
*/
|
|
23
|
+
export function markProviderConflicts(integrations: LoadedIntegration[]): LoadedIntegration[];
|
|
4
24
|
/**
|
|
5
25
|
* Return the conventional root manifest paths present in `dir`, in
|
|
6
26
|
* load-precedence order. Unlike {@link resolveManifestPath} this never throws —
|
|
@@ -75,12 +95,15 @@ export function loadLocalIntegration(packageDir: string, { fresh }?: {
|
|
|
75
95
|
* Load configured integrations.
|
|
76
96
|
*
|
|
77
97
|
* @param {string[]} [specs] package names
|
|
78
|
-
* @param {{cwd?: string, fresh?: boolean}} [options]
|
|
98
|
+
* @param {{cwd?: string, fresh?: boolean, resolveProviders?: boolean}} [options]
|
|
99
|
+
* `resolveProviders: false` leaves provider identity to a caller that
|
|
100
|
+
* resolves it once over a larger set (Project.load)
|
|
79
101
|
* @returns {Promise<LoadedIntegration[]>}
|
|
80
102
|
*/
|
|
81
|
-
export function loadIntegrations(specs?: string[], { cwd, fresh }?: {
|
|
103
|
+
export function loadIntegrations(specs?: string[], { cwd, fresh, resolveProviders }?: {
|
|
82
104
|
cwd?: string;
|
|
83
105
|
fresh?: boolean;
|
|
106
|
+
resolveProviders?: boolean;
|
|
84
107
|
}): Promise<LoadedIntegration[]>;
|
|
85
108
|
/**
|
|
86
109
|
* A fully-resolved, loaded integration. Identity (`name`, `version`) comes from
|
|
@@ -89,6 +112,10 @@ export function loadIntegrations(specs?: string[], { cwd, fresh }?: {
|
|
|
89
112
|
* are internal bookkeeping used by Doctor integration validation and Project.
|
|
90
113
|
* @typedef {object} LoadedIntegration
|
|
91
114
|
* @property {string} name
|
|
115
|
+
* @property {import('../../authoring/identity/type').ProviderId} [providerId]
|
|
116
|
+
* normalized stable provider identity; absent only for a legacy unnamed local
|
|
117
|
+
* package. Unique among contributing integrations: a later claimant is kept
|
|
118
|
+
* inert with `__providerConflict` (see {@link markProviderConflicts})
|
|
92
119
|
* @property {string} [version]
|
|
93
120
|
* @property {string} [components]
|
|
94
121
|
* @property {string} [templates]
|
|
@@ -107,6 +134,10 @@ export function loadIntegrations(specs?: string[], { cwd, fresh }?: {
|
|
|
107
134
|
* @property {string} __manifestFile
|
|
108
135
|
* @property {string} [__loadError] set when the manifest failed to load/validate;
|
|
109
136
|
* such an integration contributes nothing and is surfaced via Project.issues()
|
|
137
|
+
* @property {{providerId: import('../../authoring/identity/type').ProviderId, claimedBy: string, message: string}} [__providerConflict]
|
|
138
|
+
* set on a package whose provider ID an earlier-loaded package already
|
|
139
|
+
* claims; it contributes nothing and is reported as a `duplicate_provider`
|
|
140
|
+
* warning
|
|
110
141
|
* @property {string[]} [__unknownKeys] manifest keys this CLI does not know —
|
|
111
142
|
* surfaced as a warning; the rest of the manifest still contributes
|
|
112
143
|
* @property {boolean} [__autolinked] loaded because the project declares the
|
|
@@ -134,6 +165,12 @@ export const MANIFEST_BASENAMES: string[];
|
|
|
134
165
|
*/
|
|
135
166
|
export type LoadedIntegration = {
|
|
136
167
|
name: string;
|
|
168
|
+
/**
|
|
169
|
+
* normalized stable provider identity; absent only for a legacy unnamed local
|
|
170
|
+
* package. Unique among contributing integrations: a later claimant is kept
|
|
171
|
+
* inert with `__providerConflict` (see {@link markProviderConflicts})
|
|
172
|
+
*/
|
|
173
|
+
providerId?: import("../../authoring/identity/type").ProviderId | undefined;
|
|
137
174
|
version?: string | undefined;
|
|
138
175
|
components?: string | undefined;
|
|
139
176
|
templates?: string | undefined;
|
|
@@ -163,6 +200,16 @@ export type LoadedIntegration = {
|
|
|
163
200
|
* such an integration contributes nothing and is surfaced via Project.issues()
|
|
164
201
|
*/
|
|
165
202
|
__loadError?: string | undefined;
|
|
203
|
+
/**
|
|
204
|
+
* set on a package whose provider ID an earlier-loaded package already
|
|
205
|
+
* claims; it contributes nothing and is reported as a `duplicate_provider`
|
|
206
|
+
* warning
|
|
207
|
+
*/
|
|
208
|
+
__providerConflict?: {
|
|
209
|
+
providerId: import("../../authoring/identity/type").ProviderId;
|
|
210
|
+
claimedBy: string;
|
|
211
|
+
message: string;
|
|
212
|
+
} | undefined;
|
|
166
213
|
/**
|
|
167
214
|
* manifest keys this CLI does not know —
|
|
168
215
|
* surfaced as a warning; the rest of the manifest still contributes
|
|
@@ -6,13 +6,19 @@
|
|
|
6
6
|
* Integrations are PACKAGE NAMES listed in astryx.config.{ts,mjs,js}. Each
|
|
7
7
|
* package declares a single conventional root manifest sibling to its
|
|
8
8
|
* package.json — astryx.integration.{ts,mjs,js} — which contributes
|
|
9
|
-
* components/templates/codemods/docs/themes roots and an optional issuesUrl.
|
|
10
|
-
*
|
|
9
|
+
* components/templates/codemods/docs/themes roots and an optional issuesUrl.
|
|
10
|
+
* Stable provider identity and package metadata come from package.json, not the
|
|
11
|
+
* manifest.
|
|
12
|
+
*
|
|
13
|
+
* @input Integration package names, package.json files, and root manifests.
|
|
14
|
+
* @output LoadedIntegration records with normalized provider identity and roots.
|
|
15
|
+
* @position foundation/integrations — package contribution loading boundary.
|
|
11
16
|
*/
|
|
12
17
|
|
|
13
18
|
import * as fs from 'node:fs';
|
|
14
19
|
import * as path from 'node:path';
|
|
15
20
|
import {assertWithin} from '../fs/path-safety.mjs';
|
|
21
|
+
import {normalizeProviderId} from '../identity/provider-identity.mjs';
|
|
16
22
|
// The key census and contribution parsers are internal to the schema module on
|
|
17
23
|
// purpose: the public parser still validates the complete authored type, while
|
|
18
24
|
// the loader can isolate an invalid optional contribution from valid roots.
|
|
@@ -23,6 +29,7 @@ import {
|
|
|
23
29
|
} from '../../authoring/integration/schema.mjs';
|
|
24
30
|
import {importUserModule, findPresentFiles} from '../fs/module-loader.mjs';
|
|
25
31
|
import {parseGapReportHandler} from '../../authoring/gap-report/parse.mjs';
|
|
32
|
+
import {resolveProviders} from './provider-resolution.mjs';
|
|
26
33
|
|
|
27
34
|
/**
|
|
28
35
|
* A fully-resolved, loaded integration. Identity (`name`, `version`) comes from
|
|
@@ -31,6 +38,10 @@ import {parseGapReportHandler} from '../../authoring/gap-report/parse.mjs';
|
|
|
31
38
|
* are internal bookkeeping used by Doctor integration validation and Project.
|
|
32
39
|
* @typedef {object} LoadedIntegration
|
|
33
40
|
* @property {string} name
|
|
41
|
+
* @property {import('../../authoring/identity/type').ProviderId} [providerId]
|
|
42
|
+
* normalized stable provider identity; absent only for a legacy unnamed local
|
|
43
|
+
* package. Unique among contributing integrations: a later claimant is kept
|
|
44
|
+
* inert with `__providerConflict` (see {@link markProviderConflicts})
|
|
34
45
|
* @property {string} [version]
|
|
35
46
|
* @property {string} [components]
|
|
36
47
|
* @property {string} [templates]
|
|
@@ -49,6 +60,10 @@ import {parseGapReportHandler} from '../../authoring/gap-report/parse.mjs';
|
|
|
49
60
|
* @property {string} __manifestFile
|
|
50
61
|
* @property {string} [__loadError] set when the manifest failed to load/validate;
|
|
51
62
|
* such an integration contributes nothing and is surfaced via Project.issues()
|
|
63
|
+
* @property {{providerId: import('../../authoring/identity/type').ProviderId, claimedBy: string, message: string}} [__providerConflict]
|
|
64
|
+
* set on a package whose provider ID an earlier-loaded package already
|
|
65
|
+
* claims; it contributes nothing and is reported as a `duplicate_provider`
|
|
66
|
+
* warning
|
|
52
67
|
* @property {string[]} [__unknownKeys] manifest keys this CLI does not know —
|
|
53
68
|
* surfaced as a warning; the rest of the manifest still contributes
|
|
54
69
|
* @property {boolean} [__autolinked] loaded because the project declares the
|
|
@@ -74,6 +89,50 @@ export const MANIFEST_BASENAMES = [
|
|
|
74
89
|
'astryx.integration.js',
|
|
75
90
|
];
|
|
76
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Normalize a package-owned provider ID without rejecting legacy unnamed local
|
|
94
|
+
* packages at this compatibility boundary.
|
|
95
|
+
* @param {unknown} name
|
|
96
|
+
* @returns {import('../../authoring/identity/type').ProviderId | undefined}
|
|
97
|
+
*/
|
|
98
|
+
function providerIdForPackage(name) {
|
|
99
|
+
if (typeof name !== 'string' || name.length === 0) return undefined;
|
|
100
|
+
try {
|
|
101
|
+
return normalizeProviderId(name);
|
|
102
|
+
} catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Resolve provider identity across loaded integrations, in precedence order.
|
|
109
|
+
*
|
|
110
|
+
* Artifact and document IDs are provider-scoped, so two packages cannot both
|
|
111
|
+
* contribute under one provider ID. The same package reached twice (an npm
|
|
112
|
+
* alias beside the package it aliases, with the same name and version) loads
|
|
113
|
+
* once. Any other later claimant, including the same package at another
|
|
114
|
+
* version, stays as an inert entry that carries the conflict. The package being
|
|
115
|
+
* authored claims its ID before precedence order is considered, because the
|
|
116
|
+
* source being edited is authoritative. The winner still contributes; Project
|
|
117
|
+
* issues, Doctor, and the per-command warning name the one set aside instead of
|
|
118
|
+
* dropping it without a word.
|
|
119
|
+
*
|
|
120
|
+
* The conflict pass of {@link resolveProviders}, for a list that is already
|
|
121
|
+
* assembled.
|
|
122
|
+
*
|
|
123
|
+
* @param {LoadedIntegration[]} integrations in precedence order
|
|
124
|
+
* @returns {LoadedIntegration[]}
|
|
125
|
+
*/
|
|
126
|
+
export function markProviderConflicts(integrations) {
|
|
127
|
+
return resolveProviders(
|
|
128
|
+
integrations.map(integration => ({
|
|
129
|
+
source: /** @type {const} */ ('configured'),
|
|
130
|
+
integration,
|
|
131
|
+
spec: integration?.__spec,
|
|
132
|
+
})),
|
|
133
|
+
).integrations;
|
|
134
|
+
}
|
|
135
|
+
|
|
77
136
|
/**
|
|
78
137
|
* Return the conventional root manifest paths present in `dir`, in
|
|
79
138
|
* load-precedence order. Unlike {@link resolveManifestPath} this never throws —
|
|
@@ -274,6 +333,7 @@ export async function loadLocalIntegration(packageDir, {fresh = false} = {}) {
|
|
|
274
333
|
typeof pkg.name === 'string' && pkg.name.length > 0
|
|
275
334
|
? pkg.name
|
|
276
335
|
: '(local integration)';
|
|
336
|
+
const packageProviderId = providerIdForPackage(pkg.name);
|
|
277
337
|
const manifestFile = resolveManifestPath(packageDir, spec);
|
|
278
338
|
|
|
279
339
|
let manifest;
|
|
@@ -299,6 +359,7 @@ export async function loadLocalIntegration(packageDir, {fresh = false} = {}) {
|
|
|
299
359
|
} catch (err) {
|
|
300
360
|
return {
|
|
301
361
|
name: spec,
|
|
362
|
+
...(packageProviderId == null ? {} : {providerId: packageProviderId}),
|
|
302
363
|
version: pkg.version,
|
|
303
364
|
__spec: spec,
|
|
304
365
|
__packageDir: packageDir,
|
|
@@ -308,6 +369,8 @@ export async function loadLocalIntegration(packageDir, {fresh = false} = {}) {
|
|
|
308
369
|
};
|
|
309
370
|
}
|
|
310
371
|
|
|
372
|
+
const providerId = providerIdForPackage(manifest.providerId ?? pkg.name);
|
|
373
|
+
|
|
311
374
|
/** @param {string | null | undefined} value */
|
|
312
375
|
const resolveRoot = value => {
|
|
313
376
|
if (value == null) return undefined;
|
|
@@ -320,6 +383,7 @@ export async function loadLocalIntegration(packageDir, {fresh = false} = {}) {
|
|
|
320
383
|
|
|
321
384
|
return {
|
|
322
385
|
name: spec,
|
|
386
|
+
...(providerId == null ? {} : {providerId}),
|
|
323
387
|
version: pkg.version,
|
|
324
388
|
components: resolveRoot(manifest.components),
|
|
325
389
|
templates: resolveRoot(manifest.templates),
|
|
@@ -345,20 +409,22 @@ export async function loadLocalIntegration(packageDir, {fresh = false} = {}) {
|
|
|
345
409
|
* Load configured integrations.
|
|
346
410
|
*
|
|
347
411
|
* @param {string[]} [specs] package names
|
|
348
|
-
* @param {{cwd?: string, fresh?: boolean}} [options]
|
|
412
|
+
* @param {{cwd?: string, fresh?: boolean, resolveProviders?: boolean}} [options]
|
|
413
|
+
* `resolveProviders: false` leaves provider identity to a caller that
|
|
414
|
+
* resolves it once over a larger set (Project.load)
|
|
349
415
|
* @returns {Promise<LoadedIntegration[]>}
|
|
350
416
|
*/
|
|
351
417
|
export async function loadIntegrations(
|
|
352
418
|
specs = [],
|
|
353
|
-
{cwd = process.cwd(), fresh = false} = {},
|
|
419
|
+
{cwd = process.cwd(), fresh = false, resolveProviders = true} = {},
|
|
354
420
|
) {
|
|
355
421
|
/** @type {LoadedIntegration[]} */
|
|
356
422
|
const integrations = [];
|
|
357
|
-
const
|
|
423
|
+
const seenSpecs = new Set();
|
|
358
424
|
|
|
359
425
|
for (const spec of specs) {
|
|
360
|
-
if (!spec ||
|
|
361
|
-
|
|
426
|
+
if (!spec || seenSpecs.has(spec)) continue;
|
|
427
|
+
seenSpecs.add(spec);
|
|
362
428
|
|
|
363
429
|
const packageDir = resolvePackageDir(spec, cwd);
|
|
364
430
|
const pkgPath = path.join(packageDir, 'package.json');
|
|
@@ -371,6 +437,7 @@ export async function loadIntegrations(
|
|
|
371
437
|
);
|
|
372
438
|
}
|
|
373
439
|
|
|
440
|
+
const packageProviderId = providerIdForPackage(pkg.name ?? spec);
|
|
374
441
|
const manifestFile = resolveManifestPath(packageDir, spec);
|
|
375
442
|
let manifest;
|
|
376
443
|
/** @type {string[]} */
|
|
@@ -399,6 +466,7 @@ export async function loadIntegrations(
|
|
|
399
466
|
// discovery loops naturally skip it (no components/templates/codemods).
|
|
400
467
|
integrations.push({
|
|
401
468
|
name: pkg.name ?? spec,
|
|
469
|
+
...(packageProviderId == null ? {} : {providerId: packageProviderId}),
|
|
402
470
|
version: pkg.version,
|
|
403
471
|
__spec: spec,
|
|
404
472
|
__packageDir: packageDir,
|
|
@@ -408,6 +476,10 @@ export async function loadIntegrations(
|
|
|
408
476
|
continue;
|
|
409
477
|
}
|
|
410
478
|
|
|
479
|
+
const providerId = providerIdForPackage(
|
|
480
|
+
manifest.providerId ?? pkg.name ?? spec,
|
|
481
|
+
);
|
|
482
|
+
|
|
411
483
|
/** @param {string | null | undefined} value */
|
|
412
484
|
const resolveRoot = value => {
|
|
413
485
|
if (value == null) return undefined;
|
|
@@ -421,6 +493,7 @@ export async function loadIntegrations(
|
|
|
421
493
|
|
|
422
494
|
integrations.push({
|
|
423
495
|
name: pkg.name ?? spec,
|
|
496
|
+
...(providerId == null ? {} : {providerId}),
|
|
424
497
|
version: pkg.version,
|
|
425
498
|
components: resolveRoot(manifest.components),
|
|
426
499
|
templates: resolveRoot(manifest.templates),
|
|
@@ -441,5 +514,5 @@ export async function loadIntegrations(
|
|
|
441
514
|
});
|
|
442
515
|
}
|
|
443
516
|
|
|
444
|
-
return integrations;
|
|
517
|
+
return resolveProviders ? markProviderConflicts(integrations) : integrations;
|
|
445
518
|
}
|