@astryxdesign/cli 0.6.3 → 0.6.4-canary.0e1fbdb
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 +152 -107
- 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 +22 -10
- package/api/build/build.test.mjs +219 -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 +208 -53
- 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 +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +49 -19
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -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 +277 -41
- package/api/docs/_adapter.mjs +993 -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/docOverlays.test.mjs +27 -1
- 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.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/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 +104 -1
- package/api/doctor/doctor.doc.mjs +18 -8
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/doctor/doctor.type.d.mts +1 -1
- package/api/doctor/doctor.type.mjs +1 -1
- package/api/gap-report/gap-report.doc.mjs +27 -14
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +7 -3
- 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 +2 -1
- package/api/index.mjs +6 -3
- package/api/init/init.doc.mjs +22 -12
- 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 +56 -65
- package/api/integration/add-theme.test.mjs +139 -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 +5 -4
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
- package/api/integration/pack-check.mjs +160 -11
- package/api/integration/pack-check.test.mjs +477 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +15 -2
- 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 +2 -1
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +2 -1
- 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 +89 -12
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +697 -97
- 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 +8 -5
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +18 -24
- package/api/template/copy/copy.test.mjs +26 -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 +32 -9
- 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 +2 -2
- 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 +12 -12
- package/api/theme/themeBuild.doc.mjs +21 -17
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +6 -3
- package/api/theme/themePaletteGenerate.doc.mjs +16 -8
- package/api/theme/themeTargets.doc.mjs +4 -2
- package/api/theme/themeTemplate.doc.mjs +8 -3
- 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/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +358 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +32 -23
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- 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 +353 -104
- 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 +12 -1
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +8 -2
- package/assets/docs/elevation.doc.mjs +6 -4
- package/assets/docs/getting-started.doc.mjs +6 -17
- package/assets/docs/icons.doc.mjs +2 -21
- package/assets/docs/illustrations.doc.mjs +7 -15
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +132 -84
- package/assets/docs/layout.doc.mjs +134 -78
- package/assets/docs/migration.doc.mjs +19 -21
- package/assets/docs/motion.doc.mjs +16 -3
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +14 -6
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +8 -3
- package/assets/docs/spacing.doc.mjs +7 -2
- package/assets/docs/styling-libraries.doc.mjs +10 -6
- package/assets/docs/styling.doc.mjs +22 -26
- package/assets/docs/theme.doc.dense.mjs +58 -18
- package/assets/docs/theme.doc.mjs +60 -50
- package/assets/docs/theme.doc.zh.mjs +9 -8
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +390 -9
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/add-a-component.doc.mjs +75 -0
- package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
- package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
- package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/block-template.doc.mjs +130 -0
- package/assets/docs/tree/build-the-template.doc.mjs +28 -0
- package/assets/docs/tree/building-blocks.doc.mjs +46 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
- package/assets/docs/tree/checks.doc.mjs +119 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/codemods.doc.mjs +147 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-family.doc.mjs +113 -0
- package/assets/docs/tree/component-imports.doc.mjs +69 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/tree/components.doc.mjs +23 -0
- package/assets/docs/tree/configuration.doc.mjs +23 -0
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
- package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
- package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
- package/assets/docs/tree/docs.doc.mjs +21 -0
- package/assets/docs/tree/document-the-template.doc.mjs +28 -0
- package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
- package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
- package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
- package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
- package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
- package/assets/docs/tree/help.doc.mjs +16 -0
- package/assets/docs/tree/integrations.doc.mjs +40 -0
- package/assets/docs/tree/links.doc.mjs +98 -0
- package/assets/docs/tree/package-and-test.doc.mjs +32 -0
- package/assets/docs/tree/page-template.doc.mjs +71 -0
- package/assets/docs/tree/publishing.doc.mjs +111 -0
- package/assets/docs/tree/quick-start.doc.mjs +272 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
- package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
- package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
- package/assets/docs/tree/ship.doc.mjs +16 -0
- package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
- package/assets/docs/tree/single-component.doc.mjs +165 -0
- package/assets/docs/tree/start-a-template.doc.mjs +143 -0
- package/assets/docs/tree/subcomponent.doc.mjs +115 -0
- package/assets/docs/tree/template-assets.doc.mjs +64 -0
- package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
- package/assets/docs/tree/template-fonts.doc.mjs +102 -0
- package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
- package/assets/docs/tree/template-icons.doc.mjs +97 -0
- package/assets/docs/tree/template-images-media.doc.mjs +127 -0
- package/assets/docs/tree/template-styles.doc.mjs +93 -0
- package/assets/docs/tree/templates.doc.mjs +34 -0
- package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
- package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
- package/assets/docs/tree/themes.doc.mjs +39 -0
- package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
- package/assets/docs/tree/upgrading.doc.mjs +103 -0
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
- package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
- package/assets/docs/tree/versioning.doc.mjs +161 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
- package/assets/docs/typography.doc.mjs +24 -4
- package/assets/docs/working-with-ai.doc.mjs +34 -26
- 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 +11 -3
- 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 +792 -24
- package/authoring/doctypes/_schema.mjs +549 -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 +43 -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 +12 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +14 -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 +55 -6
- package/authoring/doctypes/reference/type.ts +75 -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 +2 -2
- 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 +22 -13
- 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 +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -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 +28 -10
- 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 +295 -38
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
- 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 +143 -8
- package/clients/cli/commands/doctor.doc.mjs +4 -2
- package/clients/cli/commands/doctor.mjs +108 -37
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +27 -15
- 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 +24 -10
- 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 +39 -13
- package/clients/cli/commands/integration-authoring.test.mjs +74 -19
- package/clients/cli/commands/integration-pack.doc.mjs +6 -10
- package/clients/cli/commands/integration-real-world.test.mjs +4 -10
- package/clients/cli/commands/integration-verify.doc.mjs +22 -0
- package/clients/cli/commands/integration.doc.mjs +5 -5
- package/clients/cli/commands/integration.mjs +75 -43
- 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 +2 -2
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +16 -6
- package/clients/cli/commands/search.mjs +49 -11
- package/clients/cli/commands/search.test.mjs +92 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +4 -3
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +53 -14
- 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 +725 -0
- package/clients/cli/commands/theme-add.doc.mjs +5 -4
- 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 +12 -7
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +2 -3
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +3 -3
- 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 +3 -2
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +83 -12
- 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 +47 -34
- 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 +56 -6
- package/clients/cli/lib/define-command.test.mjs +54 -0
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +113 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- 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 +53 -6
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +83 -13
- 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 +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 +174 -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 +504 -0
- package/foundation/discovery/cli-self-docs.test.mjs +395 -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 +427 -108
- package/foundation/discovery/docs-discovery.test.mjs +386 -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 +1643 -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 +298 -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 +292 -0
- package/foundation/doc-compiler/tree.mjs +881 -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 +65 -0
- package/foundation/integrations/cli-requirement.mjs +189 -0
- package/foundation/integrations/cli-requirement.test.mjs +89 -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 +28 -25
- 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/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- 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 +19 -12
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +166 -14
- 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 +7 -2
- package/foundation/response/response-types.doc.mjs +69 -25
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +12 -11
- 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/api/docs/docs.test.mjs +0 -83
- package/api/docs/integrationDocs.test.mjs +0 -208
- package/api/search/search.test.mjs +0 -389
- package/assets/docs/cli-integrations.doc.mjs +0 -367
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/docs.test.mjs +0 -102
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
- package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
|
@@ -29,8 +29,9 @@
|
|
|
29
29
|
* package's own package.json `name` (see loadIntegrations), so an aliased
|
|
30
30
|
* dependency reports the package it actually is.
|
|
31
31
|
*
|
|
32
|
-
* An explicit config entry always wins:
|
|
33
|
-
*
|
|
32
|
+
* An explicit config entry always wins: a dependency whose directory is
|
|
33
|
+
* already loaded from config is never imported again, and comes back as a
|
|
34
|
+
* repeat so the provider ledger still records it.
|
|
34
35
|
*
|
|
35
36
|
* @position lib — sits between config/project (the caller) and
|
|
36
37
|
* integrations/integrations (the loader); contributes no discovery of its own.
|
|
@@ -39,6 +40,7 @@
|
|
|
39
40
|
import * as fs from 'node:fs';
|
|
40
41
|
import * as path from 'node:path';
|
|
41
42
|
import {findManifestPaths, loadIntegrations} from './integrations.mjs';
|
|
43
|
+
import {resolveProviders} from './provider-resolution.mjs';
|
|
42
44
|
|
|
43
45
|
/**
|
|
44
46
|
* package.json fields whose keys name a dependency this project installs.
|
|
@@ -164,36 +166,44 @@ function realPath(target) {
|
|
|
164
166
|
}
|
|
165
167
|
|
|
166
168
|
/**
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
|
|
169
|
+
* @typedef {object} AutolinkCandidate
|
|
170
|
+
* @property {string} spec
|
|
171
|
+
* @property {string} field
|
|
172
|
+
* @property {string} packageDir
|
|
173
|
+
* @property {string} hostDir
|
|
174
|
+
* @property {boolean} [repeat] the directory is already loaded or already a
|
|
175
|
+
* candidate under another dependency key; it is not loaded again
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Every declared dependency that ships exactly one root manifest, in
|
|
180
|
+
* declaration order, including the ones whose directory is already loaded or
|
|
181
|
+
* already a candidate (`repeat`), so a caller can account for each of them.
|
|
175
182
|
*
|
|
176
183
|
* @param {string} projectDir directory holding the project's package.json
|
|
177
184
|
* @param {{exclude?: Iterable<string>}} [options] `exclude` — package
|
|
178
185
|
* directories already loaded (from config); matched through symlinks
|
|
179
|
-
* @returns {
|
|
186
|
+
* @returns {AutolinkCandidate[]}
|
|
180
187
|
*/
|
|
181
|
-
export function
|
|
188
|
+
export function scanAutolinkCandidates(projectDir, {exclude = []} = {}) {
|
|
182
189
|
const taken = new Set([...exclude].map(realPath));
|
|
183
|
-
/** @type {
|
|
190
|
+
/** @type {AutolinkCandidate[]} */
|
|
184
191
|
const candidates = [];
|
|
185
192
|
|
|
186
193
|
for (const {name, field} of readDeclaredDependencies(projectDir)) {
|
|
187
194
|
const resolved = resolveInstalledPackageDir(name, projectDir);
|
|
188
195
|
if (!resolved) continue;
|
|
189
196
|
|
|
197
|
+
if (findManifestPaths(resolved.packageDir).length !== 1) continue;
|
|
198
|
+
|
|
190
199
|
// Two dependency keys can name one installed package — an npm alias beside
|
|
191
200
|
// the package it aliases, or the two spellings of a package mid-rename
|
|
192
201
|
// resolving through one store entry. Load it once.
|
|
193
202
|
const identity = realPath(resolved.packageDir);
|
|
194
|
-
if (taken.has(identity))
|
|
195
|
-
|
|
196
|
-
|
|
203
|
+
if (taken.has(identity)) {
|
|
204
|
+
candidates.push({spec: name, field, ...resolved, repeat: true});
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
197
207
|
|
|
198
208
|
taken.add(identity);
|
|
199
209
|
candidates.push({spec: name, field, ...resolved});
|
|
@@ -202,6 +212,100 @@ export function findAutolinkCandidates(projectDir, {exclude = []} = {}) {
|
|
|
202
212
|
return candidates;
|
|
203
213
|
}
|
|
204
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Declared dependencies that ship an integration manifest and are not already
|
|
217
|
+
* loaded, in declaration order.
|
|
218
|
+
*
|
|
219
|
+
* A candidate must have EXACTLY ONE root manifest. Zero is the ordinary case
|
|
220
|
+
* (almost every dependency), and more than one is a packaging mistake the
|
|
221
|
+
* loader treats as a hard error — an error the project did not ask for and
|
|
222
|
+
* cannot fix, so an ambiguous package is passed over here rather than allowed
|
|
223
|
+
* to fail the load of a project that merely depends on it.
|
|
224
|
+
*
|
|
225
|
+
* @param {string} projectDir directory holding the project's package.json
|
|
226
|
+
* @param {{exclude?: Iterable<string>}} [options] `exclude` — package
|
|
227
|
+
* directories already loaded (from config); matched through symlinks
|
|
228
|
+
* @returns {Array<{spec: string, field: string, packageDir: string, hostDir: string}>}
|
|
229
|
+
*/
|
|
230
|
+
export function findAutolinkCandidates(projectDir, options) {
|
|
231
|
+
return scanAutolinkCandidates(projectDir, options)
|
|
232
|
+
.filter(candidate => !candidate.repeat)
|
|
233
|
+
.map(({spec, field, packageDir, hostDir}) => ({
|
|
234
|
+
spec,
|
|
235
|
+
field,
|
|
236
|
+
packageDir,
|
|
237
|
+
hostDir,
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Load every autolink candidate, each in isolation, as provider candidates for
|
|
243
|
+
* {@link resolveProviders}. Nothing is filtered here: a candidate whose load
|
|
244
|
+
* throws or whose manifest fails comes back with its error, and a repeated
|
|
245
|
+
* directory comes back unloaded, so the resolver records each one.
|
|
246
|
+
*
|
|
247
|
+
* @param {object} options
|
|
248
|
+
* @param {string} options.projectDir directory holding the project's package.json
|
|
249
|
+
* @param {import('./integrations.mjs').LoadedIntegration[]} [options.loaded]
|
|
250
|
+
* integrations already loaded from config
|
|
251
|
+
* @param {boolean} [options.fresh]
|
|
252
|
+
* @returns {Promise<import('./provider-resolution.mjs').ProviderCandidate[]>}
|
|
253
|
+
*/
|
|
254
|
+
export async function loadAutolinkCandidates({
|
|
255
|
+
projectDir,
|
|
256
|
+
loaded = [],
|
|
257
|
+
fresh = false,
|
|
258
|
+
}) {
|
|
259
|
+
const scanned = scanAutolinkCandidates(projectDir, {
|
|
260
|
+
// A configured entry that never resolved to a directory has none to exclude.
|
|
261
|
+
exclude: loaded.flatMap(integration =>
|
|
262
|
+
typeof integration.__packageDir === 'string'
|
|
263
|
+
? [integration.__packageDir]
|
|
264
|
+
: [],
|
|
265
|
+
),
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/** @type {import('./provider-resolution.mjs').ProviderCandidate[]} */
|
|
269
|
+
const candidates = [];
|
|
270
|
+
for (const candidate of scanned) {
|
|
271
|
+
const {spec, packageDir} = candidate;
|
|
272
|
+
if (candidate.repeat) {
|
|
273
|
+
candidates.push({source: 'autolinked', spec, packageDir, repeat: true});
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
// Resolve from the directory whose node_modules actually holds the
|
|
278
|
+
// package, so a hoisted dependency resolves the same way Node found it.
|
|
279
|
+
const [integration] = await loadIntegrations([spec], {
|
|
280
|
+
cwd: candidate.hostDir,
|
|
281
|
+
fresh,
|
|
282
|
+
});
|
|
283
|
+
candidates.push({
|
|
284
|
+
source: 'autolinked',
|
|
285
|
+
spec,
|
|
286
|
+
packageDir,
|
|
287
|
+
...(integration == null
|
|
288
|
+
? {}
|
|
289
|
+
: {
|
|
290
|
+
integration: {
|
|
291
|
+
...integration,
|
|
292
|
+
__autolinked: true,
|
|
293
|
+
__dependencyField: candidate.field,
|
|
294
|
+
},
|
|
295
|
+
}),
|
|
296
|
+
});
|
|
297
|
+
} catch (error) {
|
|
298
|
+
candidates.push({
|
|
299
|
+
source: 'autolinked',
|
|
300
|
+
spec,
|
|
301
|
+
packageDir,
|
|
302
|
+
error: error instanceof Error ? error.message : String(error),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return candidates;
|
|
307
|
+
}
|
|
308
|
+
|
|
205
309
|
/**
|
|
206
310
|
* Load every declared dependency that ships an integration manifest and is not
|
|
207
311
|
* already loaded from config.
|
|
@@ -216,6 +320,12 @@ export function findAutolinkCandidates(projectDir, {exclude = []} = {}) {
|
|
|
216
320
|
* consuming project can neither fix nor silence, and which
|
|
217
321
|
* `astryx doctor integration validate <package>` reports on demand.
|
|
218
322
|
*
|
|
323
|
+
* One package reached twice (an alias beside the package it aliases, at the
|
|
324
|
+
* same version) loads once. The same name at another version is kept, so the
|
|
325
|
+
* provider pass reports it instead of dropping it. Project.load does not call
|
|
326
|
+
* this; it hands {@link loadAutolinkCandidates} to the resolver, whose ledger
|
|
327
|
+
* records every candidate dropped here.
|
|
328
|
+
*
|
|
219
329
|
* @param {object} options
|
|
220
330
|
* @param {string} options.projectDir directory holding the project's package.json
|
|
221
331
|
* @param {import('./integrations.mjs').LoadedIntegration[]} [options.loaded]
|
|
@@ -228,38 +338,26 @@ export async function autolinkIntegrations({
|
|
|
228
338
|
loaded = [],
|
|
229
339
|
fresh = false,
|
|
230
340
|
}) {
|
|
231
|
-
const candidates =
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
341
|
+
const candidates = await loadAutolinkCandidates({projectDir, loaded, fresh});
|
|
342
|
+
const {ledger} = resolveProviders([
|
|
343
|
+
...loaded.map(integration => ({
|
|
344
|
+
source: /** @type {const} */ ('configured'),
|
|
345
|
+
integration,
|
|
346
|
+
spec: integration.__spec,
|
|
347
|
+
})),
|
|
348
|
+
...candidates,
|
|
349
|
+
]);
|
|
235
350
|
/** @type {import('./integrations.mjs').LoadedIntegration[]} */
|
|
236
351
|
const autolinked = [];
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
[integration] = await loadIntegrations([candidate.spec], {
|
|
246
|
-
cwd: candidate.hostDir,
|
|
247
|
-
fresh,
|
|
248
|
-
});
|
|
249
|
-
} catch {
|
|
250
|
-
continue;
|
|
352
|
+
for (const entry of ledger.values()) {
|
|
353
|
+
const {candidate} = entry;
|
|
354
|
+
if (
|
|
355
|
+
candidate.source === 'autolinked' &&
|
|
356
|
+
candidate.integration != null &&
|
|
357
|
+
(entry.outcome === 'contributes' || entry.outcome === 'set-aside')
|
|
358
|
+
) {
|
|
359
|
+
autolinked.push(candidate.integration);
|
|
251
360
|
}
|
|
252
|
-
if (!integration || integration.__loadError) continue;
|
|
253
|
-
// Identity is the resolved package's own name, so an alias and the package
|
|
254
|
-
// it aliases collapse here even when they are two directories on disk.
|
|
255
|
-
if (names.has(integration.name)) continue;
|
|
256
|
-
names.add(integration.name);
|
|
257
|
-
autolinked.push({
|
|
258
|
-
...integration,
|
|
259
|
-
__autolinked: true,
|
|
260
|
-
__dependencyField: candidate.field,
|
|
261
|
-
});
|
|
262
361
|
}
|
|
263
|
-
|
|
264
362
|
return autolinked;
|
|
265
363
|
}
|
|
@@ -87,7 +87,7 @@ function installPackage(
|
|
|
87
87
|
fs.mkdirSync(componentsDir, {recursive: true});
|
|
88
88
|
fs.writeFileSync(
|
|
89
89
|
path.join(componentsDir, `${componentName}.doc.mjs`),
|
|
90
|
-
`export
|
|
90
|
+
`export default {type: 'component', name: '${componentName}', usage: {description: 'A widget'}, props: []};\n`,
|
|
91
91
|
);
|
|
92
92
|
fs.writeFileSync(
|
|
93
93
|
path.join(componentsDir, `${componentName}.tsx`),
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The lowest version a semver range admits: the least of its `||`
|
|
6
|
+
* alternatives. Null when an alternative has no lower bound, or the range is
|
|
7
|
+
* not one this can read, so the caller treats it as admitting every version.
|
|
8
|
+
* @param {unknown} range
|
|
9
|
+
* @returns {string | null}
|
|
10
|
+
*/
|
|
11
|
+
export function lowestAdmitted(range: unknown): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Why a package that ships a namespace doc or a placed guide would lose its
|
|
14
|
+
* docs on an older CLI, or null when its declared CLI range admits only CLIs
|
|
15
|
+
* that read the docs tree. Published 0.6.3 hides every topic of a package
|
|
16
|
+
* with a namespace doc; builds of main before the docs tree also do so for a
|
|
17
|
+
* placed guide.
|
|
18
|
+
* @param {any} pkg package.json
|
|
19
|
+
* @returns {string | null}
|
|
20
|
+
*/
|
|
21
|
+
export function docsTreeCliProblem(pkg: any): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Why a package with a template that sets `replaces` would lose templates and
|
|
24
|
+
* doc topics on an older CLI (spec:AST-035), or null when its declared CLI
|
|
25
|
+
* range admits only CLIs that read the field.
|
|
26
|
+
* @param {any} pkg package.json
|
|
27
|
+
* @returns {string | null}
|
|
28
|
+
*/
|
|
29
|
+
export function replacesCliProblem(pkg: any): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Why a package with a doc section that sets `id` would lose its doc topics on
|
|
32
|
+
* an older CLI, or null when its declared CLI range admits only CLIs that read
|
|
33
|
+
* the field. Published 0.6.3 rejects a section `id` and hides every doc topic
|
|
34
|
+
* the package ships.
|
|
35
|
+
* @param {any} pkg package.json
|
|
36
|
+
* @returns {string | null}
|
|
37
|
+
*/
|
|
38
|
+
export function sectionIdsCliProblem(pkg: any): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Why a package that ships a theme would lose its themes and doc topics on an
|
|
41
|
+
* older CLI, or null when its declared CLI range admits only CLIs that read
|
|
42
|
+
* typed theme descriptors. Published 0.6.3 rejects a themes root with no
|
|
43
|
+
* `manifest.json` catalog, which `integration add theme` no longer writes.
|
|
44
|
+
* @param {any} pkg package.json
|
|
45
|
+
* @returns {string | null}
|
|
46
|
+
*/
|
|
47
|
+
export function themesCliProblem(pkg: any): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The package.json with a CLI peer that reads namespace docs: optional, unless
|
|
50
|
+
* the package already says otherwise.
|
|
51
|
+
* @param {any} pkg package.json
|
|
52
|
+
* @returns {any}
|
|
53
|
+
*/
|
|
54
|
+
export function withDocsTreeCli(pkg: any): any;
|
|
55
|
+
export const CLI_PACKAGE: "@astryxdesign/cli";
|
|
56
|
+
/**
|
|
57
|
+
* The first CLI release that reads an integration's docs tree (namespace docs
|
|
58
|
+
* and placed guides), its templates' `replaces`, and its typed theme
|
|
59
|
+
* descriptors. A release before it can hide every doc topic a package with a
|
|
60
|
+
* namespace doc or a placed guide ships, with no warning; it rejects
|
|
61
|
+
* `replaces`, drops that template, and hides the package's doc topics; and it
|
|
62
|
+
* rejects a themes root without the `manifest.json` catalog the CLI no longer
|
|
63
|
+
* writes, withholding the package's themes and doc topics.
|
|
64
|
+
*/
|
|
65
|
+
export const DOCS_TREE_CLI: "0.7.0";
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file The CLI an integration's namespace docs need (spec:AST-046 FR11).
|
|
5
|
+
*
|
|
6
|
+
* @input A package.json object.
|
|
7
|
+
* @output Whether its `peerDependencies` range for `@astryxdesign/cli` admits
|
|
8
|
+
* only CLIs that read namespace docs, and the package.json that declares it.
|
|
9
|
+
* @position foundation/integrations; read by `integration add doc --parent`
|
|
10
|
+
* and `integration add theme`, which declare the peer, and
|
|
11
|
+
* `integration verify`, which requires it.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import {semverCompare} from '../env/semver.mjs';
|
|
15
|
+
|
|
16
|
+
export const CLI_PACKAGE = '@astryxdesign/cli';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The first CLI release that reads an integration's docs tree (namespace docs
|
|
20
|
+
* and placed guides), its templates' `replaces`, and its typed theme
|
|
21
|
+
* descriptors. A release before it can hide every doc topic a package with a
|
|
22
|
+
* namespace doc or a placed guide ships, with no warning; it rejects
|
|
23
|
+
* `replaces`, drops that template, and hides the package's doc topics; and it
|
|
24
|
+
* rejects a themes root without the `manifest.json` catalog the CLI no longer
|
|
25
|
+
* writes, withholding the package's themes and doc topics.
|
|
26
|
+
*/
|
|
27
|
+
export const DOCS_TREE_CLI = '0.7.0';
|
|
28
|
+
|
|
29
|
+
const VERSION_RE = /^v?(\d+|[xX*])(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A version or partial version as MAJOR.MINOR.PATCH, a wildcard part as 0.
|
|
33
|
+
* @param {string} text
|
|
34
|
+
* @returns {string | null}
|
|
35
|
+
*/
|
|
36
|
+
function lowerVersion(text) {
|
|
37
|
+
const m = VERSION_RE.exec(text.trim());
|
|
38
|
+
if (!m) return null;
|
|
39
|
+
return [m[1], m[2], m[3]]
|
|
40
|
+
.map(part => (part == null || /^[xX*]$/.test(part) ? '0' : part))
|
|
41
|
+
.join('.');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The lowest version one space-joined comparator set admits, or null when it
|
|
46
|
+
* has no lower bound this can read.
|
|
47
|
+
* @param {string} set
|
|
48
|
+
* @returns {string | null}
|
|
49
|
+
*/
|
|
50
|
+
function lowestOfSet(set) {
|
|
51
|
+
if (set === '' || set === '*' || /^[xX]$/.test(set)) return null;
|
|
52
|
+
const hyphen = /^(\S+)\s+-\s+\S+$/.exec(set);
|
|
53
|
+
if (hyphen) return lowerVersion(hyphen[1]);
|
|
54
|
+
/** @type {string | null} */
|
|
55
|
+
let lowest = null;
|
|
56
|
+
for (const comparator of set.split(/\s+/)) {
|
|
57
|
+
const m = /^(>=|<=|>|<|=|\^|~)?(.+)$/.exec(comparator);
|
|
58
|
+
if (!m) return null;
|
|
59
|
+
if (m[1] === '<' || m[1] === '<=') continue;
|
|
60
|
+
const version = lowerVersion(m[2]);
|
|
61
|
+
if (version == null) return null;
|
|
62
|
+
if (lowest == null || semverCompare(version, lowest) > 0) lowest = version;
|
|
63
|
+
}
|
|
64
|
+
return lowest;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The lowest version a semver range admits: the least of its `||`
|
|
69
|
+
* alternatives. Null when an alternative has no lower bound, or the range is
|
|
70
|
+
* not one this can read, so the caller treats it as admitting every version.
|
|
71
|
+
* @param {unknown} range
|
|
72
|
+
* @returns {string | null}
|
|
73
|
+
*/
|
|
74
|
+
export function lowestAdmitted(range) {
|
|
75
|
+
if (typeof range !== 'string') return null;
|
|
76
|
+
/** @type {string | null} */
|
|
77
|
+
let lowest = null;
|
|
78
|
+
for (const alternative of range.split('||')) {
|
|
79
|
+
const low = lowestOfSet(alternative.trim());
|
|
80
|
+
if (low == null) return null;
|
|
81
|
+
if (lowest == null || semverCompare(low, lowest) < 0) lowest = low;
|
|
82
|
+
}
|
|
83
|
+
return lowest;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Why a package that uses a feature an older CLI cannot read would lose it,
|
|
88
|
+
* or null when its declared CLI range admits only CLIs that read it.
|
|
89
|
+
* @param {any} pkg package.json
|
|
90
|
+
* @param {string} feature what the package does, e.g. "ships a namespace doc"
|
|
91
|
+
* @param {string} loss what an older CLI does with it
|
|
92
|
+
* @returns {string | null}
|
|
93
|
+
*/
|
|
94
|
+
function cliRangeProblem(pkg, feature, loss) {
|
|
95
|
+
const range = pkg?.peerDependencies?.[CLI_PACKAGE];
|
|
96
|
+
const fix = `"${CLI_PACKAGE}": ">=${DOCS_TREE_CLI}" in peerDependencies (optional in peerDependenciesMeta, if the CLI is not required)`;
|
|
97
|
+
if (typeof range !== 'string') {
|
|
98
|
+
return `The package ${feature} but declares no ${CLI_PACKAGE} peer. A stable CLI before ${DOCS_TREE_CLI} ${loss}. Declare ${fix}.`;
|
|
99
|
+
}
|
|
100
|
+
const lowest = lowestAdmitted(range);
|
|
101
|
+
if (lowest == null || semverCompare(lowest, DOCS_TREE_CLI) < 0) {
|
|
102
|
+
return `The package ${feature}, but its ${CLI_PACKAGE} peer range "${range}" admits a stable CLI before ${DOCS_TREE_CLI}, which ${loss}. Declare ${fix}.`;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Why a package that ships a namespace doc or a placed guide would lose its
|
|
109
|
+
* docs on an older CLI, or null when its declared CLI range admits only CLIs
|
|
110
|
+
* that read the docs tree. Published 0.6.3 hides every topic of a package
|
|
111
|
+
* with a namespace doc; builds of main before the docs tree also do so for a
|
|
112
|
+
* placed guide.
|
|
113
|
+
* @param {any} pkg package.json
|
|
114
|
+
* @returns {string | null}
|
|
115
|
+
*/
|
|
116
|
+
export function docsTreeCliProblem(pkg) {
|
|
117
|
+
return cliRangeProblem(
|
|
118
|
+
pkg,
|
|
119
|
+
'ships a namespace doc or a placed guide',
|
|
120
|
+
'does not read the docs tree, and can hide every doc topic the package ships',
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Why a package with a template that sets `replaces` would lose templates and
|
|
126
|
+
* doc topics on an older CLI (spec:AST-035), or null when its declared CLI
|
|
127
|
+
* range admits only CLIs that read the field.
|
|
128
|
+
* @param {any} pkg package.json
|
|
129
|
+
* @returns {string | null}
|
|
130
|
+
*/
|
|
131
|
+
export function replacesCliProblem(pkg) {
|
|
132
|
+
return cliRangeProblem(
|
|
133
|
+
pkg,
|
|
134
|
+
'has a template that sets `replaces`',
|
|
135
|
+
"rejects the field, drops that template, and hides the package's doc topics",
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Why a package with a doc section that sets `id` would lose its doc topics on
|
|
141
|
+
* an older CLI, or null when its declared CLI range admits only CLIs that read
|
|
142
|
+
* the field. Published 0.6.3 rejects a section `id` and hides every doc topic
|
|
143
|
+
* the package ships.
|
|
144
|
+
* @param {any} pkg package.json
|
|
145
|
+
* @returns {string | null}
|
|
146
|
+
*/
|
|
147
|
+
export function sectionIdsCliProblem(pkg) {
|
|
148
|
+
return cliRangeProblem(
|
|
149
|
+
pkg,
|
|
150
|
+
'has a doc section that sets `id`',
|
|
151
|
+
'rejects the field, and can hide every doc topic the package ships',
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Why a package that ships a theme would lose its themes and doc topics on an
|
|
157
|
+
* older CLI, or null when its declared CLI range admits only CLIs that read
|
|
158
|
+
* typed theme descriptors. Published 0.6.3 rejects a themes root with no
|
|
159
|
+
* `manifest.json` catalog, which `integration add theme` no longer writes.
|
|
160
|
+
* @param {any} pkg package.json
|
|
161
|
+
* @returns {string | null}
|
|
162
|
+
*/
|
|
163
|
+
export function themesCliProblem(pkg) {
|
|
164
|
+
return cliRangeProblem(
|
|
165
|
+
pkg,
|
|
166
|
+
'ships a theme',
|
|
167
|
+
"cannot read typed theme descriptors, and can drop the package's themes and hide its doc topics",
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The package.json with a CLI peer that reads namespace docs: optional, unless
|
|
173
|
+
* the package already says otherwise.
|
|
174
|
+
* @param {any} pkg package.json
|
|
175
|
+
* @returns {any}
|
|
176
|
+
*/
|
|
177
|
+
export function withDocsTreeCli(pkg) {
|
|
178
|
+
const meta = pkg.peerDependenciesMeta ?? {};
|
|
179
|
+
return {
|
|
180
|
+
...pkg,
|
|
181
|
+
peerDependencies: {
|
|
182
|
+
...(pkg.peerDependencies ?? {}),
|
|
183
|
+
[CLI_PACKAGE]: `>=${DOCS_TREE_CLI}`,
|
|
184
|
+
},
|
|
185
|
+
peerDependenciesMeta: meta[CLI_PACKAGE]
|
|
186
|
+
? meta
|
|
187
|
+
: {...meta, [CLI_PACKAGE]: {optional: true}},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import {
|
|
5
|
+
DOCS_TREE_CLI,
|
|
6
|
+
lowestAdmitted,
|
|
7
|
+
docsTreeCliProblem,
|
|
8
|
+
replacesCliProblem,
|
|
9
|
+
withDocsTreeCli,
|
|
10
|
+
} from './cli-requirement.mjs';
|
|
11
|
+
|
|
12
|
+
describe('lowestAdmitted', () => {
|
|
13
|
+
it.each([
|
|
14
|
+
['>=0.7.0', '0.7.0'],
|
|
15
|
+
['^0.6.0', '0.6.0'],
|
|
16
|
+
['~0.7.1', '0.7.1'],
|
|
17
|
+
['0.7.x', '0.7.0'],
|
|
18
|
+
['>=0.7.0 <0.8.0', '0.7.0'],
|
|
19
|
+
['^0.6.0 || >=0.7.0', '0.6.0'],
|
|
20
|
+
['0.8.0 - 0.9.0', '0.8.0'],
|
|
21
|
+
['*', null],
|
|
22
|
+
['<1.0.0', null],
|
|
23
|
+
['latest', null],
|
|
24
|
+
['workspace:*', null],
|
|
25
|
+
])('%s admits %s at the lowest', (range, lowest) => {
|
|
26
|
+
expect(lowestAdmitted(range)).toBe(lowest);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('docsTreeCliProblem', () => {
|
|
31
|
+
it('asks for a CLI peer when there is none', () => {
|
|
32
|
+
expect(docsTreeCliProblem({name: '@acme/kit'})).toContain(
|
|
33
|
+
'declares no @astryxdesign/cli peer',
|
|
34
|
+
);
|
|
35
|
+
// Stable releases: a canary built from main before its release reports
|
|
36
|
+
// the older version and reads every feature.
|
|
37
|
+
expect(docsTreeCliProblem({name: '@acme/kit'})).toContain(
|
|
38
|
+
'A stable CLI before 0.7.0 does not read the docs tree',
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it.each(['^0.6.0', '^0.6.0 || >=0.7.0', '*', '>=0.6.3'])(
|
|
43
|
+
'refuses %s, which admits a CLI that cannot read a namespace doc',
|
|
44
|
+
range => {
|
|
45
|
+
expect(
|
|
46
|
+
docsTreeCliProblem({peerDependencies: {'@astryxdesign/cli': range}}),
|
|
47
|
+
).toContain('admits a stable CLI before');
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
it.each(['>=0.7.0', '^0.7.2', '>=0.7.0 <2'])('accepts %s', range => {
|
|
52
|
+
expect(
|
|
53
|
+
docsTreeCliProblem({peerDependencies: {'@astryxdesign/cli': range}}),
|
|
54
|
+
).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('declares the peer as optional, and keeps what the package says of it', () => {
|
|
58
|
+
const declared = withDocsTreeCli({name: '@acme/kit'});
|
|
59
|
+
expect(declared.peerDependencies).toEqual({
|
|
60
|
+
'@astryxdesign/cli': `>=${DOCS_TREE_CLI}`,
|
|
61
|
+
});
|
|
62
|
+
expect(declared.peerDependenciesMeta).toEqual({
|
|
63
|
+
'@astryxdesign/cli': {optional: true},
|
|
64
|
+
});
|
|
65
|
+
expect(docsTreeCliProblem(declared)).toBeNull();
|
|
66
|
+
const required = withDocsTreeCli({
|
|
67
|
+
peerDependencies: {react: '^19.0.0', '@astryxdesign/cli': '^0.6.0'},
|
|
68
|
+
peerDependenciesMeta: {'@astryxdesign/cli': {optional: false}},
|
|
69
|
+
});
|
|
70
|
+
expect(required.peerDependencies.react).toBe('^19.0.0');
|
|
71
|
+
expect(required.peerDependenciesMeta['@astryxdesign/cli']).toEqual({
|
|
72
|
+
optional: false,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('replacesCliProblem', () => {
|
|
78
|
+
it('asks a package that sets replaces for a CLI that reads the field', () => {
|
|
79
|
+
expect(replacesCliProblem({name: '@acme/kit'})).toContain(
|
|
80
|
+
'sets `replaces`',
|
|
81
|
+
);
|
|
82
|
+
expect(
|
|
83
|
+
replacesCliProblem({peerDependencies: {'@astryxdesign/cli': '^0.6.0'}}),
|
|
84
|
+
).toContain('admits a stable CLI before');
|
|
85
|
+
expect(
|
|
86
|
+
replacesCliProblem({peerDependencies: {'@astryxdesign/cli': '>=0.7.0'}}),
|
|
87
|
+
).toBeNull();
|
|
88
|
+
});
|
|
89
|
+
});
|