@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -79
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +268 -47
- package/api/docs/_adapter.mjs +970 -149
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.d.mts +0 -15
- package/api/docs/detail/detail.mjs +22 -78
- package/api/docs/detail/section/section.mjs +39 -24
- package/api/docs/detail/section/section.test.mjs +19 -9
- package/api/docs/docs.d.mts +5 -3
- package/api/docs/docs.doc.mjs +39 -17
- package/api/docs/docs.mjs +44 -8
- package/api/docs/docs.test.mjs +158 -4
- package/api/docs/docs.type.d.mts +185 -6
- package/api/docs/docs.type.mjs +127 -13
- package/api/docs/index/index.mjs +15 -6
- package/api/docs/index/index.test.mjs +1 -1
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +14 -14
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +54 -4
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +332 -21
- package/api/doctor/doctor.test.mjs +420 -7
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +1 -1
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +2 -0
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.mjs +83 -7
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +61 -10
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +14 -2
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +11 -13
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +124 -73
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +8 -2
- package/api/upgrade/upgrade.type.d.mts +42 -4
- package/api/upgrade/upgrade.type.mjs +26 -10
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/next/index.mjs +19 -1
- package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +10 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +29 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +7 -7
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +240 -128
- package/authoring/doctypes/_schema.mjs +198 -16
- package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
- package/authoring/doctypes/base/type.ts +9 -4
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +4 -4
- package/authoring/doctypes/component/component.doc.mjs +5 -2
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +3 -3
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +2 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +4 -3
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +3 -3
- package/authoring/doctypes/legacy.d.mts +6 -6
- package/authoring/doctypes/legacy.mjs +3 -3
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
- package/authoring/doctypes/namespace/parse.d.mts +2 -2
- package/authoring/doctypes/namespace/parse.mjs +1 -1
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +6 -3
- package/authoring/doctypes/parse.d.mts +22 -20
- package/authoring/doctypes/parse.mjs +19 -14
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +1 -1
- package/authoring/doctypes/reference/reference.doc.mjs +39 -6
- package/authoring/doctypes/reference/type.ts +31 -14
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +3 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +37 -1
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +12 -1
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -11
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +9 -9
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.mjs +3 -2
- package/authoring/identity/type.ts +10 -10
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +32 -19
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/schema.d.mts +4 -4
- package/authoring/integration/schema.mjs +3 -3
- package/authoring/integration/type.ts +5 -11
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +21 -9
- package/clients/cli/commands/docs.mjs +184 -70
- package/clients/cli/commands/docs.test.mjs +120 -16
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +719 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +20 -8
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +2 -0
- package/clients/cli/formatters/index.test.mjs +6 -0
- package/clients/cli/index.mjs +21 -30
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +32 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +246 -89
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +38 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +38 -0
- package/foundation/discovery/component-discovery.mjs +48 -0
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +114 -9
- package/foundation/discovery/docs-discovery.mjs +239 -30
- package/foundation/discovery/docs-discovery.test.mjs +150 -35
- package/foundation/discovery/docs-output-budget.d.mts +2 -2
- package/foundation/discovery/docs-output-budget.mjs +1 -1
- package/foundation/discovery/docs-section-key.d.mts +28 -10
- package/foundation/discovery/docs-section-key.mjs +134 -33
- package/foundation/discovery/docs-section-key.test.mjs +41 -19
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +772 -82
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +598 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -52
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +51 -26
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +17 -1
- package/foundation/integrations/integrations.mjs +52 -98
- package/foundation/integrations/integrations.test.mjs +31 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.mjs +121 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +11 -0
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +37 -22
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
package/authoring/index.d.ts
CHANGED
|
@@ -23,18 +23,19 @@
|
|
|
23
23
|
// ═══════════════════════════════════════════════════════════════════════
|
|
24
24
|
// AUTHOR THESE — each is the default export of one authored file.
|
|
25
25
|
// ═══════════════════════════════════════════════════════════════════════
|
|
26
|
-
export type {ComponentDoc} from './doctypes/types'; // Button.doc.
|
|
27
|
-
export type {HookDoc} from './doctypes/types'; // useToast.doc.
|
|
28
|
-
export type {FunctionDoc} from './doctypes/types'; // search.doc.mjs (hook | api)
|
|
29
|
-
export type {ReferenceDoc} from './doctypes/types'; // theming.doc.
|
|
30
|
-
export type {TemplateDoc} from './doctypes/types'; // Foo.
|
|
31
|
-
export type {SchemaDoc} from './doctypes/types'; // config.doc.mjs (object shape)
|
|
32
|
-
export type {CommandDoc} from './doctypes/types'; // search.doc.mjs (CLI command)
|
|
33
|
-
export type {EnumDoc} from './doctypes/types'; // error-codes.doc.mjs (vocabulary)
|
|
34
|
-
export type {NamespaceDoc} from './doctypes/types'; // cli.doc.mjs (hierarchy)
|
|
35
|
-
export type {
|
|
36
|
-
export type {
|
|
37
|
-
export type {
|
|
26
|
+
export type {ComponentDoc} from './doctypes/types.js'; // Button.doc.mjs
|
|
27
|
+
export type {HookDoc} from './doctypes/types.js'; // useToast.doc.mjs
|
|
28
|
+
export type {FunctionDoc} from './doctypes/types.js'; // search.doc.mjs (hook | api)
|
|
29
|
+
export type {ReferenceDoc} from './doctypes/types.js'; // theming.doc.mjs
|
|
30
|
+
export type {TemplateDoc} from './doctypes/types.js'; // Foo.doc.mjs
|
|
31
|
+
export type {SchemaDoc} from './doctypes/types.js'; // config.doc.mjs (object shape)
|
|
32
|
+
export type {CommandDoc} from './doctypes/types.js'; // search.doc.mjs (CLI command)
|
|
33
|
+
export type {EnumDoc} from './doctypes/types.js'; // error-codes.doc.mjs (vocabulary)
|
|
34
|
+
export type {NamespaceDoc} from './doctypes/types.js'; // cli.doc.mjs (hierarchy)
|
|
35
|
+
export type {ThemeDoc} from './doctypes/types.js'; // oceanTheme.doc.mjs
|
|
36
|
+
export type {AstryxConfig} from './config/type.js'; // astryx.config.{ts,mjs}
|
|
37
|
+
export type {DebugEvent} from './debug/type.js'; // one recorded CLI run
|
|
38
|
+
export type {AstryxIntegration} from './integration/type.js'; // astryx.integration.{ts,mjs}
|
|
38
39
|
export type {
|
|
39
40
|
GapReportHandler,
|
|
40
41
|
GapReportHandlerContext,
|
|
@@ -42,8 +43,17 @@ export type {
|
|
|
42
43
|
GapReportCategory,
|
|
43
44
|
GapReportTarget,
|
|
44
45
|
GapReportHandlerReceipt,
|
|
45
|
-
} from './gap-report/type'; // gap-report handler contract
|
|
46
|
-
export type {
|
|
46
|
+
} from './gap-report/type.js'; // gap-report handler contract
|
|
47
|
+
export type {
|
|
48
|
+
DiscoverSource,
|
|
49
|
+
DiscoverSourceContext,
|
|
50
|
+
DiscoverCatalog,
|
|
51
|
+
DiscoverPackage,
|
|
52
|
+
DiscoverVersion,
|
|
53
|
+
DiscoverContribution,
|
|
54
|
+
DiscoverKind,
|
|
55
|
+
} from './discover/type.js'; // discover source contract
|
|
56
|
+
export type {AstryxCodemod, AstryxConfigCodemod} from './codemod/type.js'; // codemods/*
|
|
47
57
|
|
|
48
58
|
// ═══════════════════════════════════════════════════════════════════════
|
|
49
59
|
// PARSERS — the CLI's load boundary (types come from each parser's JSDoc).
|
|
@@ -58,6 +68,7 @@ export {parseSchema} from './doctypes/schema/parse.mjs';
|
|
|
58
68
|
export {parseCommand} from './doctypes/command/parse.mjs';
|
|
59
69
|
export {parseEnum} from './doctypes/enum/parse.mjs';
|
|
60
70
|
export {parseNamespace} from './doctypes/namespace/parse.mjs';
|
|
71
|
+
export {parseTheme} from './doctypes/theme/parse.mjs';
|
|
61
72
|
export {parseLegacyDoc} from './doctypes/legacy.mjs';
|
|
62
73
|
export {parseConfig} from './config/parse.mjs';
|
|
63
74
|
export {parseIntegration} from './integration/parse.mjs';
|
|
@@ -65,6 +76,7 @@ export {
|
|
|
65
76
|
parseGapReportHandler,
|
|
66
77
|
parseGapReportReceipt,
|
|
67
78
|
} from './gap-report/parse.mjs';
|
|
79
|
+
export {parseDiscoverCatalog} from './discover/parse.mjs';
|
|
68
80
|
export {parseCodemod} from './codemod/parse.mjs';
|
|
69
81
|
export {parseDebugEvent} from './debug/parse.mjs';
|
|
70
82
|
|
|
@@ -87,7 +99,7 @@ export type {
|
|
|
87
99
|
AuthoredDocSnapshot,
|
|
88
100
|
AuthoredDocSource,
|
|
89
101
|
AuthoredDocEntry,
|
|
90
|
-
} from './identity/type';
|
|
102
|
+
} from './identity/type.js';
|
|
91
103
|
export type {
|
|
92
104
|
// shared graph
|
|
93
105
|
AuthoredDocKind,
|
|
@@ -129,6 +141,7 @@ export type {
|
|
|
129
141
|
// reference
|
|
130
142
|
ReferenceSection,
|
|
131
143
|
ReferenceContentBlock,
|
|
144
|
+
GraphContentBlock,
|
|
132
145
|
ReferenceTokenPreviewType,
|
|
133
146
|
ReferenceTranslationDoc,
|
|
134
147
|
WorkflowStep,
|
|
@@ -151,8 +164,8 @@ export type {
|
|
|
151
164
|
CommandExampleDoc,
|
|
152
165
|
// enum
|
|
153
166
|
EnumMemberDoc,
|
|
154
|
-
} from './doctypes/types';
|
|
155
|
-
export type {PostCodemodHook, DebugConfig} from './config/type';
|
|
167
|
+
} from './doctypes/types.js';
|
|
168
|
+
export type {PostCodemodHook, DebugConfig} from './config/type.js';
|
|
156
169
|
export type {
|
|
157
170
|
// debug
|
|
158
171
|
DebugSchemaVersion,
|
|
@@ -165,11 +178,11 @@ export type {
|
|
|
165
178
|
DebugEventEnv,
|
|
166
179
|
DebugEventProject,
|
|
167
180
|
DebugEventHandler,
|
|
168
|
-
} from './debug/type';
|
|
181
|
+
} from './debug/type.js';
|
|
169
182
|
export type {
|
|
170
183
|
AstryxCodemodDef,
|
|
171
184
|
AstryxConfigCodemodDef,
|
|
172
185
|
AstryxCodemodFile,
|
|
173
186
|
AstryxCodemodApi,
|
|
174
187
|
AstryxCodemodTransform,
|
|
175
|
-
} from './codemod/type';
|
|
188
|
+
} from './codemod/type.js';
|
package/authoring/index.mjs
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `type` directly.
|
|
12
12
|
*
|
|
13
13
|
* Types (config, integration, codemod, and the doc vocabulary —
|
|
14
|
-
* component/hook/reference/template) are re-exported via `./index.ts`.
|
|
14
|
+
* component/hook/reference/template/theme) are re-exported via `./index.ts`.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
export {parseConfig} from './config/parse.mjs';
|
|
@@ -20,6 +20,7 @@ export {
|
|
|
20
20
|
parseGapReportHandler,
|
|
21
21
|
parseGapReportReceipt,
|
|
22
22
|
} from './gap-report/parse.mjs';
|
|
23
|
+
export {parseDiscoverCatalog} from './discover/parse.mjs';
|
|
23
24
|
export {parseCodemod} from './codemod/parse.mjs';
|
|
24
25
|
export {parseDebugEvent} from './debug/parse.mjs';
|
|
25
26
|
export {parseDoc} from './doctypes/parse.mjs';
|
|
@@ -32,4 +33,5 @@ export {parseSchema} from './doctypes/schema/parse.mjs';
|
|
|
32
33
|
export {parseCommand} from './doctypes/command/parse.mjs';
|
|
33
34
|
export {parseEnum} from './doctypes/enum/parse.mjs';
|
|
34
35
|
export {parseNamespace} from './doctypes/namespace/parse.mjs';
|
|
36
|
+
export {parseTheme} from './doctypes/theme/parse.mjs';
|
|
35
37
|
export {parseLegacyDoc} from './doctypes/legacy.mjs';
|
|
@@ -11,7 +11,7 @@ export const doc = {
|
|
|
11
11
|
type: 'schema',
|
|
12
12
|
name: 'integration',
|
|
13
13
|
displayName: 'Astryx Integration',
|
|
14
|
-
namespace: '
|
|
14
|
+
namespace: 'authoring',
|
|
15
15
|
description:
|
|
16
16
|
'The astryx.integration.* manifest that sits beside an integration ' +
|
|
17
17
|
"package's package.json. It can preserve a stable provider identity across a package rename, " +
|
|
@@ -57,7 +57,7 @@ export const doc = {
|
|
|
57
57
|
name: 'themes',
|
|
58
58
|
type: 'string',
|
|
59
59
|
description:
|
|
60
|
-
'Relative path to a source-theme
|
|
60
|
+
'Relative path to a source-theme root with one directory per theme slug. Each directory contains a source module and mandatory same-stem, strongly typed .doc.mjs descriptor. Installed themes appear in `astryx theme list` and can be copied with `astryx theme add`.',
|
|
61
61
|
example: "'./themes'",
|
|
62
62
|
},
|
|
63
63
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
|
-
/** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
|
|
4
|
+
/** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
|
|
5
5
|
/**
|
|
6
6
|
* Validate an unknown value as an Astryx integration manifest, or throw.
|
|
7
7
|
*
|
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
* @returns {AstryxIntegration}
|
|
15
15
|
*/
|
|
16
16
|
export function parseIntegration(input: unknown, label?: string): AstryxIntegration;
|
|
17
|
-
export type AstryxIntegration = import("./type").AstryxIntegration;
|
|
17
|
+
export type AstryxIntegration = import("./type.js").AstryxIntegration;
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import {formatZodError} from '../_shared/errors.mjs';
|
|
15
15
|
import {integrationSchema} from './schema.mjs';
|
|
16
16
|
|
|
17
|
-
/** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
|
|
17
|
+
/** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Validate an unknown value as an Astryx integration manifest, or throw.
|
|
@@ -55,8 +55,8 @@ export const integrationSchema: z.ZodObject<{
|
|
|
55
55
|
/**
|
|
56
56
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
57
57
|
*
|
|
58
|
-
* @typedef {import('../_shared/contract').Expect<
|
|
59
|
-
* import('../_shared/contract').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
|
|
58
|
+
* @typedef {import('../_shared/contract.js').Expect<
|
|
59
|
+
* import('../_shared/contract.js').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
|
|
60
60
|
* >} _IntegrationDriftLock
|
|
61
61
|
*/
|
|
62
62
|
/**
|
|
@@ -69,9 +69,9 @@ export const integrationSchema: z.ZodObject<{
|
|
|
69
69
|
* @type {string[]}
|
|
70
70
|
*/
|
|
71
71
|
export const KNOWN_INTEGRATION_KEYS: string[];
|
|
72
|
-
export type AstryxIntegration = import("./type").AstryxIntegration;
|
|
72
|
+
export type AstryxIntegration = import("./type.js").AstryxIntegration;
|
|
73
73
|
/**
|
|
74
74
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
75
75
|
*/
|
|
76
|
-
export type _IntegrationDriftLock = import("../_shared/contract").Expect<import("../_shared/contract").Equal<z.infer<typeof integrationSchema>, AstryxIntegration>>;
|
|
76
|
+
export type _IntegrationDriftLock = import("../_shared/contract.js").Expect<import("../_shared/contract.js").Equal<z.infer<typeof integrationSchema>, AstryxIntegration>>;
|
|
77
77
|
import { z } from 'zod';
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import {z} from 'zod';
|
|
17
17
|
import {formatZodError} from '../_shared/errors.mjs';
|
|
18
18
|
|
|
19
|
-
/** @typedef {import('./type').AstryxIntegration} AstryxIntegration */
|
|
19
|
+
/** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
|
|
20
20
|
|
|
21
21
|
const MAX_AGENT_DOC_LINES = 8;
|
|
22
22
|
const MAX_AGENT_DOC_LINE_CODE_POINTS = 240;
|
|
@@ -121,8 +121,8 @@ export function parseAgentDocsField(input, label) {
|
|
|
121
121
|
/**
|
|
122
122
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
123
123
|
*
|
|
124
|
-
* @typedef {import('../_shared/contract').Expect<
|
|
125
|
-
* import('../_shared/contract').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
|
|
124
|
+
* @typedef {import('../_shared/contract.js').Expect<
|
|
125
|
+
* import('../_shared/contract.js').Equal<z.infer<typeof integrationSchema>, AstryxIntegration>
|
|
126
126
|
* >} _IntegrationDriftLock
|
|
127
127
|
*/
|
|
128
128
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* The manifest module may also carry `debug` and `gapReport` NAMED exports.
|
|
12
12
|
* They are not fields here on purpose: a CLI released before a given manifest
|
|
13
13
|
* field existed could reject it and lose every contribution, while an unknown
|
|
14
|
-
* named export is simply not read. See
|
|
14
|
+
* named export is simply not read. See `astryx docs cli/integrations`.
|
|
15
15
|
*/
|
|
16
16
|
export interface AstryxIntegration {
|
|
17
17
|
/** Stable logical provider ID. Omit to use package.json#name. Set this only
|
|
@@ -34,15 +34,9 @@ export interface AstryxIntegration {
|
|
|
34
34
|
* serves from `astryx docs`, alongside the built-in ones. A topic may also
|
|
35
35
|
* `replace` or `extend` a built-in topic; see the ReferenceDoc type. */
|
|
36
36
|
docs?: string;
|
|
37
|
-
/** Relative path to the source-theme
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* entry requires `slug`, `displayName`, `description` (string),
|
|
41
|
-
* `maintained` (boolean), `entry` (source file relative to `themes/<slug>/`),
|
|
42
|
-
* `exportName` (a valid JS identifier naming the runtime export), and
|
|
43
|
-
* `files` (non-empty array of filenames relative to `themes/<slug>/`).
|
|
44
|
-
* Every file listed must exist on disk; the entry file must also appear
|
|
45
|
-
* in `files`. */
|
|
37
|
+
/** Relative path to the source-theme root (resolved to absolute). Each
|
|
38
|
+
* lower-kebab theme directory contains a source module and mandatory
|
|
39
|
+
* same-stem, strongly typed `.doc.mjs` descriptor. */
|
|
46
40
|
themes?: string;
|
|
47
41
|
/** Static package guidance appended to the CLI-owned managed agent block. */
|
|
48
42
|
agentDocs?: {
|
|
@@ -66,4 +60,4 @@ export type {
|
|
|
66
60
|
GapReportCategory,
|
|
67
61
|
GapReportTarget,
|
|
68
62
|
GapReportHandlerReceipt,
|
|
69
|
-
} from '../gap-report/type';
|
|
63
|
+
} from '../gap-report/type.js';
|
|
@@ -3,37 +3,35 @@
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import {describe, it, expect} from 'vitest';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
for (const theme of manifest.themes) {
|
|
26
|
-
expect(theme.slug).toBeDefined();
|
|
27
|
-
expect(theme.displayName).toBeDefined();
|
|
28
|
-
expect(theme.entry).toBeDefined();
|
|
29
|
-
|
|
30
|
-
const entryPath = path.join(themesDir, theme.slug, theme.entry);
|
|
31
|
-
expect(fs.existsSync(entryPath)).toBe(true);
|
|
32
|
-
|
|
6
|
+
import {discoverBundledThemes} from '../../../foundation/discovery/theme-discovery.mjs';
|
|
7
|
+
|
|
8
|
+
describe('@astryxdesign/cli bundled theme descriptor validation', () => {
|
|
9
|
+
it('discovers typed descriptors and their same-stem source files', () => {
|
|
10
|
+
const themes = discoverBundledThemes();
|
|
11
|
+
expect(themes.length).toBeGreaterThan(0);
|
|
12
|
+
|
|
13
|
+
for (const theme of themes) {
|
|
14
|
+
expect(theme.slug).toBeTruthy();
|
|
15
|
+
expect(theme.displayName).toBeTruthy();
|
|
16
|
+
expect(theme.docPath).toBe(
|
|
17
|
+
path.join(
|
|
18
|
+
theme.sourceDir,
|
|
19
|
+
`${path.basename(theme.entry, path.extname(theme.entry))}.doc.mjs`,
|
|
20
|
+
),
|
|
21
|
+
);
|
|
22
|
+
expect(fs.existsSync(theme.docPath)).toBe(true);
|
|
23
|
+
expect(fs.existsSync(path.join(theme.sourceDir, theme.entry))).toBe(true);
|
|
33
24
|
for (const file of theme.files) {
|
|
34
|
-
|
|
35
|
-
expect(fs.existsSync(filePath)).toBe(true);
|
|
25
|
+
expect(fs.existsSync(path.join(theme.sourceDir, file))).toBe(true);
|
|
36
26
|
}
|
|
37
27
|
}
|
|
38
28
|
});
|
|
29
|
+
|
|
30
|
+
it('does not ship the obsolete central theme catalog', () => {
|
|
31
|
+
expect(
|
|
32
|
+
fs.existsSync(
|
|
33
|
+
path.resolve('packages/cli/assets/templates/themes/manifest.json'),
|
|
34
|
+
),
|
|
35
|
+
).toBe(false);
|
|
36
|
+
});
|
|
39
37
|
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file A command whose module fails to import still answers: with --json, one
|
|
5
|
+
* error envelope on stdout; without it, the error on stderr. Exit 1 either way.
|
|
6
|
+
*
|
|
7
|
+
* The failure is injected with a module-load hook in a real subprocess, so the
|
|
8
|
+
* lazy command registry in index.mjs sees what a broken install would give it.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {describe, it, expect, beforeAll, afterAll} from 'vitest';
|
|
12
|
+
import {spawnSync} from 'node:child_process';
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import {fileURLToPath, pathToFileURL} from 'node:url';
|
|
17
|
+
|
|
18
|
+
const BIN = fileURLToPath(new URL('./bin/astryx.mjs', import.meta.url));
|
|
19
|
+
|
|
20
|
+
/** @type {string} */
|
|
21
|
+
let dir;
|
|
22
|
+
/** @type {string} */
|
|
23
|
+
let register;
|
|
24
|
+
|
|
25
|
+
beforeAll(() => {
|
|
26
|
+
dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-load-failure-'));
|
|
27
|
+
const hooks = path.join(dir, 'hooks.mjs');
|
|
28
|
+
fs.writeFileSync(
|
|
29
|
+
hooks,
|
|
30
|
+
[
|
|
31
|
+
'export async function load(url, context, nextLoad) {',
|
|
32
|
+
" if (url.endsWith('/clients/cli/commands/blog.mjs')) {",
|
|
33
|
+
" throw new Error('simulated load failure');",
|
|
34
|
+
' }',
|
|
35
|
+
' return nextLoad(url, context);',
|
|
36
|
+
'}',
|
|
37
|
+
'',
|
|
38
|
+
].join('\n'),
|
|
39
|
+
);
|
|
40
|
+
register = path.join(dir, 'register.mjs');
|
|
41
|
+
fs.writeFileSync(
|
|
42
|
+
register,
|
|
43
|
+
`import {register} from 'node:module';\nregister(${JSON.stringify(pathToFileURL(hooks).href)});\n`,
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
afterAll(() => {
|
|
48
|
+
fs.rmSync(dir, {recursive: true, force: true});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
/** @param {string[]} args */
|
|
52
|
+
function run(args) {
|
|
53
|
+
const res = spawnSync(
|
|
54
|
+
process.execPath,
|
|
55
|
+
['--import', pathToFileURL(register).href, BIN, ...args],
|
|
56
|
+
{cwd: dir, encoding: 'utf-8', timeout: 20_000},
|
|
57
|
+
);
|
|
58
|
+
return {status: res.status, stdout: res.stdout, stderr: res.stderr};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
describe('a command that fails to load', () => {
|
|
62
|
+
it('answers --json with one error envelope, exit 1', () => {
|
|
63
|
+
const {status, stdout, stderr} = run(['blog', '--json']);
|
|
64
|
+
expect(status).toBe(1);
|
|
65
|
+
expect(stderr).toBe('');
|
|
66
|
+
const envelope = JSON.parse(stdout);
|
|
67
|
+
expect(envelope).toMatchObject({apiVersion: 1, code: 'ERR_UNKNOWN'});
|
|
68
|
+
expect(envelope.error).toMatch(/blog.*simulated load failure/);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('reports the failure on stderr without --json, exit 1', () => {
|
|
72
|
+
const {status, stdout, stderr} = run(['blog']);
|
|
73
|
+
expect(status).toBe(1);
|
|
74
|
+
expect(stdout).toBe('');
|
|
75
|
+
expect(stderr).toMatch(/blog.*failed to load.*simulated load failure/s);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('leaves the other commands working', () => {
|
|
79
|
+
const {status, stdout} = run(['docs', '--json']);
|
|
80
|
+
expect(status).toBe(0);
|
|
81
|
+
expect(JSON.parse(stdout).type).toMatch(/^docs\./);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'command',
|
|
13
13
|
name: 'blog',
|
|
14
14
|
displayName: 'astryx blog',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/commands',
|
|
16
16
|
summary: 'Read the Astryx blog from the published feed',
|
|
17
17
|
description:
|
|
18
18
|
'Reads the design-system blog over its published RSS feed (never the source ' +
|
|
@@ -24,6 +24,18 @@ import {resultSet} from '../../../foundation/debug/index.mjs';
|
|
|
24
24
|
import {doc as blogCommand} from './blog.doc.mjs';
|
|
25
25
|
import {doc as blogFn} from '../../../api/blog/blog.doc.mjs';
|
|
26
26
|
|
|
27
|
+
/** Every field of a post in the JSON, in order; record() skips empty ones. */
|
|
28
|
+
const POST_FIELDS = [
|
|
29
|
+
'slug',
|
|
30
|
+
'title',
|
|
31
|
+
'description',
|
|
32
|
+
'date',
|
|
33
|
+
'type',
|
|
34
|
+
'authors',
|
|
35
|
+
'link',
|
|
36
|
+
'textUrl',
|
|
37
|
+
];
|
|
38
|
+
|
|
27
39
|
/**
|
|
28
40
|
* @param {import('commander').Command} program
|
|
29
41
|
*/
|
|
@@ -62,22 +74,25 @@ export function registerBlog(program) {
|
|
|
62
74
|
const {feedUrl, posts} = result.data;
|
|
63
75
|
if (posts.length === 0) {
|
|
64
76
|
emit(
|
|
65
|
-
section('Astryx blog'
|
|
77
|
+
section('Astryx blog'),
|
|
78
|
+
record({feedUrl}),
|
|
66
79
|
text('No posts found in the feed.'),
|
|
67
80
|
);
|
|
68
81
|
return answered;
|
|
69
82
|
}
|
|
70
|
-
// One record per post — fields mirror the JSON post shape; empty
|
|
71
|
-
// fields (type/textUrl) are skipped by record().
|
|
72
83
|
emit(
|
|
73
|
-
section('Astryx blog'
|
|
74
|
-
|
|
84
|
+
section('Astryx blog'),
|
|
85
|
+
record({feedUrl}),
|
|
86
|
+
records(posts, {fields: POST_FIELDS}),
|
|
75
87
|
text(`Read one: ${run} astryx blog <slug>`),
|
|
76
88
|
);
|
|
77
89
|
} else {
|
|
78
|
-
// blog.detail — the feed URL, then the
|
|
79
|
-
// (code() so article typography/spacing isn't ASCII-normalized).
|
|
80
|
-
emit(
|
|
90
|
+
// blog.detail — the post's fields and the feed URL, then the body
|
|
91
|
+
// verbatim (code() so article typography/spacing isn't ASCII-normalized).
|
|
92
|
+
emit(
|
|
93
|
+
record(result.data, {fields: [...POST_FIELDS, 'feedUrl']}),
|
|
94
|
+
code(result.data.text),
|
|
95
|
+
);
|
|
81
96
|
}
|
|
82
97
|
return answered;
|
|
83
98
|
},
|
|
@@ -19,7 +19,10 @@ const FEED = `<?xml version="1.0" encoding="UTF-8"?>
|
|
|
19
19
|
<item>
|
|
20
20
|
<title>How Astryx works</title>
|
|
21
21
|
<link>${SITE_URL}/blog/how-astryx-works</link>
|
|
22
|
+
<description>Under the hood & more</description>
|
|
22
23
|
<category>engineering</category>
|
|
24
|
+
<author>Ada</author>
|
|
25
|
+
<author>Grace</author>
|
|
23
26
|
<pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
|
|
24
27
|
<atom:link rel="alternate" type="text/plain" href="${SITE_URL}/blog/how-astryx-works.txt" />
|
|
25
28
|
</item>
|
|
@@ -39,6 +42,23 @@ function stubFetch(routes) {
|
|
|
39
42
|
});
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Every non-empty field prints as a `key: value` line under its JSON key.
|
|
47
|
+
* @param {string} stdout
|
|
48
|
+
* @param {Record<string, unknown>} fields
|
|
49
|
+
*/
|
|
50
|
+
function expectFields(stdout, fields) {
|
|
51
|
+
const lines = stdout.split('\n');
|
|
52
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
53
|
+
if (value == null || value === '' || (Array.isArray(value) && !value.length)) continue;
|
|
54
|
+
const shown = Array.isArray(value) ? value.join(', ') : String(value);
|
|
55
|
+
expect(
|
|
56
|
+
lines.some(line => line.startsWith(`${key}:`) && line.trimEnd().endsWith(shown)),
|
|
57
|
+
`${key}: ${shown}`,
|
|
58
|
+
).toBe(true);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
42
62
|
beforeEach(() => {
|
|
43
63
|
vi.stubGlobal(
|
|
44
64
|
'fetch',
|
|
@@ -83,10 +103,31 @@ describe('blog CLI — json-enabled', () => {
|
|
|
83
103
|
const {status, stdout} = await runCli(['blog']);
|
|
84
104
|
expect(status).toBe(0);
|
|
85
105
|
expect(stdout).toMatch(/Astryx blog/);
|
|
86
|
-
expect(stdout).toMatch(
|
|
106
|
+
expect(stdout).toMatch(/^feedUrl:/m);
|
|
87
107
|
expect(stdout).toMatch(/how-astryx-works/);
|
|
88
108
|
});
|
|
89
109
|
|
|
110
|
+
it('the text list projects every JSON field under its JSON key', async () => {
|
|
111
|
+
const env = JSON.parse((await runCli(['blog', '--json'])).stdout);
|
|
112
|
+
const {status, stdout} = await runCli(['blog']);
|
|
113
|
+
expect(status).toBe(0);
|
|
114
|
+
expectFields(stdout, {feedUrl: env.data.feedUrl});
|
|
115
|
+
for (const post of env.data.posts) expectFields(stdout, post);
|
|
116
|
+
expect(stdout).not.toMatch(/^feed:/m);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('the text detail projects every JSON field, then the post body', async () => {
|
|
120
|
+
const env = JSON.parse(
|
|
121
|
+
(await runCli(['blog', 'how-astryx-works', '--json'])).stdout,
|
|
122
|
+
);
|
|
123
|
+
const {status, stdout} = await runCli(['blog', 'how-astryx-works']);
|
|
124
|
+
expect(status).toBe(0);
|
|
125
|
+
const {text, ...fields} = env.data;
|
|
126
|
+
expectFields(stdout, fields);
|
|
127
|
+
expect(stdout).toContain(text);
|
|
128
|
+
expect(stdout).not.toMatch(/^feed:/m);
|
|
129
|
+
});
|
|
130
|
+
|
|
90
131
|
it('surfaces the API error code and exits non-zero for an unknown slug (--json)', async () => {
|
|
91
132
|
const {status, stdout} = await runCli(['blog', 'no-such-post', '--json']);
|
|
92
133
|
expect(status).not.toBe(0);
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file Ensures `astryx theme build` preserves AST-012 adaptation semantics.
|
|
5
5
|
* Runtime and static output share core's compiler; this suite guards the CLI
|
|
6
|
-
* loading, diagnostics, serialization, and extension boundaries around it
|
|
6
|
+
* loading, diagnostics, serialization, and extension boundaries around it,
|
|
7
|
+
* including root component overrides underneath adapted typography scales.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
import {afterEach, beforeAll, beforeEach, describe, expect, it} from 'vitest';
|
|
@@ -94,6 +95,104 @@ describe('theme build adaptations', () => {
|
|
|
94
95
|
);
|
|
95
96
|
});
|
|
96
97
|
|
|
98
|
+
it.each([
|
|
99
|
+
['defined', writeTheme],
|
|
100
|
+
['plain', writePlainTheme],
|
|
101
|
+
])(
|
|
102
|
+
'preserves component pins in %s themes and built extensions',
|
|
103
|
+
async (_kind, write) => {
|
|
104
|
+
const {defineTheme, generateAdaptationCSS, generateThemeCSS} =
|
|
105
|
+
await import('@astryxdesign/core/theme');
|
|
106
|
+
const project = path.join(tmpDir, 'project');
|
|
107
|
+
const themesDir = path.join(project, 'themes');
|
|
108
|
+
const displayFamily =
|
|
109
|
+
'Sarina, "Brush Script MT", "Snell Roundhand", cursive';
|
|
110
|
+
const input = {
|
|
111
|
+
name: 'adaptive-display',
|
|
112
|
+
typography: {
|
|
113
|
+
scale: {base: 16, ratio: 1.25},
|
|
114
|
+
body: {family: 'Outfit', fallbacks: 'sans-serif'},
|
|
115
|
+
},
|
|
116
|
+
components: {
|
|
117
|
+
text: Object.fromEntries(
|
|
118
|
+
['display-1', 'display-2', 'display-3'].map(type => [
|
|
119
|
+
`type:${type}`,
|
|
120
|
+
{fontFamily: displayFamily},
|
|
121
|
+
]),
|
|
122
|
+
),
|
|
123
|
+
button: {base: {borderRadius: '12px'}},
|
|
124
|
+
},
|
|
125
|
+
adaptations: {
|
|
126
|
+
rules: [
|
|
127
|
+
{
|
|
128
|
+
when: {width: {below: 'md'}, pointer: 'coarse'},
|
|
129
|
+
value: {typography: {scale: {base: 14, ratio: 1.2}}},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
when: {contrast: 'more'},
|
|
133
|
+
value: {
|
|
134
|
+
typography: {scale: {base: 15}},
|
|
135
|
+
components: {
|
|
136
|
+
text: {'type:display-1': {fontFamily: 'monospace'}},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
const themeFile = write(themesDir, input.name, JSON.stringify(input));
|
|
144
|
+
const result = await build(project, themeFile);
|
|
145
|
+
expect(result.code, result.stderr).toBe(0);
|
|
146
|
+
const css = fs.readFileSync(
|
|
147
|
+
path.join(themesDir, 'adaptive-display.css'),
|
|
148
|
+
'utf8',
|
|
149
|
+
);
|
|
150
|
+
const compact = value => value.replace(/\s+/g, ' ').trim();
|
|
151
|
+
const source = defineTheme(input);
|
|
152
|
+
const runtime = generateThemeCSS(source);
|
|
153
|
+
// The CLI wraps root, adaptation, and surface CSS in separate @layer
|
|
154
|
+
// blocks; their contents and order must still match runtime output.
|
|
155
|
+
const adaptationCSS = generateAdaptationCSS(source).component;
|
|
156
|
+
const [rootCSS, surfaceCSS] = runtime.component.split(adaptationCSS);
|
|
157
|
+
const blocks = [rootCSS, adaptationCSS, surfaceCSS].map(compact);
|
|
158
|
+
let previousIndex = -1;
|
|
159
|
+
for (const block of blocks) {
|
|
160
|
+
expect(compact(css)).toContain(block);
|
|
161
|
+
const index = compact(css).indexOf(block);
|
|
162
|
+
expect(index).toBeGreaterThan(previousIndex);
|
|
163
|
+
previousIndex = index;
|
|
164
|
+
}
|
|
165
|
+
expect(compact(css)).toContain(compact(runtime.prose));
|
|
166
|
+
const scaleBlock = css.slice(
|
|
167
|
+
css.indexOf('@media (width < 768px) and (pointer: coarse)'),
|
|
168
|
+
css.indexOf('@media (prefers-contrast: more)'),
|
|
169
|
+
);
|
|
170
|
+
expect(scaleBlock).toContain('--font-size-base: 0.875rem');
|
|
171
|
+
expect(scaleBlock).not.toContain('.astryx-text');
|
|
172
|
+
expect(scaleBlock).not.toContain('.astryx-heading');
|
|
173
|
+
expect(scaleBlock).not.toContain('.astryx-button');
|
|
174
|
+
expect(css).toContain(`font-family: ${displayFamily};`);
|
|
175
|
+
expect(css).toContain('font-family: monospace;');
|
|
176
|
+
|
|
177
|
+
const {adaptiveDisplayTheme: builtTheme} = await import(
|
|
178
|
+
pathToFileURL(path.join(themesDir, 'adaptive-display.js')).href
|
|
179
|
+
);
|
|
180
|
+
expect(builtTheme.__adaptationRules).toBeUndefined();
|
|
181
|
+
expect(generateThemeCSS(builtTheme)).toEqual(runtime);
|
|
182
|
+
const childInput = {
|
|
183
|
+
name: 'display-child',
|
|
184
|
+
components: {text: {'type:display-2': {fontFamily: 'serif'}}},
|
|
185
|
+
};
|
|
186
|
+
const fromSource = defineTheme({...childInput, extends: source});
|
|
187
|
+
const fromBuilt = defineTheme({...childInput, extends: builtTheme});
|
|
188
|
+
expect(generateThemeCSS(fromBuilt)).toEqual(generateThemeCSS(fromSource));
|
|
189
|
+
expect(fromBuilt.__adaptationRules[0].components).toBeUndefined();
|
|
190
|
+
expect(fromBuilt.components.text['type:display-2'].fontFamily).toBe(
|
|
191
|
+
'serif',
|
|
192
|
+
);
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
|
|
97
196
|
it('resolves a plain object whose only input-only field is adaptations', async () => {
|
|
98
197
|
const project = path.join(tmpDir, 'project');
|
|
99
198
|
const themesDir = path.join(project, 'themes');
|