@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +194 -0
- package/README.md +117 -78
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +164 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +548 -1
- package/api/doctor/doctor.test.mjs +610 -1
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.mjs +83 -7
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +27 -11
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +10 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +29 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +5 -4
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +48 -6
- package/authoring/doctypes/reference/type.ts +70 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +193 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +719 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -30
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +37 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +774 -83
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +598 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +41 -21
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as os from 'node:os';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import manifest from '../index.mjs';
|
|
8
|
+
import migrate from '../migrate-theme-catalog-to-descriptors.mjs';
|
|
9
|
+
import {runCodemods} from '../../../runner.mjs';
|
|
10
|
+
import {discoverThemeDirectory} from '../../../../../foundation/discovery/theme-discovery.mjs';
|
|
11
|
+
|
|
12
|
+
let root;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-theme-catalog-'));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
fs.rmSync(root, {recursive: true, force: true});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/** A catalog entry exactly as `astryx integration add theme <slug>` wrote it in 0.6. */
|
|
23
|
+
function entry(slug, overrides = {}) {
|
|
24
|
+
const identifier = slug.replace(/-([a-z0-9])/gu, (_, c) => c.toUpperCase());
|
|
25
|
+
const displayName = slug
|
|
26
|
+
.split('-')
|
|
27
|
+
.map(part => part[0].toUpperCase() + part.slice(1))
|
|
28
|
+
.join(' ');
|
|
29
|
+
return {
|
|
30
|
+
slug,
|
|
31
|
+
displayName,
|
|
32
|
+
description: `${displayName} theme.`,
|
|
33
|
+
maintained: true,
|
|
34
|
+
entry: `${identifier}Theme.ts`,
|
|
35
|
+
exportName: `${identifier}Theme`,
|
|
36
|
+
files: [`${identifier}Theme.ts`],
|
|
37
|
+
...overrides,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** @param {ReturnType<typeof entry>[]} themes */
|
|
42
|
+
function writeKit(themes, {sources = true} = {}) {
|
|
43
|
+
fs.writeFileSync(
|
|
44
|
+
path.join(root, 'package.json'),
|
|
45
|
+
'{"name":"@acme/kit","version":"1.0.0"}\n',
|
|
46
|
+
);
|
|
47
|
+
fs.writeFileSync(
|
|
48
|
+
path.join(root, 'astryx.integration.mjs'),
|
|
49
|
+
"export default {themes: './themes'};\n",
|
|
50
|
+
);
|
|
51
|
+
for (const theme of themes) {
|
|
52
|
+
const source = path.join(root, 'themes', theme.slug, theme.entry);
|
|
53
|
+
fs.mkdirSync(path.dirname(source), {recursive: true});
|
|
54
|
+
if (sources) {
|
|
55
|
+
fs.writeFileSync(
|
|
56
|
+
source,
|
|
57
|
+
`import {defineTheme} from '@astryxdesign/core/theme';\n\nexport const ${theme.exportName} = defineTheme({\n name: '${theme.slug}',\n});\n`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
fs.mkdirSync(path.join(root, 'themes'), {recursive: true});
|
|
62
|
+
fs.writeFileSync(
|
|
63
|
+
path.join(root, 'themes', 'manifest.json'),
|
|
64
|
+
`${JSON.stringify({version: 1, themes}, null, 2)}\n`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const catalog = () => path.join(root, 'themes', 'manifest.json');
|
|
69
|
+
|
|
70
|
+
/** @param {boolean} apply @param {string} [srcPath] */
|
|
71
|
+
const run = (apply, srcPath = root) =>
|
|
72
|
+
runCodemods([{version: 'next', transforms: manifest}], {
|
|
73
|
+
apply,
|
|
74
|
+
path: srcPath,
|
|
75
|
+
codemod: undefined,
|
|
76
|
+
silent: true,
|
|
77
|
+
root,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('migrate-theme-catalog-to-descriptors', () => {
|
|
81
|
+
it('is staged for the next release as a project codemod', () => {
|
|
82
|
+
expect(manifest.map(t => [t.name, t.meta.codemodType])).toEqual([
|
|
83
|
+
['migrate-theme-catalog-to-descriptors', 'project'],
|
|
84
|
+
['migrate-native-picker-to-presentation', undefined],
|
|
85
|
+
]);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('writes one typed descriptor per catalog theme and removes the catalog', async () => {
|
|
89
|
+
writeKit([
|
|
90
|
+
entry('ocean'),
|
|
91
|
+
entry('deep-sea', {
|
|
92
|
+
displayName: "Deep 'Sea'",
|
|
93
|
+
description: 'Line one\nline two \\ done.',
|
|
94
|
+
maintained: false,
|
|
95
|
+
}),
|
|
96
|
+
]);
|
|
97
|
+
|
|
98
|
+
const result = await run(true);
|
|
99
|
+
|
|
100
|
+
expect(result).toMatchObject({errors: [], totalFilesChanged: 3});
|
|
101
|
+
expect(fs.existsSync(catalog())).toBe(false);
|
|
102
|
+
expect(
|
|
103
|
+
fs.readFileSync(
|
|
104
|
+
path.join(root, 'themes/ocean/oceanTheme.doc.mjs'),
|
|
105
|
+
'utf-8',
|
|
106
|
+
),
|
|
107
|
+
).toBe(
|
|
108
|
+
"/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */\nexport default {\n type: 'theme',\n name: 'ocean',\n displayName: 'Ocean',\n description: 'Ocean theme.',\n maintained: true,\n};\n",
|
|
109
|
+
);
|
|
110
|
+
const themes = discoverThemeDirectory(
|
|
111
|
+
path.join(root, 'themes'),
|
|
112
|
+
'@acme/kit',
|
|
113
|
+
);
|
|
114
|
+
expect(
|
|
115
|
+
themes.map(({slug, displayName, description, maintained}) => ({
|
|
116
|
+
slug,
|
|
117
|
+
displayName,
|
|
118
|
+
description,
|
|
119
|
+
maintained,
|
|
120
|
+
})),
|
|
121
|
+
).toEqual([
|
|
122
|
+
{
|
|
123
|
+
slug: 'deep-sea',
|
|
124
|
+
displayName: "Deep 'Sea'",
|
|
125
|
+
description: 'Line one\nline two \\ done.',
|
|
126
|
+
maintained: false,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
slug: 'ocean',
|
|
130
|
+
displayName: 'Ocean',
|
|
131
|
+
description: 'Ocean theme.',
|
|
132
|
+
maintained: true,
|
|
133
|
+
},
|
|
134
|
+
]);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('previews without writing, even with no source folder', async () => {
|
|
138
|
+
writeKit([entry('ocean')]);
|
|
139
|
+
// A staged code codemod (migrate-native-picker-to-presentation) requires
|
|
140
|
+
// the source folder to exist; an empty one exercises the same preview.
|
|
141
|
+
fs.mkdirSync(path.join(root, 'src'), {recursive: true});
|
|
142
|
+
|
|
143
|
+
const result = await run(false, path.join(root, 'src'));
|
|
144
|
+
|
|
145
|
+
expect(result).toMatchObject({
|
|
146
|
+
errors: [],
|
|
147
|
+
totalFilesChanged: 2,
|
|
148
|
+
writtenFiles: [],
|
|
149
|
+
});
|
|
150
|
+
expect(fs.existsSync(catalog())).toBe(true);
|
|
151
|
+
expect(
|
|
152
|
+
fs.existsSync(path.join(root, 'themes/ocean/oceanTheme.doc.mjs')),
|
|
153
|
+
).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('keeps a descriptor that already exists and still removes the catalog', async () => {
|
|
157
|
+
writeKit([entry('ocean'), entry('reef')]);
|
|
158
|
+
const kept = path.join(root, 'themes/ocean/oceanTheme.doc.mjs');
|
|
159
|
+
fs.writeFileSync(
|
|
160
|
+
kept,
|
|
161
|
+
"export default {type: 'theme', name: 'ocean', displayName: 'Mine', description: '', maintained: true};\n",
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const result = await run(true);
|
|
165
|
+
|
|
166
|
+
expect(result.errors).toEqual([]);
|
|
167
|
+
expect(fs.readFileSync(kept, 'utf-8')).toContain("displayName: 'Mine'");
|
|
168
|
+
expect(
|
|
169
|
+
fs.existsSync(path.join(root, 'themes/reef/reefTheme.doc.mjs')),
|
|
170
|
+
).toBe(true);
|
|
171
|
+
expect(fs.existsSync(catalog())).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('changes nothing and names each entry that cannot convert', async () => {
|
|
175
|
+
writeKit([
|
|
176
|
+
entry('ocean'),
|
|
177
|
+
entry('sea', {exportName: 'oceanBlue'}),
|
|
178
|
+
entry('nested', {
|
|
179
|
+
entry: 'src/nestedTheme.ts',
|
|
180
|
+
files: ['src/nestedTheme.ts'],
|
|
181
|
+
}),
|
|
182
|
+
]);
|
|
183
|
+
fs.rmSync(path.join(root, 'themes/ocean/oceanTheme.ts'));
|
|
184
|
+
const before = fs.readFileSync(catalog(), 'utf-8');
|
|
185
|
+
|
|
186
|
+
const result = await run(true);
|
|
187
|
+
|
|
188
|
+
expect(result.errors.map(e => [e.file, e.error])).toEqual([
|
|
189
|
+
['themes/ocean', 'holds no oceanTheme.ts for theme "ocean".'],
|
|
190
|
+
[
|
|
191
|
+
'themes/manifest.json',
|
|
192
|
+
'theme "sea" exports "oceanBlue" from seaTheme.ts; a descriptor takes the export name from the file name, so rename the export or the file to match.',
|
|
193
|
+
],
|
|
194
|
+
[
|
|
195
|
+
'themes/manifest.json',
|
|
196
|
+
'theme "nested" has entry "src/nestedTheme.ts"; a descriptor sits beside a .ts, .tsx, .mjs, or .js source directly in themes/nested/.',
|
|
197
|
+
],
|
|
198
|
+
]);
|
|
199
|
+
expect(fs.readFileSync(catalog(), 'utf-8')).toBe(before);
|
|
200
|
+
expect(fs.existsSync(path.join(root, 'themes/sea/seaTheme.doc.mjs'))).toBe(
|
|
201
|
+
false,
|
|
202
|
+
);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('leaves a package with no catalog to convert alone', async () => {
|
|
206
|
+
const empty = {writes: [], deletes: [], problems: []};
|
|
207
|
+
await expect(migrate(root)).resolves.toEqual(empty);
|
|
208
|
+
fs.writeFileSync(
|
|
209
|
+
path.join(root, 'astryx.integration.mjs'),
|
|
210
|
+
'export default {};\n',
|
|
211
|
+
);
|
|
212
|
+
await expect(migrate(root)).resolves.toEqual(empty);
|
|
213
|
+
fs.writeFileSync(
|
|
214
|
+
path.join(root, 'astryx.integration.mjs'),
|
|
215
|
+
"export default {themes: './themes'};\n",
|
|
216
|
+
);
|
|
217
|
+
fs.mkdirSync(path.join(root, 'themes'));
|
|
218
|
+
await expect(migrate(root)).resolves.toEqual(empty);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file next transform manifest
|
|
5
|
+
*
|
|
6
|
+
* Staged codemods for the next release. The Version Packages PR promotes
|
|
7
|
+
* this file into the resolved version folder.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import migrateThemeCatalogToDescriptors, {
|
|
11
|
+
meta as migrateThemeCatalogToDescriptorsMeta,
|
|
12
|
+
} from './migrate-theme-catalog-to-descriptors.mjs';
|
|
13
|
+
import migrateNativePickerToPresentation, {
|
|
14
|
+
meta as migrateNativePickerToPresentationMeta,
|
|
15
|
+
} from './migrate-native-picker-to-presentation.mjs';
|
|
16
|
+
|
|
17
|
+
export default [
|
|
18
|
+
{
|
|
19
|
+
name: 'migrate-theme-catalog-to-descriptors',
|
|
20
|
+
transform:
|
|
21
|
+
/** @type {import('../../../../authoring/codemod/type').CodemodTransform} */ (
|
|
22
|
+
/** @type {unknown} */ (migrateThemeCatalogToDescriptors)
|
|
23
|
+
),
|
|
24
|
+
meta: migrateThemeCatalogToDescriptorsMeta,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'migrate-native-picker-to-presentation',
|
|
28
|
+
transform: migrateNativePickerToPresentation,
|
|
29
|
+
meta: migrateNativePickerToPresentationMeta,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Codemod: migrate nativePicker to presentation on date/time inputs
|
|
5
|
+
*
|
|
6
|
+
* `spec:AST-043` FR3 mapping, applied only to static literals written
|
|
7
|
+
* directly on imported `DateInput`, `DateTimeInput`, and `TimeInput`
|
|
8
|
+
* elements: the prop is renamed to `presentation` and its value mapped.
|
|
9
|
+
* When the element already sets `presentation`, the deprecated prop is
|
|
10
|
+
* removed (presentation wins, FR4). Dynamic values are left unchanged —
|
|
11
|
+
* the deprecated prop keeps working, so an unmigrated callsite is still
|
|
12
|
+
* correct, and guessing at an expression's values would not be.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {transformProp} from '../../transform-prop.mjs';
|
|
16
|
+
|
|
17
|
+
export const meta = {
|
|
18
|
+
title: 'Migrate nativePicker to presentation',
|
|
19
|
+
description:
|
|
20
|
+
'Renames `nativePicker` to `presentation` on DateInput, DateTimeInput, ' +
|
|
21
|
+
'and TimeInput, mapping touch→adaptive-native, always→native, and ' +
|
|
22
|
+
'never→adaptive-bottom-sheet (text-input for TimeInput). Dynamic ' +
|
|
23
|
+
'values are left for manual migration; the deprecated prop still works.',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const CORE_IMPORT_RE = /^@(astryxdesign|xds)\/core(?:\/|$)/;
|
|
27
|
+
|
|
28
|
+
const COMPONENT_PROPS = new Map([
|
|
29
|
+
['DateInput', new Set(['nativePicker'])],
|
|
30
|
+
['DateTimeInput', new Set(['nativePicker'])],
|
|
31
|
+
['TimeInput', new Set(['nativePicker'])],
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
/** @param {string} component @param {string} value */
|
|
35
|
+
function mapValue(component, value) {
|
|
36
|
+
switch (value) {
|
|
37
|
+
case 'touch':
|
|
38
|
+
return 'adaptive-native';
|
|
39
|
+
case 'always':
|
|
40
|
+
return 'native';
|
|
41
|
+
case 'never':
|
|
42
|
+
return component === 'TimeInput' ? 'text-input' : 'adaptive-bottom-sheet';
|
|
43
|
+
default:
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Collect the string-literal leaves of a value expression without mutating
|
|
50
|
+
* anything. Returns false for any dynamic or non-string node.
|
|
51
|
+
* @param {any} node
|
|
52
|
+
* @param {any[]} leaves
|
|
53
|
+
* @returns {boolean}
|
|
54
|
+
*/
|
|
55
|
+
function collectStaticLeaves(node, leaves) {
|
|
56
|
+
if (!node) return false;
|
|
57
|
+
if (
|
|
58
|
+
node.type === 'TSAsExpression' ||
|
|
59
|
+
node.type === 'TSSatisfiesExpression' ||
|
|
60
|
+
node.type === 'TypeCastExpression' ||
|
|
61
|
+
node.type === 'ParenthesizedExpression'
|
|
62
|
+
) {
|
|
63
|
+
return collectStaticLeaves(node.expression, leaves);
|
|
64
|
+
}
|
|
65
|
+
if (node.type === 'ConditionalExpression') {
|
|
66
|
+
return (
|
|
67
|
+
collectStaticLeaves(node.consequent, leaves) &&
|
|
68
|
+
collectStaticLeaves(node.alternate, leaves)
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
if (
|
|
72
|
+
(node.type !== 'StringLiteral' && node.type !== 'Literal') ||
|
|
73
|
+
typeof node.value !== 'string'
|
|
74
|
+
) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
leaves.push(node);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Map every leaf, or none of them: a mixed static/dynamic conditional must
|
|
83
|
+
* stay byte-identical, never half-migrated.
|
|
84
|
+
* @param {any} node
|
|
85
|
+
* @param {string} component
|
|
86
|
+
*/
|
|
87
|
+
function mapStaticValue(node, component) {
|
|
88
|
+
/** @type {any[]} */
|
|
89
|
+
const leaves = [];
|
|
90
|
+
if (!collectStaticLeaves(node, leaves)) return false;
|
|
91
|
+
if (leaves.some(leaf => mapValue(component, leaf.value) === undefined)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
for (const leaf of leaves) {
|
|
95
|
+
leaf.value = mapValue(component, leaf.value);
|
|
96
|
+
if (leaf.raw) leaf.raw = undefined;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @param {import('../../../../authoring/codemod/type').AstryxCodemodFile} file
|
|
103
|
+
* @param {import('../../../../authoring/codemod/type').CodemodTransformApi} api
|
|
104
|
+
* @returns {string | null | undefined}
|
|
105
|
+
*/
|
|
106
|
+
export default function transformer(file, api) {
|
|
107
|
+
if (!file.source.includes('nativePicker')) return undefined;
|
|
108
|
+
const j = api.jscodeshift;
|
|
109
|
+
const root = j(file.source);
|
|
110
|
+
let hasChanges = false;
|
|
111
|
+
|
|
112
|
+
transformProp(
|
|
113
|
+
root,
|
|
114
|
+
j,
|
|
115
|
+
{
|
|
116
|
+
matchesImport: source => CORE_IMPORT_RE.test(source),
|
|
117
|
+
components: COMPONENT_PROPS,
|
|
118
|
+
},
|
|
119
|
+
(propPath, {component}) => {
|
|
120
|
+
const opening = propPath.parent?.node;
|
|
121
|
+
const attributes = opening?.attributes ?? [];
|
|
122
|
+
const hasPresentation = attributes.some(
|
|
123
|
+
(/** @type {any} */ attribute) =>
|
|
124
|
+
attribute.type === 'JSXAttribute' &&
|
|
125
|
+
attribute.name?.name === 'presentation',
|
|
126
|
+
);
|
|
127
|
+
const prop = propPath.node;
|
|
128
|
+
if (hasPresentation) {
|
|
129
|
+
// FR4: presentation wins; drop the deprecated prop.
|
|
130
|
+
opening.attributes = attributes.filter(
|
|
131
|
+
(/** @type {any} */ attribute) => attribute !== prop,
|
|
132
|
+
);
|
|
133
|
+
hasChanges = true;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const value =
|
|
137
|
+
prop.value?.type === 'JSXExpressionContainer'
|
|
138
|
+
? prop.value.expression
|
|
139
|
+
: prop.value;
|
|
140
|
+
if (!mapStaticValue(value, component)) return;
|
|
141
|
+
prop.name.name = 'presentation';
|
|
142
|
+
hasChanges = true;
|
|
143
|
+
},
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
if (!hasChanges) return undefined;
|
|
147
|
+
return root.toSource({quote: 'single'});
|
|
148
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Give each integration theme a typed descriptor instead of the
|
|
5
|
+
* `manifest.json` theme catalog.
|
|
6
|
+
*
|
|
7
|
+
* Astryx 0.6 scaffolded integration themes into one catalog,
|
|
8
|
+
* `<themes root>/manifest.json`. Each theme now carries a strongly typed
|
|
9
|
+
* same-stem `.doc.mjs` descriptor, and a themes root that still holds the
|
|
10
|
+
* catalog is refused. This project codemod reads the package's integration
|
|
11
|
+
* manifest, plans one descriptor per catalog entry beside that theme's source,
|
|
12
|
+
* and removes the catalog. When any entry cannot convert, it plans nothing and
|
|
13
|
+
* names the entry, so the package is never left half converted.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
import {loadManifestObject} from '../../../../foundation/integrations/integrations.mjs';
|
|
19
|
+
import {findLocalIntegrationManifestOrNull} from '../../../../foundation/integrations/manifest-writer.mjs';
|
|
20
|
+
import {themeDescriptorSource} from '../../../../foundation/integrations/theme-descriptor.mjs';
|
|
21
|
+
|
|
22
|
+
export const meta = {
|
|
23
|
+
title:
|
|
24
|
+
'Give each integration theme a typed descriptor instead of the manifest.json catalog',
|
|
25
|
+
description:
|
|
26
|
+
'Writes <name>Theme.doc.mjs beside each theme the catalog lists, then removes the catalog.',
|
|
27
|
+
codemodType: 'project',
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const SLUG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
|
|
31
|
+
const SOURCE = /\.(?:ts|tsx|mjs|js)$/u;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {string} root the package directory
|
|
35
|
+
* @returns {Promise<import('../../runner.mjs').ProjectCodemodPlan>}
|
|
36
|
+
*/
|
|
37
|
+
export default async function migrateThemeCatalogToDescriptors(root) {
|
|
38
|
+
/** @type {import('../../runner.mjs').ProjectCodemodPlan} */
|
|
39
|
+
const plan = {writes: [], deletes: [], problems: []};
|
|
40
|
+
/** @param {string} file @returns {string} */
|
|
41
|
+
const rel = file => path.relative(root, file).split(path.sep).join('/');
|
|
42
|
+
/** @param {string} file @param {string} message */
|
|
43
|
+
const problem = (file, message) => plan.problems.push({file, message});
|
|
44
|
+
|
|
45
|
+
const manifestFile = findLocalIntegrationManifestOrNull(root);
|
|
46
|
+
if (!manifestFile) return plan;
|
|
47
|
+
const manifest = await loadManifestObject(
|
|
48
|
+
manifestFile,
|
|
49
|
+
`Integration manifest ${path.basename(manifestFile)}`,
|
|
50
|
+
{fresh: true},
|
|
51
|
+
);
|
|
52
|
+
if (typeof manifest.themes !== 'string') return plan;
|
|
53
|
+
const themesRoot = path.resolve(root, manifest.themes);
|
|
54
|
+
const fromRoot = path.relative(root, themesRoot);
|
|
55
|
+
if (fromRoot.startsWith('..') || path.isAbsolute(fromRoot)) return plan;
|
|
56
|
+
const catalogFile = path.join(themesRoot, 'manifest.json');
|
|
57
|
+
if (!fs.existsSync(catalogFile)) return plan;
|
|
58
|
+
const catalogPath = rel(catalogFile);
|
|
59
|
+
|
|
60
|
+
let catalog;
|
|
61
|
+
try {
|
|
62
|
+
catalog = JSON.parse(fs.readFileSync(catalogFile, 'utf-8'));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
65
|
+
problem(catalogPath, `is not valid JSON (${reason}).`);
|
|
66
|
+
return plan;
|
|
67
|
+
}
|
|
68
|
+
if (
|
|
69
|
+
!catalog ||
|
|
70
|
+
typeof catalog !== 'object' ||
|
|
71
|
+
catalog.version !== 1 ||
|
|
72
|
+
!Array.isArray(catalog.themes)
|
|
73
|
+
) {
|
|
74
|
+
problem(catalogPath, 'is not a version 1 theme catalog.');
|
|
75
|
+
return plan;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
for (const [index, entry] of catalog.themes.entries()) {
|
|
79
|
+
const slug = entry?.slug;
|
|
80
|
+
if (typeof slug !== 'string' || !SLUG.test(slug)) {
|
|
81
|
+
problem(
|
|
82
|
+
catalogPath,
|
|
83
|
+
`themes[${index}] has no lowercase kebab-case slug; fix the entry or add that theme's descriptor by hand.`,
|
|
84
|
+
);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const themeDir = path.join(themesRoot, slug);
|
|
88
|
+
const source = entry.entry;
|
|
89
|
+
if (
|
|
90
|
+
typeof source !== 'string' ||
|
|
91
|
+
!SOURCE.test(source) ||
|
|
92
|
+
source !== path.basename(source)
|
|
93
|
+
) {
|
|
94
|
+
problem(
|
|
95
|
+
catalogPath,
|
|
96
|
+
`theme "${slug}" has entry ${JSON.stringify(source)}; a descriptor sits beside a .ts, .tsx, .mjs, or .js source directly in ${rel(themeDir)}/.`,
|
|
97
|
+
);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const stem = source.replace(SOURCE, '');
|
|
101
|
+
if (entry.exportName !== stem) {
|
|
102
|
+
problem(
|
|
103
|
+
catalogPath,
|
|
104
|
+
`theme "${slug}" exports ${JSON.stringify(entry.exportName)} from ${source}; a descriptor takes the export name from the file name, so rename the export or the file to match.`,
|
|
105
|
+
);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (typeof entry.displayName !== 'string' || !entry.displayName.trim()) {
|
|
109
|
+
problem(catalogPath, `theme "${slug}" has no displayName.`);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (typeof entry.description !== 'string') {
|
|
113
|
+
problem(catalogPath, `theme "${slug}" has no description string.`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (typeof entry.maintained !== 'boolean') {
|
|
117
|
+
problem(catalogPath, `theme "${slug}" has no maintained flag.`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (!fs.existsSync(path.join(themeDir, source))) {
|
|
121
|
+
problem(rel(themeDir), `holds no ${source} for theme "${slug}".`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const descriptor = path.join(themeDir, `${stem}.doc.mjs`);
|
|
125
|
+
if (fs.existsSync(descriptor)) continue;
|
|
126
|
+
plan.writes.push({
|
|
127
|
+
path: descriptor,
|
|
128
|
+
contents: themeDescriptorSource({
|
|
129
|
+
type: 'theme',
|
|
130
|
+
name: slug,
|
|
131
|
+
displayName: entry.displayName,
|
|
132
|
+
description: entry.description,
|
|
133
|
+
maintained: entry.maintained,
|
|
134
|
+
}),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (plan.problems.length > 0)
|
|
138
|
+
return {writes: [], deletes: [], problems: plan.problems};
|
|
139
|
+
plan.deletes.push(catalogFile);
|
|
140
|
+
return plan;
|
|
141
|
+
}
|
package/assets/docs/README.md
CHANGED
|
@@ -48,3 +48,12 @@ The material is usually good; the finding is placement, not quality. It goes in
|
|
|
48
48
|
**Fits no row?** It is still not caller-facing. Default it to [Contributing](https://github.com/facebook/astryx/wiki/Contributing), or `CONTRIBUTING.md` when it is a step someone follows with the repo cloned. Never default it back to this directory.
|
|
49
49
|
|
|
50
50
|
Worked example: a responsive-and-interaction readiness rubric is grading criteria → **Component-Audit-Rubric**, or **Component-Lifecycle** if it is a promotion gate.
|
|
51
|
+
|
|
52
|
+
## Sections are read one at a time
|
|
53
|
+
|
|
54
|
+
`astryx docs <topic> --index` lists a topic's sections, and readers then open
|
|
55
|
+
one section by its key. A section's key is its `id`, or a key derived from its
|
|
56
|
+
title when it has none. Give a section an `id` when its title may change, since
|
|
57
|
+
readers and extensions link to the key. Two sections in one topic cannot share
|
|
58
|
+
a key. Keep each section small enough to read on its own: `astryx doctor` fails
|
|
59
|
+
any section over 32 KB.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `astryx docs authoring`: every authoring schema, one section each.
|
|
5
|
+
*
|
|
6
|
+
* Built from the self-docs colocated under packages/cli/authoring, so it cannot
|
|
7
|
+
* drift from the schemas it describes. `astryx doctor` names a self-doc this
|
|
8
|
+
* topic cannot reach.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {buildAuthoringTopic} from '../../foundation/discovery/authoring-self-docs.mjs';
|
|
12
|
+
|
|
13
|
+
/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
|
|
14
|
+
export const docs = await buildAuthoringTopic();
|
|
@@ -98,11 +98,11 @@ export const docs = {
|
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
type: 'prose',
|
|
101
|
-
text: 'These stylesheets are cascade-layered: the reset loads in @layer reset and component styles in @layer astryx-base. If your project has existing global CSS, a legacy reset, or Tailwind, declare the layer order explicitly and assign every stylesheet to a layer deliberately: unlayered styles and later layers both override astryx-base regardless of specificity. See the Cascade Layer Safety section in
|
|
101
|
+
text: 'These stylesheets are cascade-layered: the reset loads in @layer reset and component styles in @layer astryx-base. If your project has existing global CSS, a legacy reset, or Tailwind, declare the layer order explicitly and assign every stylesheet to a layer deliberately: unlayered styles and later layers both override astryx-base regardless of specificity. See the Cascade Layer Safety section in {@link generic:migration} before building screens.',
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
type: 'prose',
|
|
105
|
-
text: 'Run
|
|
105
|
+
text: 'Run {@link generic:theme} for the full theming guide.',
|
|
106
106
|
},
|
|
107
107
|
],
|
|
108
108
|
},
|
|
@@ -41,15 +41,17 @@ function App() {
|
|
|
41
41
|
lang: 'tsx',
|
|
42
42
|
label: 'Load an astryx locale catalog',
|
|
43
43
|
code: `import {InternationalizationProvider} from '@astryxdesign/core/i18n';
|
|
44
|
-
import
|
|
44
|
+
import frFR from '@astryxdesign/core/locales/fr-FR.generated.js';
|
|
45
45
|
|
|
46
|
-
<InternationalizationProvider
|
|
46
|
+
<InternationalizationProvider
|
|
47
|
+
locale="fr-FR"
|
|
48
|
+
messages={{'fr-FR': frFR}}>
|
|
47
49
|
<App />
|
|
48
50
|
</InternationalizationProvider>;`,
|
|
49
51
|
},
|
|
50
52
|
{
|
|
51
53
|
type: 'prose',
|
|
52
|
-
text: 'Astryx ships English
|
|
54
|
+
text: 'Astryx ships English and first-party translations for supported locales. Compact runtime modules from `@astryxdesign/core/locales/*.generated.js` contain only the messages apps need; the existing `@astryxdesign/core/locales/*.json` files retain translator context. Until a locale is available, apps can pass a local catalog in either shape. Missing keys fall back through the locale chain to English (for example, `pt-BR` walks to `pt`, then to shipped `en`).',
|
|
53
55
|
},
|
|
54
56
|
{
|
|
55
57
|
type: 'prose',
|
|
@@ -290,7 +292,7 @@ export default function App() {
|
|
|
290
292
|
},
|
|
291
293
|
{
|
|
292
294
|
type: 'prose',
|
|
293
|
-
text: '`Catalog` types
|
|
295
|
+
text: '`Catalog` types the rich `{defaultMessage, description?}` authoring shape. `RuntimeCatalog` types the generated key-to-message string map. `ProviderMessagesByLocale` accepts either shape for the provider, while `MessagesByLocale` keeps the original rich-only context shape.',
|
|
294
296
|
},
|
|
295
297
|
],
|
|
296
298
|
},
|
|
@@ -307,7 +309,7 @@ export default function App() {
|
|
|
307
309
|
lang: 'tsx',
|
|
308
310
|
label: 'Turn on pseudo-localization',
|
|
309
311
|
code: `import {InternationalizationProvider} from '@astryxdesign/core/i18n';
|
|
310
|
-
import pseudo from '@astryxdesign/core/locales/pseudo.
|
|
312
|
+
import pseudo from '@astryxdesign/core/locales/pseudo.generated.js';
|
|
311
313
|
|
|
312
314
|
<InternationalizationProvider locale="pseudo" messages={{pseudo}}>
|
|
313
315
|
<App />
|
|
@@ -25,7 +25,7 @@ export const docsDense = {
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
type: 'prose',
|
|
28
|
-
text: 'decides layout, not component APIs. npx astryx build "<idea>" =
|
|
28
|
+
text: 'decides layout, not component APIs. npx astryx build "<idea>" = the template to start from for your app type. npx astryx component <Name> = props.',
|
|
29
29
|
},
|
|
30
30
|
],
|
|
31
31
|
},
|
|
@@ -71,7 +71,7 @@ export const docsDense = {
|
|
|
71
71
|
null,
|
|
72
72
|
{
|
|
73
73
|
type: 'prose',
|
|
74
|
-
text: 'verify: you can state the reason in one sentence, and it still holds if the nav doubles. npx astryx build "<idea>" names the
|
|
74
|
+
text: 'verify: you can state the reason in one sentence, and it still holds if the nav doubles. npx astryx build "<idea>" names the template to start from; scaffold it and the pairing is wired up.',
|
|
75
75
|
},
|
|
76
76
|
// Best practices
|
|
77
77
|
null,
|
|
@@ -106,7 +106,7 @@ export const docs = {
|
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
type: 'prose',
|
|
109
|
-
text: 'Verify: you can state the reason in one sentence, and the choice still holds if the nav doubles in size. `npx astryx build "<idea>"` names the
|
|
109
|
+
text: 'Verify: you can state the reason in one sentence, and the choice still holds if the nav doubles in size. `npx astryx build "<idea>"` names the template to start from; scaffold it and the pairing is already wired up.',
|
|
110
110
|
},
|
|
111
111
|
|
|
112
112
|
{type: 'heading', level: 3, text: 'Best practices'},
|