@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db52d98
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 +38 -15
- 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 +14 -7
- package/api/build/build.test.mjs +184 -6
- package/api/build/build.type.d.mts +57 -2
- package/api/build/build.type.mjs +30 -7
- package/api/build/help/help.d.mts +4 -0
- package/api/build/help/help.mjs +24 -11
- 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 +1 -0
- package/api/component/component.mjs +60 -12
- package/api/component/list/list.mjs +3 -2
- package/api/discover/discover.doc.mjs +1 -0
- package/api/docs/_adapter.d.mts +252 -34
- package/api/docs/_adapter.mjs +923 -132
- package/api/docs/detail/detail.mjs +11 -3
- package/api/docs/detail/section/section.mjs +24 -13
- package/api/docs/detail/section/section.test.mjs +15 -6
- 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 +181 -2
- package/api/docs/docs.type.mjs +117 -3
- package/api/docs/index/index.mjs +11 -3
- 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 +331 -16
- package/api/doctor/doctor.test.mjs +420 -7
- package/api/gap-report/gap-report.doc.mjs +1 -0
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- 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 +2 -1
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +114 -12
- package/api/integration/add-contribution.test.mjs +174 -3
- 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 +7 -0
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +1 -0
- 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 +34 -0
- package/api/integration/pack-check.test.mjs +138 -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 +50 -102
- package/api/integration/validate-integration.test.mjs +88 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +2 -1
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +1 -0
- package/api/layout/_adapter.mjs +20 -5
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +1 -0
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search.d.mts +59 -1
- package/api/search/search.doc.mjs +5 -3
- package/api/search/search.mjs +458 -77
- package/api/search/search.test.mjs +91 -2
- package/api/search/search.type.d.mts +13 -1
- package/api/search/search.type.mjs +4 -1
- package/api/swizzle/swizzle.doc.mjs +1 -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 +28 -7
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +6 -8
- package/api/template/template.type.mjs +3 -2
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +10 -17
- package/api/theme/add/add.test.mjs +14 -1
- 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/template/template.test.mjs +5 -0
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +1 -0
- 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 +2 -1
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +97 -69
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +356 -59
- package/api/upgrade/upgrade.doc.mjs +6 -1
- package/api/upgrade/upgrade.type.d.mts +34 -0
- package/api/upgrade/upgrade.type.mjs +15 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +8 -2
- package/assets/codemods/integration-discovery.test.mjs +15 -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/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/docs/getting-started.doc.mjs +2 -2
- 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 +3 -3
- 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} +66 -38
- 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 +3 -3
- 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/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -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/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/codemod/codemod.doc.mjs +1 -1
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +1 -1
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +3 -3
- package/authoring/doctypes/_schema.d.mts +119 -117
- package/authoring/doctypes/_schema.mjs +54 -3
- package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
- package/authoring/doctypes/base/type.ts +6 -5
- package/authoring/doctypes/command/command.doc.mjs +1 -1
- package/authoring/doctypes/command/type.ts +2 -2
- package/authoring/doctypes/component/type.ts +2 -2
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +1 -1
- package/authoring/doctypes/function/function.doc.mjs +3 -2
- package/authoring/doctypes/function/type.ts +3 -2
- package/authoring/doctypes/hook/type.ts +2 -2
- package/authoring/doctypes/load-contract.test.mjs +28 -2
- package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
- package/authoring/doctypes/namespace/parse.test.mjs +23 -25
- package/authoring/doctypes/namespace/type.ts +5 -2
- package/authoring/doctypes/parse.d.mts +4 -2
- package/authoring/doctypes/parse.mjs +10 -5
- package/authoring/doctypes/reference/reference.doc.mjs +35 -6
- package/authoring/doctypes/reference/type.ts +30 -13
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +1 -2
- package/authoring/doctypes/template/parse.d.mts +2 -0
- package/authoring/doctypes/template/parse.mjs +4 -0
- package/authoring/doctypes/template/parse.test.mjs +18 -0
- package/authoring/doctypes/template/template.doc.mjs +9 -3
- package/authoring/doctypes/template/type.ts +8 -0
- 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 +2 -1
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/identity/identity.doc.mjs +2 -2
- package/authoring/index.d.mts +1 -0
- package/authoring/index.d.ts +7 -4
- package/authoring/index.mjs +2 -1
- package/authoring/integration/integration.doc.mjs +2 -2
- package/authoring/integration/type.ts +4 -10
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.mjs +11 -45
- package/clients/cli/commands/build.doc.mjs +12 -7
- package/clients/cli/commands/build.mjs +105 -67
- package/clients/cli/commands/build.text-fields.test.mjs +41 -0
- package/clients/cli/commands/component/index.mjs +1 -1
- package/clients/cli/commands/component-ownership.test.mjs +3 -3
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/discover.broken-integration.test.mjs +7 -8
- package/clients/cli/commands/discover.doc.mjs +1 -1
- package/clients/cli/commands/discover.mjs +1 -1
- 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.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +53 -16
- package/clients/cli/commands/gap-report.doc.mjs +1 -1
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/init.doc.mjs +1 -1
- package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
- package/clients/cli/commands/integration-add.doc.mjs +11 -1
- 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/layout-check.doc.mjs +1 -1
- package/clients/cli/commands/layout-expand.doc.mjs +1 -1
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +1 -1
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/search.doc.mjs +1 -1
- package/clients/cli/commands/search.mjs +11 -2
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +1 -1
- package/clients/cli/commands/template.doc.mjs +24 -7
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/text-json-parity.test.mjs +719 -0
- package/clients/cli/commands/theme-add.doc.mjs +2 -2
- package/clients/cli/commands/theme-build.doc.mjs +1 -1
- 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.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.doc.mjs +1 -1
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.doc.mjs +3 -2
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -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 +8 -0
- package/clients/cli/lib/hook-format.mjs +14 -5
- package/clients/cli/lib/manifest.mjs +9 -2
- package/foundation/agent-docs/agent-docs.d.mts +3 -2
- package/foundation/agent-docs/agent-docs.mjs +13 -9
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +123 -80
- package/foundation/config/project.test.mjs +144 -21
- package/foundation/discovery/authoring-self-docs.d.mts +18 -0
- package/foundation/discovery/authoring-self-docs.mjs +37 -15
- package/foundation/discovery/authoring-self-docs.test.mjs +25 -9
- 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 +112 -11
- package/foundation/discovery/docs-discovery.mjs +231 -36
- package/foundation/discovery/docs-discovery.test.mjs +111 -32
- 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 +99 -6
- package/foundation/discovery/template-adapter.mjs +480 -57
- 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/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 +220 -39
- package/foundation/doc-compiler/compile.mjs +311 -15
- 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 +28 -1
- 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 +13 -0
- package/foundation/doc-compiler/ir.mjs +196 -12
- package/foundation/doc-compiler/lenses.d.mts +8 -5
- package/foundation/doc-compiler/lenses.mjs +50 -4
- 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/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -57
- 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 +3 -0
- package/foundation/integrations/integrations.mjs +11 -97
- 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/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +12 -2
- package/foundation/response/error-codes.mjs +7 -1
- package/foundation/response/error-codes.test.mjs +55 -11
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +20 -11
- 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.mjs +1 -1
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -9
- package/assets/templates/themes/manifest.json +0 -95
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Tests for the CLI's own typed docs. Every command, API function,
|
|
5
|
+
* schema, and enum doc this package ships declares the group that reads it,
|
|
6
|
+
* and each way one can fail to be read is reported: no namespace, a namespace
|
|
7
|
+
* nothing reads, a clash with the authoring topic's list, a doc that does not
|
|
8
|
+
* load, and a leaf too large for one read. What `astryx docs <route>` prints
|
|
9
|
+
* for one doc is pinned here; where the tree puts it is tree.test.mjs's job.
|
|
10
|
+
*
|
|
11
|
+
* @input This package's own docs, and fixture doc trees written under the
|
|
12
|
+
* working directory.
|
|
13
|
+
* @output Assertions on the audit and on each doc's rendered content.
|
|
14
|
+
* @position packages/cli/foundation/discovery — tests for cli-self-docs.mjs.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import * as fs from 'node:fs';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
import {afterAll, describe, expect, it} from 'vitest';
|
|
20
|
+
import {
|
|
21
|
+
CLI_DOC_NAMESPACES,
|
|
22
|
+
auditCliSelfDocs,
|
|
23
|
+
cliDocIndex,
|
|
24
|
+
cliDocSection,
|
|
25
|
+
discoverCliSelfDocSources,
|
|
26
|
+
} from './cli-self-docs.mjs';
|
|
27
|
+
import {routeSegment} from './docs-section-key.mjs';
|
|
28
|
+
|
|
29
|
+
const SLOW = 60_000;
|
|
30
|
+
|
|
31
|
+
/** @type {string[]} */
|
|
32
|
+
const tmpRoots = [];
|
|
33
|
+
afterAll(() => {
|
|
34
|
+
for (const root of tmpRoots) fs.rmSync(root, {recursive: true, force: true});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
/** Write `files` (relative path -> content) under a fresh directory. */
|
|
38
|
+
function writeTree(/** @type {Record<string, string>} */ files) {
|
|
39
|
+
const root = fs.mkdtempSync(path.join(process.cwd(), '.astryx-cli-docs-'));
|
|
40
|
+
tmpRoots.push(root);
|
|
41
|
+
for (const [rel, content] of Object.entries(files)) {
|
|
42
|
+
const file = path.join(root, rel);
|
|
43
|
+
fs.mkdirSync(path.dirname(file), {recursive: true});
|
|
44
|
+
fs.writeFileSync(file, content);
|
|
45
|
+
}
|
|
46
|
+
return root;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const docModule = (/** @type {any} */ doc) =>
|
|
50
|
+
`export const doc = ${JSON.stringify(doc, null, 2)};\n`;
|
|
51
|
+
|
|
52
|
+
const command = (/** @type {string} */ name, extra = {}) => ({
|
|
53
|
+
type: 'command',
|
|
54
|
+
name,
|
|
55
|
+
displayName: `astryx ${name}`,
|
|
56
|
+
namespace: 'cli/commands',
|
|
57
|
+
summary: `Do ${name}`,
|
|
58
|
+
...extra,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const fn = (/** @type {string} */ name, extra = {}) => ({
|
|
62
|
+
type: 'function',
|
|
63
|
+
kind: 'api',
|
|
64
|
+
name,
|
|
65
|
+
displayName: `${name}()`,
|
|
66
|
+
namespace: 'cli/api',
|
|
67
|
+
summary: `The ${name} function.`,
|
|
68
|
+
importPath: '@astryxdesign/cli/api',
|
|
69
|
+
params: [],
|
|
70
|
+
returns: [{type: name, description: 'The result.'}],
|
|
71
|
+
...extra,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const enumDoc = (/** @type {string} */ name, extra = {}) => ({
|
|
75
|
+
type: 'enum',
|
|
76
|
+
name,
|
|
77
|
+
displayName: name,
|
|
78
|
+
namespace: 'cli/api',
|
|
79
|
+
description: `The ${name}.`,
|
|
80
|
+
members: [{value: 'A', description: 'The a.'}],
|
|
81
|
+
...extra,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const schema = (/** @type {string} */ name, extra = {}) => ({
|
|
85
|
+
type: 'schema',
|
|
86
|
+
name,
|
|
87
|
+
displayName: name,
|
|
88
|
+
namespace: 'authoring',
|
|
89
|
+
description: `The ${name} file.`,
|
|
90
|
+
fields: [{name: 'x', type: 'string', description: 'The x.'}],
|
|
91
|
+
...extra,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/** Audit a fixture tree with nothing in the authoring topic's list. */
|
|
95
|
+
const audit = (/** @type {string} */ root, authoringSources = []) =>
|
|
96
|
+
auditCliSelfDocs({root, authoringSources});
|
|
97
|
+
|
|
98
|
+
describe('the CLI docs this package ships', () => {
|
|
99
|
+
it(
|
|
100
|
+
'each declare a namespace something reads, and none fails, clashes, or overflows',
|
|
101
|
+
async () => {
|
|
102
|
+
const result = await auditCliSelfDocs();
|
|
103
|
+
expect({
|
|
104
|
+
missing: result.missing,
|
|
105
|
+
unknown: result.unknown,
|
|
106
|
+
misfiled: result.misfiled,
|
|
107
|
+
failed: result.failed,
|
|
108
|
+
oversized: result.oversized,
|
|
109
|
+
}).toEqual({
|
|
110
|
+
missing: [],
|
|
111
|
+
unknown: [],
|
|
112
|
+
misfiled: [],
|
|
113
|
+
failed: [],
|
|
114
|
+
oversized: [],
|
|
115
|
+
});
|
|
116
|
+
expect(result.docs).toBeGreaterThan(0);
|
|
117
|
+
expect(result.tree + result.authoring).toBe(result.docs);
|
|
118
|
+
},
|
|
119
|
+
SLOW,
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('auditCliSelfDocs', () => {
|
|
124
|
+
it('reports a doc with no namespace, and one nothing reads', async () => {
|
|
125
|
+
const root = writeTree({
|
|
126
|
+
'api/alpha/alpha.doc.mjs': docModule(fn('alpha', {namespace: undefined})),
|
|
127
|
+
'clients/cli/commands/beta.doc.mjs': docModule(
|
|
128
|
+
command('beta', {namespace: 'cli'}),
|
|
129
|
+
),
|
|
130
|
+
'api/gamma/gamma.doc.mjs': docModule(fn('gamma')),
|
|
131
|
+
});
|
|
132
|
+
const result = await audit(root);
|
|
133
|
+
expect(result.missing).toEqual(['api/alpha/alpha.doc.mjs']);
|
|
134
|
+
expect(result.unknown).toEqual([
|
|
135
|
+
{source: 'clients/cli/commands/beta.doc.mjs', namespace: 'cli'},
|
|
136
|
+
]);
|
|
137
|
+
expect(result.tree).toBe(1);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('holds the authoring namespace to the authoring topic list', async () => {
|
|
141
|
+
const root = writeTree({
|
|
142
|
+
'authoring/x/x.doc.mjs': docModule(schema('x')),
|
|
143
|
+
'authoring/y/y.doc.mjs': docModule(schema('y', {namespace: 'cli/api'})),
|
|
144
|
+
'authoring/z/z.doc.mjs': docModule(schema('z')),
|
|
145
|
+
});
|
|
146
|
+
const result = await audit(root, ['y/y.doc.mjs', 'z/z.doc.mjs']);
|
|
147
|
+
expect(result.misfiled.map(entry => entry.message)).toEqual([
|
|
148
|
+
'authoring/x/x.doc.mjs has namespace "authoring", but `astryx docs authoring` does not list it',
|
|
149
|
+
'authoring/y/y.doc.mjs is read in `astryx docs authoring`, but its namespace is "cli/api"',
|
|
150
|
+
]);
|
|
151
|
+
expect(result.authoring).toBe(1);
|
|
152
|
+
expect(result.tree).toBe(0);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('reports a doc that fails to load, and skips fixture directories', async () => {
|
|
156
|
+
const root = writeTree({
|
|
157
|
+
'api/bad/bad.doc.mjs': 'throw new Error("boom");\n',
|
|
158
|
+
'api/__fixtures__/ghost.doc.mjs': docModule(fn('ghost')),
|
|
159
|
+
'foundation/.hidden/hidden.doc.mjs': docModule(fn('hidden')),
|
|
160
|
+
'foundation/codes.doc.mjs': docModule(enumDoc('codes')),
|
|
161
|
+
});
|
|
162
|
+
expect(discoverCliSelfDocSources(root)).toEqual([
|
|
163
|
+
'api/bad/bad.doc.mjs',
|
|
164
|
+
'foundation/codes.doc.mjs',
|
|
165
|
+
]);
|
|
166
|
+
const result = await audit(root);
|
|
167
|
+
expect(result.failed).toEqual([
|
|
168
|
+
expect.objectContaining({
|
|
169
|
+
source: 'api/bad/bad.doc.mjs',
|
|
170
|
+
error: expect.stringContaining('boom'),
|
|
171
|
+
}),
|
|
172
|
+
]);
|
|
173
|
+
expect(result.tree).toBe(1);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('reports a tree doc too large for one read', async () => {
|
|
177
|
+
const root = writeTree({
|
|
178
|
+
'api/big/big.doc.mjs': docModule(
|
|
179
|
+
fn('big', {description: 'x'.repeat(2_000)}),
|
|
180
|
+
),
|
|
181
|
+
'api/small/small.doc.mjs': docModule(fn('small')),
|
|
182
|
+
});
|
|
183
|
+
const result = await auditCliSelfDocs({root, authoringSources: [], budget: 1_000});
|
|
184
|
+
expect(result.oversized.map(entry => entry.key)).toEqual(['big']);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('names every namespace a CLI doc may declare, and what reads it', () => {
|
|
188
|
+
expect(CLI_DOC_NAMESPACES).toEqual({
|
|
189
|
+
'cli/commands': {reader: 'tree'},
|
|
190
|
+
'cli/api': {reader: 'tree'},
|
|
191
|
+
authoring: {reader: 'authoring'},
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* An index whose routes are the ones the docs tree gives the CLI's own docs.
|
|
198
|
+
* @param {any[]} docs
|
|
199
|
+
*/
|
|
200
|
+
const indexOf = docs =>
|
|
201
|
+
cliDocIndex(docs, (kind, name) =>
|
|
202
|
+
kind === 'command'
|
|
203
|
+
? `cli/commands/${routeSegment(name)}`
|
|
204
|
+
: kind === 'function'
|
|
205
|
+
? `cli/api/functions/${routeSegment(name)}`
|
|
206
|
+
: null,
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
describe('cliDocSection', () => {
|
|
210
|
+
it('links a command and the function it runs by identity, never by route', () => {
|
|
211
|
+
const docs = [fn('docs', {command: 'docs'}), command('docs', {fn: 'docs'})];
|
|
212
|
+
const index = indexOf(docs);
|
|
213
|
+
expect(JSON.stringify(cliDocSection(docs[1], index).content)).toContain(
|
|
214
|
+
'It runs `docs()` from `@astryxdesign/cli/api`. Read it with {@link function:docs}.',
|
|
215
|
+
);
|
|
216
|
+
expect(JSON.stringify(cliDocSection(docs[0], index).content)).toContain(
|
|
217
|
+
'`astryx docs` runs it. Read it with {@link command:docs}.',
|
|
218
|
+
);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("links a function to the command its command line starts with, or to none", () => {
|
|
222
|
+
const docs = [
|
|
223
|
+
fn('integrationAddTheme', {command: 'integration add theme'}),
|
|
224
|
+
command('integration add'),
|
|
225
|
+
fn('gone', {command: 'gone away'}),
|
|
226
|
+
];
|
|
227
|
+
const index = cliDocIndex(docs);
|
|
228
|
+
expect(JSON.stringify(cliDocSection(docs[0], index).content)).toContain(
|
|
229
|
+
'`astryx integration add theme` runs it. Read it with {@link command:integration add}.',
|
|
230
|
+
);
|
|
231
|
+
expect(JSON.stringify(cliDocSection(docs[2], index).content)).not.toContain(
|
|
232
|
+
'runs it',
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('renders a command: usage, arguments, options, examples, exit codes, subcommands', () => {
|
|
237
|
+
const docs = [
|
|
238
|
+
command('grp', {subcommands: ['sub', 'gone']}),
|
|
239
|
+
command('grp sub', {
|
|
240
|
+
description: 'The long form.',
|
|
241
|
+
fn: 'grpSub',
|
|
242
|
+
args: [
|
|
243
|
+
{name: 'files', required: true, variadic: true, description: 'Files.'},
|
|
244
|
+
],
|
|
245
|
+
options: [
|
|
246
|
+
{flag: '--fast', description: 'Go fast'},
|
|
247
|
+
{
|
|
248
|
+
flag: '--mode <m>',
|
|
249
|
+
description: 'Mode',
|
|
250
|
+
choices: ['a', 'b'],
|
|
251
|
+
default: 'a',
|
|
252
|
+
},
|
|
253
|
+
{flag: '--limit <n>', param: 'options.limit'},
|
|
254
|
+
{flag: '--dry', description: 'Dry run.', default: false},
|
|
255
|
+
],
|
|
256
|
+
examples: [
|
|
257
|
+
{label: 'Run it', cli: 'astryx grp sub x'},
|
|
258
|
+
{cli: 'astryx grp sub y'},
|
|
259
|
+
],
|
|
260
|
+
exitCodes: [{code: 1, when: 'it fails'}],
|
|
261
|
+
}),
|
|
262
|
+
fn('grpSub', {
|
|
263
|
+
params: [{name: 'options.limit', type: 'number', description: 'Max.'}],
|
|
264
|
+
}),
|
|
265
|
+
];
|
|
266
|
+
// `grp gone` has no doc, so it gets no line.
|
|
267
|
+
const index = cliDocIndex(docs, (kind, name) =>
|
|
268
|
+
kind === 'command' && name === 'grp gone'
|
|
269
|
+
? null
|
|
270
|
+
: kind === 'command'
|
|
271
|
+
? `cli/commands/${routeSegment(name)}`
|
|
272
|
+
: `cli/api/functions/${routeSegment(name)}`,
|
|
273
|
+
);
|
|
274
|
+
const group = cliDocSection(docs[0], index);
|
|
275
|
+
const sub = cliDocSection(docs[1], index);
|
|
276
|
+
expect(group.content).toContainEqual({
|
|
277
|
+
type: 'list',
|
|
278
|
+
style: 'unordered',
|
|
279
|
+
items: ['`astryx grp sub`: {@link command:grp sub}'],
|
|
280
|
+
});
|
|
281
|
+
expect(sub).toMatchObject({id: 'grp-sub', title: 'astryx grp sub'});
|
|
282
|
+
expect(sub.content).toEqual([
|
|
283
|
+
{type: 'prose', text: 'Do grp sub'},
|
|
284
|
+
{type: 'prose', text: 'The long form.'},
|
|
285
|
+
{type: 'code', lang: 'bash', code: 'astryx grp sub <files...>'},
|
|
286
|
+
{
|
|
287
|
+
type: 'table',
|
|
288
|
+
headers: ['Argument', 'Description'],
|
|
289
|
+
rows: [['`files`', 'Files.']],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
type: 'table',
|
|
293
|
+
headers: ['Option', 'Description'],
|
|
294
|
+
rows: [
|
|
295
|
+
['`--fast`', 'Go fast'],
|
|
296
|
+
['`--mode <m>`', 'Mode. One of: `a`, `b`. Default: `a`.'],
|
|
297
|
+
['`--limit <n>`', 'Max.'],
|
|
298
|
+
['`--dry`', 'Dry run.'],
|
|
299
|
+
],
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
type: 'code',
|
|
303
|
+
lang: 'bash',
|
|
304
|
+
code: '# Run it\nastryx grp sub x\nastryx grp sub y',
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
type: 'table',
|
|
308
|
+
headers: ['Exit code', 'When'],
|
|
309
|
+
rows: [['1', 'it fails']],
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
type: 'prose',
|
|
313
|
+
text: 'It runs `grpSub()` from `@astryxdesign/cli/api`. Read it with {@link function:grpSub}.',
|
|
314
|
+
},
|
|
315
|
+
]);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('renders an API function, an enum, and a schema', () => {
|
|
319
|
+
const alpha = fn('alpha', {
|
|
320
|
+
description: 'Longer.',
|
|
321
|
+
signature: 'alpha(x: string): Promise<Alpha>',
|
|
322
|
+
params: [{name: 'x', type: 'string', description: 'The x.'}],
|
|
323
|
+
throws: [{code: 'ERR_X', when: 'x is bad'}],
|
|
324
|
+
examples: [{label: 'Call it', code: "await alpha('x');"}],
|
|
325
|
+
});
|
|
326
|
+
const codes = enumDoc('codes', {
|
|
327
|
+
members: [
|
|
328
|
+
{value: 'A', description: 'The a.'},
|
|
329
|
+
{value: 'B', description: 'The b.', deprecated: 'Use A.'},
|
|
330
|
+
],
|
|
331
|
+
});
|
|
332
|
+
const output = schema('output', {namespace: 'cli/api'});
|
|
333
|
+
const index = indexOf([alpha, codes, output]);
|
|
334
|
+
expect(cliDocSection(alpha, index).content).toEqual([
|
|
335
|
+
{type: 'prose', text: 'The alpha function.'},
|
|
336
|
+
{type: 'prose', text: 'Longer.'},
|
|
337
|
+
{type: 'code', lang: 'ts', code: 'alpha(x: string): Promise<Alpha>'},
|
|
338
|
+
{type: 'prose', text: 'Import it from `@astryxdesign/cli/api`.'},
|
|
339
|
+
{
|
|
340
|
+
type: 'table',
|
|
341
|
+
headers: ['Parameter', 'Type', 'Description'],
|
|
342
|
+
rows: [['`x`', '`string`', 'The x.']],
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
type: 'table',
|
|
346
|
+
headers: ['Returns', 'Description'],
|
|
347
|
+
rows: [['`alpha`', 'The result.']],
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
type: 'table',
|
|
351
|
+
headers: ['Throws', 'When'],
|
|
352
|
+
rows: [['`ERR_X`', 'x is bad']],
|
|
353
|
+
},
|
|
354
|
+
{type: 'code', lang: 'ts', label: 'Call it', code: "await alpha('x');"},
|
|
355
|
+
]);
|
|
356
|
+
expect(cliDocSection(codes, index)).toEqual({
|
|
357
|
+
id: 'codes',
|
|
358
|
+
title: 'codes',
|
|
359
|
+
content: [
|
|
360
|
+
{type: 'prose', text: 'The codes.'},
|
|
361
|
+
{
|
|
362
|
+
type: 'table',
|
|
363
|
+
headers: ['Value', 'Meaning'],
|
|
364
|
+
rows: [
|
|
365
|
+
['`A`', 'The a.'],
|
|
366
|
+
['`B`', 'The b. Deprecated: Use A.'],
|
|
367
|
+
],
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
});
|
|
371
|
+
const rendered = cliDocSection(output, index);
|
|
372
|
+
expect(rendered.id).toBe('output');
|
|
373
|
+
expect(JSON.stringify(rendered.content)).toContain('The output file.');
|
|
374
|
+
});
|
|
375
|
+
});
|
|
@@ -124,6 +124,44 @@ export function discoverIntegrationComponents(integration: {
|
|
|
124
124
|
issuesUrl: string | undefined;
|
|
125
125
|
group: string | null;
|
|
126
126
|
}>;
|
|
127
|
+
/**
|
|
128
|
+
* Load and validate every discovered integration component independently.
|
|
129
|
+
* Invalid metadata or a missing same-stem source removes only that component;
|
|
130
|
+
* callers can report the returned errors while retaining valid siblings.
|
|
131
|
+
*
|
|
132
|
+
* @param {{name: string, components?: string, issuesUrl?: string}} integration
|
|
133
|
+
* @returns {Promise<{
|
|
134
|
+
* components: Array<{name: string, package: string, docPath: string, sourcePath: string, issuesUrl: string|undefined, group: string|null}>,
|
|
135
|
+
* discovered: Array<{name: string, package: string, docPath: string, sourcePath: string|null, issuesUrl: string|undefined, group: string|null}>,
|
|
136
|
+
* errors: Array<{name: string, message: string}>,
|
|
137
|
+
* }>}
|
|
138
|
+
*/
|
|
139
|
+
export function discoverValidIntegrationComponents(integration: {
|
|
140
|
+
name: string;
|
|
141
|
+
components?: string;
|
|
142
|
+
issuesUrl?: string;
|
|
143
|
+
}): Promise<{
|
|
144
|
+
components: Array<{
|
|
145
|
+
name: string;
|
|
146
|
+
package: string;
|
|
147
|
+
docPath: string;
|
|
148
|
+
sourcePath: string;
|
|
149
|
+
issuesUrl: string | undefined;
|
|
150
|
+
group: string | null;
|
|
151
|
+
}>;
|
|
152
|
+
discovered: Array<{
|
|
153
|
+
name: string;
|
|
154
|
+
package: string;
|
|
155
|
+
docPath: string;
|
|
156
|
+
sourcePath: string | null;
|
|
157
|
+
issuesUrl: string | undefined;
|
|
158
|
+
group: string | null;
|
|
159
|
+
}>;
|
|
160
|
+
errors: Array<{
|
|
161
|
+
name: string;
|
|
162
|
+
message: string;
|
|
163
|
+
}>;
|
|
164
|
+
}>;
|
|
127
165
|
/**
|
|
128
166
|
* Find an integration component's doc file by name within a loaded
|
|
129
167
|
* integration's resolved `components` dir. Honors the same-stem convention
|
|
@@ -8,6 +8,7 @@ import * as fs from 'node:fs';
|
|
|
8
8
|
import * as path from 'node:path';
|
|
9
9
|
import {existsCaseExact} from '../fs/paths.mjs';
|
|
10
10
|
import {CORE_PROVIDER_ID} from '../identity/providers.mjs';
|
|
11
|
+
import {loadComponentDoc} from './component-loader.mjs';
|
|
11
12
|
|
|
12
13
|
const SKIP_DIRS = new Set(['hooks', 'utils', '__tests__', 'node_modules']);
|
|
13
14
|
|
|
@@ -692,6 +693,53 @@ export function discoverIntegrationComponents(integration) {
|
|
|
692
693
|
return [...byName.values()];
|
|
693
694
|
}
|
|
694
695
|
|
|
696
|
+
/**
|
|
697
|
+
* Load and validate every discovered integration component independently.
|
|
698
|
+
* Invalid metadata or a missing same-stem source removes only that component;
|
|
699
|
+
* callers can report the returned errors while retaining valid siblings.
|
|
700
|
+
*
|
|
701
|
+
* @param {{name: string, components?: string, issuesUrl?: string}} integration
|
|
702
|
+
* @returns {Promise<{
|
|
703
|
+
* components: Array<{name: string, package: string, docPath: string, sourcePath: string, issuesUrl: string|undefined, group: string|null}>,
|
|
704
|
+
* discovered: Array<{name: string, package: string, docPath: string, sourcePath: string|null, issuesUrl: string|undefined, group: string|null}>,
|
|
705
|
+
* errors: Array<{name: string, message: string}>,
|
|
706
|
+
* }>}
|
|
707
|
+
*/
|
|
708
|
+
export async function discoverValidIntegrationComponents(integration) {
|
|
709
|
+
const discovered = discoverIntegrationComponents(integration);
|
|
710
|
+
/** @type {Array<{name: string, package: string, docPath: string, sourcePath: string, issuesUrl: string|undefined, group: string|null}>} */
|
|
711
|
+
const components = [];
|
|
712
|
+
/** @type {Array<{name: string, message: string}>} */
|
|
713
|
+
const errors = [];
|
|
714
|
+
|
|
715
|
+
for (const record of discovered) {
|
|
716
|
+
if (record.sourcePath == null) {
|
|
717
|
+
errors.push({
|
|
718
|
+
name: record.name,
|
|
719
|
+
message: `Component "${record.name}" is missing its same-stem source file ${record.name}.tsx.`,
|
|
720
|
+
});
|
|
721
|
+
continue;
|
|
722
|
+
}
|
|
723
|
+
try {
|
|
724
|
+
await loadComponentDoc(record.docPath);
|
|
725
|
+
components.push(
|
|
726
|
+
/** @type {{name: string, package: string, docPath: string, sourcePath: string, issuesUrl: string|undefined, group: string|null}} */ (
|
|
727
|
+
record
|
|
728
|
+
),
|
|
729
|
+
);
|
|
730
|
+
} catch (err) {
|
|
731
|
+
errors.push({
|
|
732
|
+
name: record.name,
|
|
733
|
+
message: `Component "${record.name}" has invalid metadata: ${
|
|
734
|
+
err instanceof Error ? err.message : String(err)
|
|
735
|
+
}`,
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
return {components, discovered, errors};
|
|
741
|
+
}
|
|
742
|
+
|
|
695
743
|
/**
|
|
696
744
|
* Find an integration component's doc file by name within a loaded
|
|
697
745
|
* integration's resolved `components` dir. Honors the same-stem convention
|
|
@@ -2,49 +2,46 @@
|
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Load a component doc
|
|
5
|
+
* Load a component or hook doc and check it against its kind's parser.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* / `'function'` / `'generic'`) — the same single-export convention the
|
|
13
|
-
* other authoring parsers use for config/integration/template. These carry
|
|
14
|
-
* a stamped `type` and validate against the matching per-kind parser.
|
|
15
|
-
* - OLD: the legacy loose `export const docs = {...}` (no `type`), validated
|
|
16
|
-
* against the permissive legacy union.
|
|
17
|
-
* The default export wins when both are present. Throws a readable
|
|
18
|
-
* `formatZodError`-style message on failure. Translations (`docsZh`/
|
|
19
|
-
* `docsDense`) are merged exactly as {@link loadDocs} does so callers see
|
|
20
|
-
* identical output.
|
|
7
|
+
* Reads `.doc.ts` through jiti and `.doc.mjs`/`.doc.js` natively. Both formats
|
|
8
|
+
* load: a stamped default export (`export default {type: 'component', ...}`)
|
|
9
|
+
* checked against its kind, and the legacy `export const docs = {...}` checked
|
|
10
|
+
* against the permissive legacy union. The default export wins when both are
|
|
11
|
+
* present. Throws the parser's readable message when the doc fails.
|
|
21
12
|
*
|
|
22
13
|
* @param {string} docPath absolute path to a `.doc.{ts,mjs,js}` file
|
|
23
|
-
* @param {
|
|
24
|
-
* @returns {Promise<
|
|
14
|
+
* @param {LoadDocOptions} [opts]
|
|
15
|
+
* @returns {Promise<any>} the checked (and optionally translated) doc
|
|
25
16
|
*/
|
|
26
|
-
export function loadComponentDoc(docPath: string,
|
|
27
|
-
zh?: boolean;
|
|
28
|
-
dense?: boolean;
|
|
29
|
-
lang?: string;
|
|
30
|
-
}): Promise<object>;
|
|
17
|
+
export function loadComponentDoc(docPath: string, opts?: LoadDocOptions): Promise<any>;
|
|
31
18
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
-
export function mergeTranslation(docs: any, translation: any): any;
|
|
37
|
-
/**
|
|
38
|
-
* Load the typed docs object from a .doc.mjs file.
|
|
39
|
-
* Supports --lang flag: 'zh' for Chinese, 'dense' for compressed format.
|
|
40
|
-
* Also supports legacy --zh and --dense flags.
|
|
41
|
-
* Translations are merged onto the base docs, keeping structure intact.
|
|
19
|
+
* Load a component or hook doc without checking it. Supports `lang` ('zh' for
|
|
20
|
+
* Chinese, 'dense' for compressed) and the legacy `zh`/`dense` flags; the
|
|
21
|
+
* translation is laid over the doc, keeping its structure. A file that exports
|
|
22
|
+
* no doc reads as `undefined`.
|
|
42
23
|
* @param {string} readmePath
|
|
43
|
-
* @param {
|
|
24
|
+
* @param {LoadDocOptions} [opts]
|
|
44
25
|
* @returns {Promise<any>}
|
|
45
26
|
*/
|
|
46
|
-
export function loadDocs(readmePath: string,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
27
|
+
export function loadDocs(readmePath: string, opts?: LoadDocOptions): Promise<any>;
|
|
28
|
+
export { mergeTranslation } from "../doc-compiler/overlays.mjs";
|
|
29
|
+
export type LoadDocOptions = {
|
|
30
|
+
/**
|
|
31
|
+
* legacy flag for `lang: 'zh'`
|
|
32
|
+
*/
|
|
33
|
+
zh?: boolean | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* legacy flag for `lang: 'dense'`
|
|
36
|
+
*/
|
|
37
|
+
dense?: boolean | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* wins over the legacy flags
|
|
40
|
+
*/
|
|
41
|
+
lang?: string | null | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* which root reads the doc
|
|
44
|
+
* (default: components)
|
|
45
|
+
*/
|
|
46
|
+
root?: "hooks" | "components" | undefined;
|
|
47
|
+
};
|