@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.3-canary.02f5fe4
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 +119 -0
- package/README.md +216 -162
- package/api/build/_adapter.d.mts +66 -0
- package/api/build/_adapter.mjs +139 -4
- package/api/build/blocks/blocks.d.mts +92 -0
- package/api/build/blocks/blocks.mjs +528 -0
- package/api/build/blocks/blocks.test.mjs +238 -0
- package/api/build/blocks/blocks.weights.json +1 -0
- package/api/build/build.doc.mjs +4 -0
- package/api/build/build.mjs +25 -6
- package/api/build/build.type.mjs +1 -1
- package/api/build/help/help.mjs +1 -1
- package/api/build/kit/answer.d.mts +18 -0
- package/api/build/kit/answer.mjs +195 -0
- package/api/build/kit/answer.test.mjs +108 -0
- package/api/build/kit/kind.d.mts +25 -0
- package/api/build/kit/kind.mjs +170 -0
- package/api/build/kit/kit.d.mts +2 -4
- package/api/build/kit/kit.mjs +8 -406
- package/api/build/kit/rank.d.mts +3 -32
- package/api/build/kit/rank.mjs +25 -342
- package/api/build/kit/rank.test.mjs +2 -1
- package/api/build/kit/signals.d.mts +79 -0
- package/api/build/kit/signals.mjs +295 -0
- package/api/build/kit/start.d.mts +32 -0
- package/api/build/kit/start.mjs +163 -0
- package/api/build/kit/words.d.mts +72 -0
- package/api/build/kit/words.mjs +202 -0
- package/api/build/tree.d.mts +20 -0
- package/api/build/tree.mjs +53 -0
- package/api/build/tree.test.mjs +185 -0
- package/api/build/tree.weights.json +1 -0
- package/api/component/_adapter.d.mts +72 -1
- package/api/component/_adapter.mjs +251 -23
- package/api/component/component-replacement.test.mjs +1 -0
- package/api/component/component.doc.mjs +6 -1
- package/api/component/component.mjs +97 -16
- package/api/component/component.test.mjs +95 -0
- package/api/component/doc-links.test.mjs +386 -0
- package/api/component/integration-export-name.test.mjs +644 -0
- package/api/component/list/list.mjs +42 -4
- package/api/discover/_adapter.d.mts +131 -12
- package/api/discover/_adapter.mjs +520 -34
- package/api/discover/_adapter.test.mjs +641 -17
- package/api/discover/_catalog-view.d.mts +16 -5
- package/api/discover/_catalog-view.mjs +32 -8
- package/api/discover/detail/doc/doc.mjs +9 -1
- package/api/discover/discover.d.mts +11 -0
- package/api/discover/discover.doc.mjs +9 -7
- package/api/discover/discover.mjs +120 -19
- package/api/discover/discover.type.d.mts +20 -7
- package/api/discover/discover.type.mjs +17 -7
- package/api/discover/list/list.d.mts +4 -3
- package/api/discover/list/list.mjs +17 -10
- package/api/docs/_adapter.d.mts +76 -2
- package/api/docs/_adapter.mjs +630 -34
- package/api/docs/docs-homes.test.mjs +127 -0
- package/api/docs/docs.doc.mjs +5 -4
- package/api/docs/docs.mjs +2 -1
- package/api/docs/docs.test.mjs +39 -20
- package/api/docs/integration-tree.test.mjs +42 -20
- package/api/docs/integrationDocs.test.mjs +125 -1
- package/api/docs/list/list.mjs +12 -2
- package/api/docs/namespace-section.test.mjs +6 -6
- package/api/docs/reference-blocks.test.mjs +3 -5
- package/api/doctor/_adapter.d.mts +128 -0
- package/api/doctor/_adapter.mjs +253 -4
- package/api/doctor/doctor.d.mts +217 -0
- package/api/doctor/doctor.doc.mjs +3 -2
- package/api/doctor/doctor.mjs +691 -52
- package/api/doctor/doctor.test.mjs +267 -18
- package/api/doctor/release-checks.test.mjs +156 -0
- package/api/doctor/theme-checks.mjs +17 -4
- package/api/doctor/theme-checks.test.mjs +223 -7
- package/api/error.d.mts +10 -0
- package/api/error.mjs +25 -0
- package/api/gap-report/gap-report.d.mts +3 -0
- package/api/gap-report/gap-report.doc.mjs +11 -3
- package/api/gap-report/gap-report.mjs +219 -52
- package/api/gap-report/gap-report.test.mjs +233 -0
- package/api/gap-report/gap-report.type.d.mts +41 -0
- package/api/gap-report/gap-report.type.mjs +18 -0
- package/api/hook/_adapter.mjs +3 -11
- package/api/hook/hook.doc.mjs +4 -0
- package/api/hook/hook.mjs +1 -1
- package/api/hook/list/list.d.mts +1 -1
- package/api/index.d.mts +2 -0
- package/api/index.mjs +2 -0
- package/api/init/_adapter.d.mts +22 -0
- package/api/init/_adapter.mjs +59 -0
- package/api/init/init.d.mts +7 -5
- package/api/init/init.doc.mjs +45 -10
- package/api/init/init.mjs +28 -4
- package/api/init/init.test.mjs +18 -2
- package/api/init/init.type.d.mts +50 -5
- package/api/init/init.type.mjs +39 -5
- package/api/init/remove/remove.mjs +17 -4
- package/api/init/remove/remove.test.mjs +114 -2
- package/api/init/run/run.d.mts +1 -1
- package/api/init/run/run.mjs +86 -12
- package/api/init/user/user.d.mts +14 -0
- package/api/init/user/user.mjs +87 -0
- package/api/init/user/user.test.mjs +232 -0
- package/api/integration/_adapter.d.mts +53 -0
- package/api/integration/_adapter.mjs +132 -0
- package/api/integration/add-contribution.component-names.test.mjs +66 -0
- package/api/integration/add-contribution.mjs +8 -4
- package/api/integration/add-contribution.test.mjs +4 -2
- package/api/integration/authoring-checks.mjs +192 -14
- package/api/integration/authoring-checks.test.mjs +1028 -0
- package/api/integration/authoring-checks.type.d.mts +143 -0
- package/api/integration/authoring-checks.type.mjs +74 -2
- package/api/integration/check/check.d.mts +96 -0
- package/api/integration/check/check.mjs +357 -0
- package/api/integration/check/check.test.mjs +489 -0
- package/api/integration/integration-check.type.d.mts +118 -0
- package/api/integration/integration-check.type.mjs +84 -0
- package/api/integration/integrationCheck.doc.d.mts +10 -0
- package/api/integration/integrationCheck.doc.mjs +73 -0
- package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
- package/api/integration/integrationDocConflicts.doc.mjs +22 -5
- package/api/integration/pack-check.mjs +486 -123
- package/api/integration/pack-check.test.mjs +817 -10
- package/api/integration/validate-integration-case-disk.test.mjs +111 -0
- package/api/integration/validate-integration-fixes.test.mjs +73 -5
- package/api/integration/validate-integration-gaps.test.mjs +1975 -0
- package/api/integration/validate-integration.d.mts +23 -2
- package/api/integration/validate-integration.mjs +358 -45
- package/api/integration/validate-integration.test.mjs +88 -8
- package/api/integration/validate-integration.type.d.mts +105 -0
- package/api/integration/validate-integration.type.mjs +79 -1
- package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
- package/api/integration/validateIntegration.doc.mjs +19 -3
- package/api/search/ORDERING.md +28 -0
- package/api/search/_adapter.d.mts +91 -0
- package/api/search/_adapter.mjs +172 -0
- package/api/search/_adapter.test.mjs +173 -0
- package/api/search/_candidate-score.d.mts +40 -0
- package/api/search/_candidate-score.mjs +238 -0
- package/api/search/_cards.json +6098 -0
- package/api/search/_compound.d.mts +50 -0
- package/api/search/_compound.mjs +170 -0
- package/api/search/_doc-searcher.d.mts +4 -0
- package/api/search/_doc-searcher.mjs +23 -0
- package/api/search/_doc-searcher.test.mjs +36 -0
- package/api/search/_doc-searcher.weights.json +1 -0
- package/api/search/_doc-text.d.mts +30 -0
- package/api/search/_doc-text.mjs +87 -0
- package/api/search/_entries.d.mts +63 -0
- package/api/search/_entries.mjs +232 -0
- package/api/search/_entries.test.mjs +48 -0
- package/api/search/_features.d.mts +35 -0
- package/api/search/_features.mjs +155 -0
- package/api/search/_gather-components.d.mts +26 -0
- package/api/search/_gather-components.mjs +284 -0
- package/api/search/_gather-docs.d.mts +20 -0
- package/api/search/_gather-docs.mjs +254 -0
- package/api/search/_gather-hooks.d.mts +12 -0
- package/api/search/_gather-hooks.mjs +52 -0
- package/api/search/_gather-templates.d.mts +25 -0
- package/api/search/_gather-templates.mjs +107 -0
- package/api/search/_lexical.d.mts +135 -0
- package/api/search/_lexical.mjs +351 -0
- package/api/search/_main-searcher.d.mts +19 -0
- package/api/search/_main-searcher.mjs +115 -0
- package/api/search/_main-searcher.test.mjs +106 -0
- package/api/search/_main-searcher.weights.json +1 -0
- package/api/search/_module-doc.d.mts +32 -0
- package/api/search/_module-doc.mjs +78 -0
- package/api/search/_order.d.mts +32 -0
- package/api/search/_order.mjs +162 -0
- package/api/search/_order.test.mjs +72 -0
- package/api/search/_priority.d.mts +50 -0
- package/api/search/_priority.mjs +139 -0
- package/api/search/_query-words.d.mts +25 -0
- package/api/search/_query-words.mjs +92 -0
- package/api/search/_query.d.mts +65 -0
- package/api/search/_query.mjs +176 -0
- package/api/search/_result.d.mts +97 -0
- package/api/search/_result.mjs +150 -0
- package/api/search/_score.d.mts +60 -0
- package/api/search/_score.mjs +283 -0
- package/api/search/_synonyms.d.mts +21 -0
- package/api/search/_synonyms.mjs +67 -0
- package/api/search/_template-searcher.d.mts +4 -0
- package/api/search/_template-searcher.mjs +23 -0
- package/api/search/_template-searcher.test.mjs +40 -0
- package/api/search/_template-searcher.weights.json +1 -0
- package/api/search/_titles.d.mts +33 -0
- package/api/search/_titles.mjs +65 -0
- package/api/search/_words.d.mts +64 -0
- package/api/search/_words.mjs +157 -0
- package/api/search/search.d.mts +22 -236
- package/api/search/search.doc.mjs +14 -7
- package/api/search/search.domain-priority.test.mjs +108 -18
- package/api/search/search.integration-check.test.mjs +24 -0
- package/api/search/search.mjs +59 -1904
- package/api/search/search.test.mjs +193 -15
- package/api/search/search.type.d.mts +20 -2
- package/api/search/search.type.mjs +12 -2
- package/api/search/tree.d.mts +15 -0
- package/api/search/tree.mjs +40 -0
- package/api/search/tree.test.mjs +66 -0
- package/api/search/tree.weights.json +1 -0
- package/api/swizzle/_adapter.mjs +2 -2
- package/api/swizzle/copy/copy.mjs +29 -15
- package/api/template/template-integration.test.mjs +1 -1
- package/api/template/template.mjs +5 -1
- package/api/template/template.test.mjs +120 -3
- package/api/theme/_adapter.d.mts +16 -0
- package/api/theme/_adapter.mjs +32 -5
- package/api/theme/build/build.d.mts +2 -1
- package/api/theme/build/build.family.test.mjs +64 -0
- package/api/theme/build/build.mjs +250 -38
- package/api/theme/build/build.packed-old-core.test.mjs +21 -3
- package/api/theme/build/font-warning.mjs +5 -3
- package/api/theme/build/font-warning.test.mjs +2 -1
- package/api/theme/remove/remove.test.mjs +2 -2
- package/api/theme/targets/targets.mjs +3 -10
- package/api/theme/themeBuild.doc.mjs +4 -4
- package/api/theme/themeTargets.doc.mjs +4 -0
- package/api/theme/use/use.test.mjs +1 -1
- package/api/upgrade/_adapter.d.mts +97 -11
- package/api/upgrade/_adapter.mjs +315 -32
- package/api/upgrade/registry/registry.d.mts +10 -4
- package/api/upgrade/registry/registry.mjs +33 -16
- package/api/upgrade/registry/registry.test.mjs +85 -0
- package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
- package/api/upgrade/run/run.d.mts +4 -2
- package/api/upgrade/run/run.mjs +48 -4
- package/api/upgrade/run/run.test.mjs +417 -3
- package/api/upgrade/status/status.d.mts +21 -5
- package/api/upgrade/status/status.mjs +45 -8
- package/api/upgrade/upgrade.doc.mjs +16 -8
- package/api/upgrade/upgrade.mjs +18 -3
- package/api/upgrade/upgrade.test.mjs +194 -0
- package/api/upgrade/upgrade.type.d.mts +28 -3
- package/api/upgrade/upgrade.type.mjs +24 -7
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/runner.mjs +7 -1
- package/assets/codemods/transforms/v0.7.0/__tests__/validate-data-token-ownership.test.mjs +11 -0
- package/assets/codemods/transforms/v0.7.0/validate-data-token-ownership.mjs +3 -3
- package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
- package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
- package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
- package/assets/discover/official-packages.json +367 -0
- package/assets/docs/README.md +10 -0
- package/assets/docs/author-a-theme.doc.mjs +5 -5
- package/assets/docs/browser-support.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +26 -6
- package/assets/docs/is-my-code-good.doc.mjs +287 -0
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.dense.mjs +1 -1
- package/assets/docs/theme.doc.mjs +2 -2
- package/assets/docs/theme.doc.zh.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +22 -2
- package/assets/docs/tree/add-a-theme.doc.mjs +14 -4
- package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
- package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
- package/assets/docs/tree/api.doc.mjs +6 -0
- package/assets/docs/tree/authoring.doc.mjs +61 -0
- package/assets/docs/tree/block-template.doc.mjs +8 -20
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/building-blocks.doc.mjs +6 -2
- package/assets/docs/tree/check-the-props.doc.mjs +201 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
- package/assets/docs/tree/checks.doc.mjs +32 -24
- package/assets/docs/tree/ci-and-containers.doc.mjs +101 -0
- package/assets/docs/tree/cli-command.doc.mjs +142 -0
- package/assets/docs/tree/cli.doc.mjs +7 -1
- package/assets/docs/tree/codemods.doc.mjs +17 -7
- package/assets/docs/tree/commands.doc.mjs +7 -1
- package/assets/docs/tree/component-family.doc.mjs +8 -6
- package/assets/docs/tree/component-imports.doc.mjs +21 -3
- package/assets/docs/tree/components.doc.mjs +7 -1
- package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
- package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
- package/assets/docs/tree/configuration.doc.mjs +8 -4
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
- package/assets/docs/tree/define-the-theme.doc.mjs +7 -6
- package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
- package/assets/docs/tree/docs.doc.mjs +9 -3
- package/assets/docs/tree/document-the-template.doc.mjs +1 -1
- package/assets/docs/tree/document-the-theme.doc.mjs +4 -4
- package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
- package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
- package/assets/docs/{authoring.doc.mjs → tree/field-reference.doc.mjs} +4 -3
- package/assets/docs/tree/fonts-and-assets.doc.mjs +3 -3
- package/assets/docs/tree/generate-a-palette.doc.mjs +8 -6
- package/assets/docs/tree/global-integrations.doc.mjs +124 -0
- package/assets/docs/tree/global.doc.mjs +131 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
- package/assets/docs/tree/help.doc.mjs +2 -2
- package/assets/docs/tree/host-entry.doc.mjs +128 -0
- package/assets/docs/tree/install-once.doc.mjs +105 -0
- package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
- package/assets/docs/tree/layout.doc.mjs +6 -6
- package/assets/docs/tree/links.doc.mjs +7 -6
- package/assets/docs/tree/migration-setup.doc.mjs +3 -2
- package/assets/docs/tree/migration-verification.doc.mjs +0 -1
- package/assets/docs/tree/migration.doc.mjs +0 -1
- package/assets/docs/tree/monorepos.doc.mjs +84 -0
- package/assets/docs/tree/package-and-test.doc.mjs +1 -1
- package/assets/docs/tree/page-template.doc.mjs +4 -8
- package/assets/docs/tree/problems.doc.mjs +205 -0
- package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
- package/assets/docs/tree/publishing.doc.mjs +6 -6
- package/assets/docs/tree/quick-start.doc.mjs +54 -28
- package/assets/docs/tree/reference.doc.mjs +192 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
- package/assets/docs/tree/replace-a-core-template.doc.mjs +10 -12
- package/assets/docs/tree/scaffold.doc.mjs +1 -1
- package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
- package/assets/docs/tree/ship.doc.mjs +2 -2
- package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
- package/assets/docs/tree/single-component.doc.mjs +15 -6
- package/assets/docs/tree/start-a-template.doc.mjs +18 -8
- package/assets/docs/tree/subcomponent.doc.mjs +6 -6
- package/assets/docs/tree/template-assets.doc.mjs +2 -2
- package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
- package/assets/docs/tree/template-fonts.doc.mjs +1 -1
- package/assets/docs/tree/template-grading-rubric.doc.mjs +17 -38
- package/assets/docs/tree/template-icons.doc.mjs +1 -1
- package/assets/docs/tree/template-images-media.doc.mjs +1 -1
- package/assets/docs/tree/template-styles.doc.mjs +2 -2
- package/assets/docs/tree/templates.doc.mjs +7 -1
- package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
- package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
- package/assets/docs/tree/themes.doc.mjs +5 -1
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/tokens-data.doc.mjs +2 -2
- package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
- package/assets/docs/tree/type-scale.doc.mjs +3 -3
- package/assets/docs/tree/uninstall.doc.mjs +109 -0
- package/assets/docs/tree/updates.doc.mjs +92 -0
- package/assets/docs/tree/upgrading.doc.mjs +6 -6
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +15 -3
- package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
- package/assets/docs/tree/versioning.doc.mjs +14 -9
- package/assets/docs/tree/who-answers.doc.mjs +119 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +1 -1
- package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
- package/assets/docs/use-a-theme.doc.mjs +2 -2
- package/assets/docs/use-integrations.doc.mjs +120 -0
- package/assets/docs/working-with-ai.doc.mjs +70 -13
- package/assets/templates/themes/butter/butterTheme.ts +4 -2
- package/assets/templates/themes/stone/stoneTheme.ts +4 -2
- package/assets/templates/themes/y2k/y2kTheme.ts +4 -2
- package/assets/theme.template.ts +1 -1
- package/authoring/codemod/codemod.doc.mjs +7 -3
- package/authoring/config/config.doc.mjs +9 -6
- package/authoring/config/type.ts +4 -2
- package/authoring/debug/parse.d.mts +5 -5
- package/authoring/discover/discover.doc.mjs +7 -1
- package/authoring/doctypes/_schema.d.mts +8 -3
- package/authoring/doctypes/_schema.mjs +1 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
- package/authoring/doctypes/command/command.doc.mjs +20 -12
- package/authoring/doctypes/command/type.ts +14 -0
- package/authoring/doctypes/component/component.doc.mjs +30 -27
- package/authoring/doctypes/component/type.ts +21 -8
- package/authoring/doctypes/enum/enum.doc.mjs +7 -4
- package/authoring/doctypes/function/function.doc.mjs +9 -8
- package/authoring/doctypes/hook/hook.doc.mjs +5 -4
- package/authoring/doctypes/hook/type.ts +4 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
- package/authoring/doctypes/reference/reference.doc.mjs +12 -11
- package/authoring/doctypes/schema/schema.doc.mjs +10 -10
- package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
- package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
- package/authoring/doctypes/template/parse.d.mts +6 -2
- package/authoring/doctypes/template/parse.mjs +3 -1
- package/authoring/doctypes/template/template.doc.mjs +3 -3
- package/authoring/doctypes/template/type.ts +22 -0
- package/authoring/doctypes/theme/theme.doc.mjs +2 -2
- package/authoring/gap-report/gap-report.doc.mjs +2 -2
- package/authoring/identity/identity.doc.mjs +3 -3
- package/authoring/index.d.ts +2 -0
- package/authoring/integration/integration.doc.mjs +30 -6
- package/authoring/integration/parse.test.mjs +21 -0
- package/authoring/integration/schema.d.mts +16 -3
- package/authoring/integration/schema.mjs +34 -2
- package/authoring/integration/type.ts +13 -1
- package/clients/cli/bin/astryx.mjs +11 -65
- package/clients/cli/cli-command.test.mjs +166 -0
- package/clients/cli/command-result-coverage.test.mjs +6 -5
- package/clients/cli/commands/blog.doc.mjs +1 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
- package/clients/cli/commands/build-theme.color-scheme.test.mjs +1 -1
- package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
- package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
- package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
- package/clients/cli/commands/build.doc.mjs +1 -0
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
- package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
- package/clients/cli/commands/component.doc.mjs +1 -0
- package/clients/cli/commands/{component/index.mjs → component.mjs} +37 -37
- package/clients/cli/commands/component.test.mjs +6 -6
- package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
- package/clients/cli/commands/discover.doc.mjs +9 -1
- package/clients/cli/commands/discover.mjs +144 -93
- package/clients/cli/commands/discover.no-source.test.mjs +448 -33
- package/clients/cli/commands/discover.sources.test.mjs +20 -1
- package/clients/cli/commands/docs.doc.mjs +3 -2
- package/clients/cli/commands/docs.mjs +50 -20
- package/clients/cli/commands/docs.test.mjs +16 -16
- package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +22 -2
- package/clients/cli/commands/doctor-integration.test.mjs +936 -3
- package/clients/cli/commands/doctor.doc.mjs +12 -2
- package/clients/cli/commands/doctor.mjs +332 -7
- package/clients/cli/commands/doctor.test.mjs +75 -4
- package/clients/cli/commands/gap-report.doc.mjs +15 -2
- package/clients/cli/commands/gap-report.mjs +24 -2
- package/clients/cli/commands/gap-report.test.mjs +79 -0
- package/clients/cli/commands/hook.doc.mjs +1 -0
- package/clients/cli/commands/{hook/index.mjs → hook.mjs} +22 -22
- package/clients/cli/commands/import-hint-correctness.test.mjs +1 -1
- package/clients/cli/commands/init.behavior.test.mjs +235 -1
- package/clients/cli/commands/init.doc.mjs +55 -10
- package/clients/cli/commands/init.flag-help.test.mjs +1 -0
- package/clients/cli/commands/init.mjs +2 -2
- package/clients/cli/commands/integration-add.doc.mjs +7 -0
- package/clients/cli/commands/integration-authoring.test.mjs +49 -3
- package/clients/cli/commands/integration-check.doc.mjs +93 -0
- package/clients/cli/commands/integration-check.test.mjs +489 -0
- package/clients/cli/commands/integration-pack.doc.mjs +8 -1
- package/clients/cli/commands/integration-verify.doc.mjs +8 -1
- package/clients/cli/commands/integration.doc.mjs +6 -2
- package/clients/cli/commands/integration.mjs +119 -7
- package/clients/cli/commands/json-contract.test.mjs +11 -2
- package/clients/cli/commands/manifest.doc.mjs +2 -1
- package/clients/cli/commands/manifest.mjs +67 -0
- package/clients/cli/commands/outside-project.test.mjs +874 -0
- package/clients/cli/commands/postinstall.doc.mjs +23 -0
- package/clients/cli/commands/postinstall.mjs +31 -0
- package/clients/cli/commands/search.doc.mjs +1 -0
- package/clients/cli/commands/search.mjs +16 -11
- package/clients/cli/commands/search.test.mjs +429 -296
- package/clients/cli/commands/setup-nudge.test.mjs +180 -2
- package/clients/cli/commands/swizzle.doc.mjs +7 -0
- package/clients/cli/commands/swizzle.mjs +5 -3
- package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
- package/clients/cli/commands/template.doc.mjs +1 -0
- package/clients/cli/commands/text-json-parity.test.mjs +5 -0
- package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
- package/clients/cli/commands/theme-add.doc.mjs +8 -1
- package/clients/cli/commands/theme-build.doc.mjs +3 -2
- package/clients/cli/commands/theme-eject.doc.mjs +1 -0
- package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
- package/clients/cli/commands/theme-list.doc.mjs +1 -0
- package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
- package/clients/cli/commands/theme-remove.doc.mjs +7 -0
- package/clients/cli/commands/theme-targets.doc.mjs +1 -0
- package/clients/cli/commands/theme-template.doc.mjs +1 -0
- package/clients/cli/commands/theme-use.doc.mjs +7 -0
- package/clients/cli/commands/{build-theme.mjs → theme.mjs} +27 -14
- package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +26 -3
- package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
- package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
- package/clients/cli/commands/upgrade.mjs +9 -2
- package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
- package/clients/cli/commands/upgrade.subfolder-path.test.mjs +97 -0
- package/clients/cli/index.mjs +156 -100
- package/clients/cli/lib/cli-error.mjs +4 -1
- package/clients/cli/lib/component-format.mjs +1 -1
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +14 -9
- package/clients/cli/lib/exit-codes.test.mjs +5 -0
- package/clients/cli/lib/json-shim.mjs +3 -1
- package/clients/cli/lib/manifest.d.ts +9 -0
- package/clients/cli/lib/manifest.mjs +17 -1
- package/clients/cli/lib/manifest.test.mjs +37 -0
- package/clients/cli/lib/welcome-box.mjs +50 -0
- package/clients/cli/run.mjs +108 -0
- package/foundation/agent-docs/agent-doc-state.d.mts +67 -13
- package/foundation/agent-docs/agent-doc-state.mjs +123 -14
- package/foundation/agent-docs/agent-docs.d.mts +104 -15
- package/foundation/agent-docs/agent-docs.mjs +1028 -114
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +1239 -17
- package/foundation/agent-docs/agent-docs.test.mjs +683 -39
- package/foundation/agent-docs/computer-agent-text.d.mts +170 -0
- package/foundation/agent-docs/computer-agent-text.mjs +750 -0
- package/foundation/agent-docs/computer-agent-text.test.mjs +699 -0
- package/foundation/config/project.d.mts +35 -3
- package/foundation/config/project.mjs +243 -26
- package/foundation/config/project.test.mjs +122 -0
- package/foundation/config/theme-state.mjs +5 -4
- package/foundation/discovery/authoring-self-docs.d.mts +7 -0
- package/foundation/discovery/authoring-self-docs.mjs +17 -4
- package/foundation/discovery/authoring-self-docs.test.mjs +15 -3
- package/foundation/discovery/authoring-surface.d.mts +1 -1
- package/foundation/discovery/authoring-surface.mjs +2 -2
- package/foundation/discovery/authoring-surface.test.mjs +1 -1
- package/foundation/discovery/cli-self-docs.d.mts +2 -1
- package/foundation/discovery/cli-self-docs.mjs +22 -4
- package/foundation/discovery/cli-self-docs.test.mjs +3 -2
- package/foundation/discovery/component-discovery.d.mts +227 -10
- package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
- package/foundation/discovery/component-discovery.mjs +940 -57
- package/foundation/discovery/component-discovery.test.mjs +96 -0
- package/foundation/discovery/component-loader.d.mts +1 -1
- package/foundation/discovery/component-replacement.mjs +20 -1
- package/foundation/discovery/component-replacement.test.mjs +40 -0
- package/foundation/discovery/copied-passages.d.mts +216 -0
- package/foundation/discovery/copied-passages.mjs +720 -0
- package/foundation/discovery/copied-passages.test.mjs +124 -0
- package/foundation/discovery/doc-consistency.d.mts +34 -0
- package/foundation/discovery/doc-consistency.mjs +513 -0
- package/foundation/discovery/doc-consistency.test.mjs +347 -0
- package/foundation/discovery/doc-fluff.d.mts +112 -0
- package/foundation/discovery/doc-fluff.mjs +328 -0
- package/foundation/discovery/doc-fluff.test.mjs +142 -0
- package/foundation/discovery/doc-types.d.mts +157 -0
- package/foundation/discovery/doc-types.mjs +1231 -0
- package/foundation/discovery/doc-types.test.mjs +744 -0
- package/foundation/discovery/docs-discovery.d.mts +88 -0
- package/foundation/discovery/docs-discovery.mjs +97 -3
- package/foundation/discovery/integration-doc-files.d.mts +22 -0
- package/foundation/discovery/integration-doc-files.mjs +231 -0
- package/foundation/discovery/integration-doc-files.test.mjs +246 -0
- package/foundation/discovery/module-exports.d.mts +68 -0
- package/foundation/discovery/module-exports.mjs +609 -31
- package/foundation/discovery/module-exports.test.mjs +172 -0
- package/foundation/discovery/package-tsconfig.d.mts +14 -0
- package/foundation/discovery/package-tsconfig.mjs +228 -0
- package/foundation/discovery/package-tsconfig.test.mjs +210 -0
- package/foundation/discovery/project-typescript.d.mts +32 -0
- package/foundation/discovery/project-typescript.mjs +89 -0
- package/foundation/discovery/prop-drift.d.mts +297 -0
- package/foundation/discovery/prop-drift.mjs +2428 -0
- package/foundation/discovery/prop-drift.test.mjs +2337 -0
- package/foundation/discovery/runner-allowlist.d.mts +38 -0
- package/foundation/discovery/runner-allowlist.mjs +51 -0
- package/foundation/discovery/runner-commands.d.mts +77 -0
- package/foundation/discovery/runner-commands.mjs +294 -0
- package/foundation/discovery/runner-commands.test.mjs +128 -0
- package/foundation/discovery/stray-pointers.d.mts +52 -0
- package/foundation/discovery/stray-pointers.mjs +293 -0
- package/foundation/discovery/stray-pointers.test.mjs +86 -0
- package/foundation/discovery/template-adapter.mjs +92 -6
- package/foundation/discovery/template-needs.mjs +6 -46
- package/foundation/discovery/theme-discovery.mjs +147 -3
- package/foundation/discovery/theme-imports.mjs +8 -4
- package/foundation/discovery/theme-imports.test.mjs +1 -1
- package/foundation/discovery/type-match.d.mts +53 -0
- package/foundation/discovery/type-match.mjs +660 -0
- package/foundation/discovery/type-match.test.mjs +169 -0
- package/foundation/discovery/type-text.d.mts +68 -0
- package/foundation/discovery/type-text.mjs +658 -0
- package/foundation/discovery/type-text.test.mjs +196 -0
- package/foundation/discovery/unresolved-references.d.mts +62 -0
- package/foundation/discovery/unresolved-references.mjs +790 -0
- package/foundation/discovery/unresolved-references.test.mjs +567 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +84 -10
- package/foundation/doc-compiler/inputs.mjs +27 -1
- package/foundation/doc-compiler/inputs.test.mjs +0 -1
- package/foundation/doc-compiler/links.d.mts +41 -5
- package/foundation/doc-compiler/links.mjs +167 -28
- package/foundation/doc-compiler/links.test.mjs +97 -4
- package/foundation/doc-compiler/read.d.mts +1 -1
- package/foundation/doc-compiler/read.mjs +59 -1
- package/foundation/doc-compiler/read.test.mjs +11 -2
- package/foundation/doc-compiler/split-topic-keywords.test.mjs +3 -2
- package/foundation/doc-compiler/tree.d.mts +32 -6
- package/foundation/doc-compiler/tree.mjs +107 -44
- package/foundation/doc-compiler/tree.test.mjs +14 -7
- package/foundation/env/cli-command.d.mts +83 -0
- package/foundation/env/cli-command.mjs +152 -0
- package/foundation/env/cli-command.test.mjs +129 -0
- package/foundation/env/node-version.test.mjs +15 -3
- package/foundation/env/package-manager.d.mts +93 -9
- package/foundation/env/package-manager.global.test.mjs +66 -0
- package/foundation/env/package-manager.mjs +184 -13
- package/foundation/env/package-manager.test.mjs +341 -15
- package/foundation/env/project-scope.d.mts +9 -0
- package/foundation/env/project-scope.mjs +33 -0
- package/foundation/env/search-path.d.mts +42 -0
- package/foundation/env/search-path.mjs +205 -0
- package/foundation/env/search-path.test.mjs +122 -0
- package/foundation/env/user-dirs.d.mts +39 -0
- package/foundation/env/user-dirs.mjs +93 -0
- package/foundation/env/user-dirs.test.mjs +72 -0
- package/foundation/env/user-settings.d.mts +46 -0
- package/foundation/env/user-settings.mjs +106 -0
- package/foundation/env/user-settings.test.mjs +64 -0
- package/foundation/fs/file-protection.mjs +15 -1
- package/foundation/fs/module-loader.d.mts +2 -1
- package/foundation/fs/module-loader.mjs +60 -4
- package/foundation/fs/module-loader.stdout.test.mjs +3 -2
- package/foundation/fs/module-loader.test.mjs +194 -0
- package/foundation/fs/path-compare.d.mts +33 -0
- package/foundation/fs/path-compare.mjs +73 -0
- package/foundation/fs/paths.d.mts +122 -4
- package/foundation/fs/paths.mjs +675 -29
- package/foundation/fs/paths.test.mjs +439 -54
- package/foundation/fs/read-record.d.mts +18 -0
- package/foundation/fs/read-record.mjs +131 -0
- package/foundation/fs/read-record.test.mjs +77 -0
- package/foundation/integrations/autolink.d.mts +2 -1
- package/foundation/integrations/autolink.mjs +4 -13
- package/foundation/integrations/cli-peer-version.d.mts +36 -0
- package/foundation/integrations/cli-peer-version.mjs +132 -0
- package/foundation/integrations/cli-peer-version.test.mjs +354 -0
- package/foundation/integrations/computer-integrations.d.mts +81 -0
- package/foundation/integrations/computer-integrations.mjs +345 -0
- package/foundation/integrations/computer-integrations.test.mjs +292 -0
- package/foundation/integrations/contribution-inventory.d.mts +26 -20
- package/foundation/integrations/contribution-inventory.mjs +97 -8
- package/foundation/integrations/exports-subpaths.d.mts +57 -0
- package/foundation/integrations/exports-subpaths.mjs +113 -0
- package/foundation/integrations/integration-warnings.mjs +3 -2
- package/foundation/integrations/integration-warnings.test.mjs +8 -9
- package/foundation/integrations/integrations.d.mts +51 -1
- package/foundation/integrations/integrations.mjs +106 -4
- package/foundation/integrations/issue.ts +6 -0
- package/foundation/integrations/public-imports.d.mts +118 -0
- package/foundation/integrations/public-imports.mjs +1769 -0
- package/foundation/integrations/public-imports.test.mjs +1793 -0
- package/foundation/integrations/validate-contributions.d.mts +117 -0
- package/foundation/integrations/validate-contributions.mjs +1209 -14
- package/foundation/release/agent-text-worker.d.mts +4 -0
- package/foundation/release/agent-text-worker.mjs +52 -0
- package/foundation/release/cache.d.mts +310 -0
- package/foundation/release/cache.mjs +1216 -0
- package/foundation/release/cache.test.mjs +923 -0
- package/foundation/release/choose.d.mts +207 -0
- package/foundation/release/choose.mjs +677 -0
- package/foundation/release/choose.test.mjs +427 -0
- package/foundation/release/core-worker.d.mts +4 -0
- package/foundation/release/core-worker.mjs +38 -0
- package/foundation/release/global-state.d.mts +263 -0
- package/foundation/release/global-state.mjs +474 -0
- package/foundation/release/global-state.test.mjs +381 -0
- package/foundation/release/handoff.d.mts +79 -0
- package/foundation/release/handoff.e2e.test.mjs +278 -0
- package/foundation/release/handoff.mjs +524 -0
- package/foundation/release/lock-lease.d.mts +23 -0
- package/foundation/release/lock-lease.mjs +80 -0
- package/foundation/release/notices.d.mts +307 -0
- package/foundation/release/notices.mjs +707 -0
- package/foundation/release/notices.test.mjs +586 -0
- package/foundation/release/npm-guard.d.mts +4 -0
- package/foundation/release/npm-guard.mjs +126 -0
- package/foundation/release/project.d.mts +141 -0
- package/foundation/release/project.mjs +466 -0
- package/foundation/release/project.test.mjs +288 -0
- package/foundation/release/refresh-worker.d.mts +4 -0
- package/foundation/release/refresh-worker.mjs +27 -0
- package/foundation/release/run-context.d.mts +47 -0
- package/foundation/release/run-context.mjs +163 -0
- package/foundation/release/update-notice-env.d.mts +28 -0
- package/foundation/release/update-notice-env.mjs +39 -0
- package/foundation/response/base.d.ts +26 -3
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.doc.mjs +12 -0
- package/foundation/response/error-codes.mjs +17 -0
- package/foundation/response/error-codes.test.mjs +2 -0
- package/foundation/response/json-contract.test.mjs +7 -2
- package/foundation/response/json.mjs +4 -1
- package/foundation/response/response-types.doc.mjs +22 -11
- package/foundation/response/response-types.doc.test.mjs +46 -0
- package/foundation/response/response.doc.mjs +3 -3
- package/foundation/route/route.d.mts +285 -0
- package/foundation/route/route.mjs +324 -0
- package/foundation/route/route.test.mjs +153 -0
- package/foundation/runtime/hosted-runtime.test.mjs +403 -0
- package/foundation/runtime/locked-versions.d.mts +32 -0
- package/foundation/runtime/locked-versions.mjs +65 -0
- package/foundation/runtime/package-root.d.mts +91 -0
- package/foundation/runtime/package-root.mjs +174 -0
- package/foundation/runtime/package-set.d.mts +62 -0
- package/foundation/runtime/package-set.mjs +130 -0
- package/foundation/runtime/package-set.test.mjs +432 -0
- package/foundation/text/string-utils.d.mts +2 -1
- package/foundation/text/string-utils.mjs +16 -5
- package/foundation/text/suggest-order.d.mts +72 -0
- package/foundation/text/suggest-order.mjs +363 -0
- package/foundation/text/suggest-order.test.mjs +259 -0
- package/foundation/xle/browser-imports.test.mjs +74 -0
- package/foundation/xle/registry.mjs +4 -0
- package/foundation/xle/registry.test.mjs +28 -0
- package/host/door-conformance.test.mjs +274 -0
- package/host/index.d.ts +116 -0
- package/host/index.mjs +295 -0
- package/host/index.test.mjs +302 -0
- package/package.json +16 -11
- package/scripts/postinstall.mjs +24 -5
- package/assets/docs/tree/integrations.doc.mjs +0 -40
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
tokenizeQuery,
|
|
37
37
|
SEARCH_DOMAINS,
|
|
38
38
|
} from './search.mjs';
|
|
39
|
+
import {linkThisCliAsProjectCli} from '../../test-utils/release-fixtures.mjs';
|
|
39
40
|
|
|
40
41
|
const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
|
|
41
42
|
const cwd = REPO;
|
|
@@ -116,16 +117,16 @@ describe('search leaf — docs at the grain a reader reads them', () => {
|
|
|
116
117
|
.find(result => result.section === 'which-codemods-run');
|
|
117
118
|
expect(hit).toMatchObject({
|
|
118
119
|
domain: 'doc',
|
|
119
|
-
name: expect.stringMatching(/^
|
|
120
|
+
name: expect.stringMatching(/^authoring\/(?:.+\/)?codemods$/),
|
|
120
121
|
title: expect.stringMatching(/ › Codemods › Choose when a codemod runs$/),
|
|
121
122
|
});
|
|
122
123
|
expect(hit.parent).toBe(`astryx docs ${hit.name} --index`);
|
|
123
124
|
expect(hit.command).toBe(`astryx docs ${hit.name} which-codemods-run`);
|
|
124
125
|
const block = await search('token-ref', {cwd});
|
|
125
126
|
expect(block.data.results[0]).toMatchObject({
|
|
126
|
-
name: 'authoring',
|
|
127
|
+
name: 'authoring/field-reference',
|
|
127
128
|
section: 'reference-doc',
|
|
128
|
-
command: 'astryx docs authoring reference-doc',
|
|
129
|
+
command: 'astryx docs authoring/field-reference reference-doc',
|
|
129
130
|
});
|
|
130
131
|
const fn = await search('assertResponse', {cwd, type: 'doc'});
|
|
131
132
|
expect(fn.data.results[0]).toMatchObject({
|
|
@@ -147,13 +148,13 @@ describe('search leaf — docs at the grain a reader reads them', () => {
|
|
|
147
148
|
// keywords and the title the guides declare. A namespace's own
|
|
148
149
|
// keywords count, and a plural name is the name.
|
|
149
150
|
for (const [query, route] of [
|
|
150
|
-
['make an integration', /^
|
|
151
|
-
['build an integration', /^
|
|
152
|
-
['create an integration', /^
|
|
153
|
-
['integration', /^
|
|
154
|
-
['publish an integration', /^
|
|
151
|
+
['make an integration', /^authoring$/],
|
|
152
|
+
['build an integration', /^authoring$/],
|
|
153
|
+
['create an integration', /^authoring$/],
|
|
154
|
+
['integration', /^authoring$/],
|
|
155
|
+
['publish an integration', /^authoring$/],
|
|
155
156
|
// The troubleshooting guide, wherever the tree places it.
|
|
156
|
-
['troubleshoot integration', /^
|
|
157
|
+
['troubleshoot integration', /^authoring\/(?:.+\/)?troubleshooting$/],
|
|
157
158
|
]) {
|
|
158
159
|
const r = await search(query, {cwd, type: 'doc'});
|
|
159
160
|
const names = r.data.results.slice(0, 3).map(result => result.name);
|
|
@@ -166,7 +167,7 @@ describe('search leaf — docs at the grain a reader reads them', () => {
|
|
|
166
167
|
it(
|
|
167
168
|
'gives a top-level namespace hit the topic list as its parent',
|
|
168
169
|
async () => {
|
|
169
|
-
for (const [query, route] of [['
|
|
170
|
+
for (const [query, route] of [['foundations', 'foundations'], ['Astryx CLI', 'cli']]) {
|
|
170
171
|
const r = await search(query, {cwd, type: 'doc'});
|
|
171
172
|
expect(r.data.results).toContainEqual(
|
|
172
173
|
expect.objectContaining({
|
|
@@ -184,7 +185,7 @@ describe('search leaf — docs at the grain a reader reads them', () => {
|
|
|
184
185
|
'points a topic hit at its index, never a whole-topic read',
|
|
185
186
|
async () => {
|
|
186
187
|
// A guide the tree places, read from the tree rather than named.
|
|
187
|
-
const {data: integrations} = await docs('
|
|
188
|
+
const {data: integrations} = await docs('authoring');
|
|
188
189
|
const guide = integrations.slots
|
|
189
190
|
.flatMap(slot => slot.children)
|
|
190
191
|
.find(child => child.kind === 'generic').route;
|
|
@@ -439,9 +440,9 @@ describe('search leaf — a candidate that matches every word outranks a partial
|
|
|
439
440
|
const tokens = await search('tokens', {cwd});
|
|
440
441
|
expect(tokens.data.results[0]).toMatchObject({domain: 'doc', name: 'tokens'});
|
|
441
442
|
for (const [query, route] of [
|
|
442
|
-
['codemods', /^
|
|
443
|
-
['quick start', /^
|
|
444
|
-
['test in an app', /^
|
|
443
|
+
['codemods', /^authoring\/(?:.+\/)?codemods$/],
|
|
444
|
+
['quick start', /^authoring\/(?:.+\/)?quick-start$/],
|
|
445
|
+
['test in an app', /^authoring\/(?:.+\/)?test-in-an-app$/],
|
|
445
446
|
]) {
|
|
446
447
|
const r = await search(query, {cwd, type: 'doc'});
|
|
447
448
|
// The guide is among the hits that share the top score: two guides
|
|
@@ -470,8 +471,10 @@ describe('search leaf — error paths (pinned)', () => {
|
|
|
470
471
|
|
|
471
472
|
it('searches the docs without @astryxdesign/core, and throws for a domain that needs it', async () => {
|
|
472
473
|
const empty = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-search-no-core-'));
|
|
474
|
+
// A project whose own CLI answers, with no Core installed.
|
|
475
|
+
linkThisCliAsProjectCli(empty);
|
|
473
476
|
try {
|
|
474
|
-
// An open search
|
|
477
|
+
// An open search without Core covers the docs, as `astryx docs` does.
|
|
475
478
|
const open = await search('make an integration', {cwd: empty});
|
|
476
479
|
expect(open.data.results.length).toBeGreaterThan(0);
|
|
477
480
|
expect(new Set(open.data.results.map(r => r.domain))).toEqual(
|
|
@@ -616,6 +619,42 @@ describe('search leaf — a theme is found by its names; its description is pros
|
|
|
616
619
|
);
|
|
617
620
|
});
|
|
618
621
|
|
|
622
|
+
describe('search leaf — components whose docs live in a family folder', () => {
|
|
623
|
+
it("indexes a family member from its own entry, not the family's keywords", async () => {
|
|
624
|
+
// HStack and VStack are documented in Stack's doc, whose keywords
|
|
625
|
+
// (horizontal, vertical, row, column, ...) describe Stack.
|
|
626
|
+
const reasons = async (/** @type {string} */ query) =>
|
|
627
|
+
Object.fromEntries(
|
|
628
|
+
(await search(query, {cwd, type: 'component'})).data.results.map(r => [
|
|
629
|
+
r.name,
|
|
630
|
+
r.reason,
|
|
631
|
+
]),
|
|
632
|
+
);
|
|
633
|
+
const column = await reasons('column');
|
|
634
|
+
expect(column.HStack ?? '').not.toMatch(/keyword/);
|
|
635
|
+
expect(column.VStack ?? '').not.toMatch(/keyword/);
|
|
636
|
+
expect(column.Stack).toMatch(/keyword/);
|
|
637
|
+
const vertical = (await search('vertical', {cwd, type: 'component'})).data.results.map(
|
|
638
|
+
r => r.name,
|
|
639
|
+
);
|
|
640
|
+
expect(vertical.indexOf('VStack')).toBeGreaterThanOrEqual(0);
|
|
641
|
+
if (vertical.includes('HStack')) {
|
|
642
|
+
expect(vertical.indexOf('VStack')).toBeLessThan(vertical.indexOf('HStack'));
|
|
643
|
+
}
|
|
644
|
+
}, SLOW);
|
|
645
|
+
|
|
646
|
+
it('ranks VStack, HStack and Heading first for their own names, with their own import', async () => {
|
|
647
|
+
for (const name of ['VStack', 'HStack', 'Heading']) {
|
|
648
|
+
const r = await search(name.toLowerCase(), {cwd, type: 'component'});
|
|
649
|
+
expect(r.data.results[0]).toMatchObject({
|
|
650
|
+
domain: 'component',
|
|
651
|
+
name,
|
|
652
|
+
import: `@astryxdesign/core/${name}`,
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}, SLOW);
|
|
656
|
+
});
|
|
657
|
+
|
|
619
658
|
describe('search leaf — integration components', () => {
|
|
620
659
|
/**
|
|
621
660
|
* A minimal consumer project: a stub `@astryxdesign/core` (so `findCoreDir`
|
|
@@ -827,3 +866,142 @@ describe('search — usage guidance is indexed, a tier below description', () =>
|
|
|
827
866
|
expect(hit?.score).toBe(45);
|
|
828
867
|
});
|
|
829
868
|
});
|
|
869
|
+
|
|
870
|
+
describe('search leaf — compound names, other names, and word forms', () => {
|
|
871
|
+
it('finds a compound name typed as separate words inside a longer query', async () => {
|
|
872
|
+
const {data} = await search('table header cell with sort arrow', {cwd});
|
|
873
|
+
expect(
|
|
874
|
+
data.results.slice(0, 3).map(r => r.name),
|
|
875
|
+
).toContain('TableHeaderCell');
|
|
876
|
+
}, SLOW);
|
|
877
|
+
|
|
878
|
+
it('finds a one-word keyword typed as separate words', async () => {
|
|
879
|
+
// MetadataList declares `keyvalue`.
|
|
880
|
+
const {data} = await search('key value pairs', {cwd});
|
|
881
|
+
expect(data.results[0]).toMatchObject({
|
|
882
|
+
domain: 'component',
|
|
883
|
+
name: 'MetadataList',
|
|
884
|
+
});
|
|
885
|
+
}, SLOW);
|
|
886
|
+
|
|
887
|
+
it('finds a hook named by its words without the `use` prefix', async () => {
|
|
888
|
+
const {data} = await search('persisted table column settings', {cwd});
|
|
889
|
+
expect(data.results[0]).toMatchObject({
|
|
890
|
+
domain: 'hook',
|
|
891
|
+
name: 'useTableColumnSettings',
|
|
892
|
+
});
|
|
893
|
+
}, SLOW);
|
|
894
|
+
|
|
895
|
+
it('reads a camelCase identifier as the words it spells', async () => {
|
|
896
|
+
const {data} = await search('useTablePaginationState', {cwd});
|
|
897
|
+
expect(data.results[0]).toMatchObject({
|
|
898
|
+
domain: 'hook',
|
|
899
|
+
name: 'useTablePagination',
|
|
900
|
+
});
|
|
901
|
+
}, SLOW);
|
|
902
|
+
|
|
903
|
+
it('keeps each identifier of a multi-word query whole', async () => {
|
|
904
|
+
const {data} = await search('ChatMessageList ChatComposer', {cwd});
|
|
905
|
+
expect(data.results.slice(0, 2).map(r => r.name).sort()).toEqual([
|
|
906
|
+
'ChatComposer',
|
|
907
|
+
'ChatMessageList',
|
|
908
|
+
]);
|
|
909
|
+
}, SLOW);
|
|
910
|
+
|
|
911
|
+
it("finds a component by another library's name for it", async () => {
|
|
912
|
+
for (const [q, name] of [
|
|
913
|
+
['ScrollArea viewport', 'ScrollableArea'],
|
|
914
|
+
['toggle group of buttons', 'ToggleButtonGroup'],
|
|
915
|
+
['circular progress for uploads', 'Spinner'],
|
|
916
|
+
]) {
|
|
917
|
+
const {data} = await search(q, {cwd});
|
|
918
|
+
expect(data.results[0], q).toMatchObject({domain: 'component', name});
|
|
919
|
+
}
|
|
920
|
+
}, SLOW);
|
|
921
|
+
|
|
922
|
+
it('reads a one-identifier other name as typed', async () => {
|
|
923
|
+
const {data} = await search('AppHeader', {cwd});
|
|
924
|
+
expect(data.results[0]).toMatchObject({
|
|
925
|
+
domain: 'component',
|
|
926
|
+
name: 'LayoutHeader',
|
|
927
|
+
});
|
|
928
|
+
}, SLOW);
|
|
929
|
+
|
|
930
|
+
it('adds no near siblings beside an entry the query names outright', async () => {
|
|
931
|
+
const {data} = await search('top nav mega menu', {cwd});
|
|
932
|
+
expect(data.results[0]).toMatchObject({name: 'TopNavMegaMenu'});
|
|
933
|
+
// Its sub-parts start with its name; read joined they would score in the
|
|
934
|
+
// whole-name tier right under it.
|
|
935
|
+
const siblings = data.results.filter(
|
|
936
|
+
r => r.name !== 'TopNavMegaMenu' && r.name.startsWith('TopNavMegaMenu'),
|
|
937
|
+
);
|
|
938
|
+
for (const sibling of siblings) expect(sibling.score).toBeLessThan(190);
|
|
939
|
+
}, SLOW);
|
|
940
|
+
|
|
941
|
+
it('ranks an entry the query names above a match on part of another name', async () => {
|
|
942
|
+
// `table header` names TableHeader; useTableStickyColumns only holds the
|
|
943
|
+
// words `sticky columns`.
|
|
944
|
+
const {data} = await search('table header with sticky columns', {cwd});
|
|
945
|
+
const names = data.results.map(r => r.name);
|
|
946
|
+
expect(names.indexOf('TableHeader')).toBeLessThan(
|
|
947
|
+
names.indexOf('useTableStickyColumns') === -1
|
|
948
|
+
? Infinity
|
|
949
|
+
: names.indexOf('useTableStickyColumns'),
|
|
950
|
+
);
|
|
951
|
+
}, SLOW);
|
|
952
|
+
|
|
953
|
+
it('keeps an entry a query word names by its whole name at its own rank', async () => {
|
|
954
|
+
// Two words join into TextInput, and TextArea also matches two words
|
|
955
|
+
// through its joined keyword; one word is still TextArea's whole name.
|
|
956
|
+
const {data} = await search('text input and textarea with multi line', {
|
|
957
|
+
cwd,
|
|
958
|
+
});
|
|
959
|
+
expect(data.results[0]).toMatchObject({name: 'TextArea'});
|
|
960
|
+
}, SLOW);
|
|
961
|
+
|
|
962
|
+
it('ranks a match on more of the query above a shorter named entry', async () => {
|
|
963
|
+
const {data} = await search('dropdown menu radio options', {cwd});
|
|
964
|
+
expect(data.results[0]).toMatchObject({name: 'DropdownMenuRadioItem'});
|
|
965
|
+
}, SLOW);
|
|
966
|
+
|
|
967
|
+
it('lets a plural start a name through its singular', () => {
|
|
968
|
+
expect(
|
|
969
|
+
scoreCandidate('tokens', {domain: 'component', name: 'Tokenizer'}),
|
|
970
|
+
).toMatchObject({score: 60});
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
it('finds Icon by a glyph name', async () => {
|
|
974
|
+
for (const q of ['cog', 'lightning bolt']) {
|
|
975
|
+
const {data} = await search(q, {cwd});
|
|
976
|
+
expect(data.results[0], q).toMatchObject({
|
|
977
|
+
domain: 'component',
|
|
978
|
+
name: 'Icon',
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
}, SLOW);
|
|
982
|
+
|
|
983
|
+
it('matches a verb form against its verb', () => {
|
|
984
|
+
// "spacing" lost the final e of "space".
|
|
985
|
+
expect(
|
|
986
|
+
scoreCandidate('spacing', {domain: 'component', name: 'Gap', keywords: ['space']}),
|
|
987
|
+
).toMatchObject({score: 88});
|
|
988
|
+
expect(
|
|
989
|
+
scoreCandidate('dragging', {domain: 'component', name: 'Gap', keywords: ['drag']}),
|
|
990
|
+
).toMatchObject({score: 88});
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
it('lets a plural start a longer word through its singular', () => {
|
|
994
|
+
expect(
|
|
995
|
+
scoreCandidate('chips', {domain: 'component', name: 'Chipset'}),
|
|
996
|
+
).toMatchObject({score: 60});
|
|
997
|
+
// A four-letter singular is too short: "stats" does not start "statusbar".
|
|
998
|
+
expect(
|
|
999
|
+
scoreCandidate('stats', {domain: 'component', name: 'Statusbar'}),
|
|
1000
|
+
).toBeNull();
|
|
1001
|
+
});
|
|
1002
|
+
|
|
1003
|
+
it('leaves an identifier joined with _ unmatched when nothing has it', async () => {
|
|
1004
|
+
const {data} = await search('qqzz_no_match_here', {cwd});
|
|
1005
|
+
expect(data.results).toEqual([]);
|
|
1006
|
+
}, SLOW);
|
|
1007
|
+
});
|
|
@@ -18,7 +18,12 @@ export type SearchResultEntry = {
|
|
|
18
18
|
*/
|
|
19
19
|
name: string;
|
|
20
20
|
/**
|
|
21
|
-
* -
|
|
21
|
+
* - How strongly the query matched this entry (higher is
|
|
22
|
+
* stronger). Search keeps the lexical ranker's order between score bands,
|
|
23
|
+
* including its domain priority, which can place a weaker non-doc match above
|
|
24
|
+
* a stronger doc; within a run of one score band and kind it orders matches
|
|
25
|
+
* by its static ordering weights, so a lower score can lead inside a band.
|
|
26
|
+
* Build's `blocks` use their own order.
|
|
22
27
|
*/
|
|
23
28
|
score: number;
|
|
24
29
|
/**
|
|
@@ -30,7 +35,7 @@ export type SearchResultEntry = {
|
|
|
30
35
|
*/
|
|
31
36
|
description: string;
|
|
32
37
|
/**
|
|
33
|
-
* - Follow-up command to act on this result (e.g. `astryx component Button`, or `astryx theme add neutral` for a theme).
|
|
38
|
+
* - Follow-up command to act on this result (e.g. `astryx component Button`, or `astryx theme add neutral` for a theme; `astryx theme eject neutral` outside a project).
|
|
34
39
|
*/
|
|
35
40
|
command: string;
|
|
36
41
|
/**
|
|
@@ -72,6 +77,19 @@ export type SearchResponse = {
|
|
|
72
77
|
matchCount: number;
|
|
73
78
|
results: SearchResultEntry[];
|
|
74
79
|
};
|
|
80
|
+
/**
|
|
81
|
+
* -
|
|
82
|
+
* `partial`, when an open search could not get the Core that components,
|
|
83
|
+
* hooks, and templates are read from (such as outside a project, offline,
|
|
84
|
+
* before the release's Core was downloaded): the domains it skipped and why.
|
|
85
|
+
* The results are the docs and themes.
|
|
86
|
+
*/
|
|
87
|
+
meta?: {
|
|
88
|
+
partial?: {
|
|
89
|
+
skipped: SearchDomain[];
|
|
90
|
+
reason: string;
|
|
91
|
+
};
|
|
92
|
+
} | undefined;
|
|
75
93
|
};
|
|
76
94
|
/**
|
|
77
95
|
* Options for `search()`.
|
|
@@ -17,10 +17,15 @@
|
|
|
17
17
|
* @typedef {object} SearchResultEntry
|
|
18
18
|
* @property {SearchDomain} domain - Which content domain this result came from.
|
|
19
19
|
* @property {string} name - Primary identifier (component/hook name, doc topic or docs-tree route, template dir, theme slug).
|
|
20
|
-
* @property {number} score -
|
|
20
|
+
* @property {number} score - How strongly the query matched this entry (higher is
|
|
21
|
+
* stronger). Search keeps the lexical ranker's order between score bands,
|
|
22
|
+
* including its domain priority, which can place a weaker non-doc match above
|
|
23
|
+
* a stronger doc; within a run of one score band and kind it orders matches
|
|
24
|
+
* by its static ordering weights, so a lower score can lead inside a band.
|
|
25
|
+
* Build's `blocks` use their own order.
|
|
21
26
|
* @property {string} reason - Human-readable reason the candidate matched (e.g. `keyword "button"`).
|
|
22
27
|
* @property {string} description - One-line description, when available.
|
|
23
|
-
* @property {string} command - Follow-up command to act on this result (e.g. `astryx component Button`, or `astryx theme add neutral` for a theme).
|
|
28
|
+
* @property {string} command - Follow-up command to act on this result (e.g. `astryx component Button`, or `astryx theme add neutral` for a theme; `astryx theme eject neutral` outside a project).
|
|
24
29
|
* @property {string} [import] - Import path — present for component and hook results.
|
|
25
30
|
* @property {string} [title] - Doc title — present for doc results.
|
|
26
31
|
* @property {string} [section] - Section key — present when a doc result is one section of a topic; `command` reads only that section.
|
|
@@ -38,6 +43,11 @@
|
|
|
38
43
|
* @property {string} data.query
|
|
39
44
|
* @property {number} data.matchCount - How many candidates matched the query in total, before `limit` was applied. `results` is the bounded slice of that set, so `matchCount > results.length` means the answer was capped.
|
|
40
45
|
* @property {SearchResultEntry[]} data.results
|
|
46
|
+
* @property {{partial?: {skipped: SearchDomain[], reason: string}}} [meta] -
|
|
47
|
+
* `partial`, when an open search could not get the Core that components,
|
|
48
|
+
* hooks, and templates are read from (such as outside a project, offline,
|
|
49
|
+
* before the release's Core was downloaded): the domains it skipped and why.
|
|
50
|
+
* The results are the docs and themes.
|
|
41
51
|
*/
|
|
42
52
|
|
|
43
53
|
/**
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
export const SEARCH_TREE: import("../../foundation/route/route.mjs").Tree<SearchRequest, import("./_adapter.mjs").SearchCatalog, import("./search.type.mjs").SearchResponse>;
|
|
5
|
+
export type SearchRequest = {
|
|
6
|
+
query: string;
|
|
7
|
+
options: {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
type?: import("./search.type.mjs").SearchDomain;
|
|
10
|
+
limit?: number;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type SearchCatalog = import("./_adapter.mjs").SearchCatalog;
|
|
14
|
+
export type SearchAnswer = import("./search.type.mjs").SearchResponse;
|
|
15
|
+
export type SearchKit = import("../../foundation/route/route.mjs").RouteKit<SearchRequest, SearchCatalog, SearchAnswer>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file How search answers: a root classifier reads the query's words and
|
|
5
|
+
* guesses the domain it wants (tree.weights.json), and hands it to that
|
|
6
|
+
* domain's topic searcher when it is sure enough; otherwise the main searcher
|
|
7
|
+
* keeps it. Adding a topic searcher is one file and one line here.
|
|
8
|
+
* @input {query, options} and the gathered catalog with its static data
|
|
9
|
+
* @output the search response
|
|
10
|
+
* @position api/search; search.mjs runs it with the shared route helper
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {routeKit} from '../../foundation/route/route.mjs';
|
|
14
|
+
import {routerTokens} from './_query-words.mjs';
|
|
15
|
+
import {doc} from './_doc-searcher.mjs';
|
|
16
|
+
import {main} from './_main-searcher.mjs';
|
|
17
|
+
import {template} from './_template-searcher.mjs';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {{query: string, options: {cwd?: string, type?: import('./search.type.mjs').SearchDomain, limit?: number}}} SearchRequest
|
|
21
|
+
* @typedef {import('./_adapter.mjs').SearchCatalog} SearchCatalog
|
|
22
|
+
* @typedef {import('./search.type.mjs').SearchResponse} SearchAnswer
|
|
23
|
+
* @typedef {import('../../foundation/route/route.mjs').RouteKit<SearchRequest, SearchCatalog, SearchAnswer>} SearchKit
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** @type {SearchKit} */
|
|
27
|
+
const {defineClassifier, defineTree} = routeKit;
|
|
28
|
+
|
|
29
|
+
const root = defineClassifier({
|
|
30
|
+
id: 'root',
|
|
31
|
+
summary:
|
|
32
|
+
'Guesses the domain a query wants from its words and hands it to that topic searcher, else to the main searcher.',
|
|
33
|
+
searchers: {doc: doc.id, template: template.id},
|
|
34
|
+
fallback: main.id,
|
|
35
|
+
floor: 0.4,
|
|
36
|
+
features: request => routerTokens(request.query),
|
|
37
|
+
weights: catalog => catalog.data.router,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const SEARCH_TREE = defineTree('root', [root, main, doc, template]);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Tests for the search tree's root dispatcher (tree.mjs): the router
|
|
5
|
+
* sends a query to the topic searcher of the domain it wants, and every other
|
|
6
|
+
* query to the main searcher. Run against the real @astryxdesign/core.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {describe, it, expect} from 'vitest';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import {fileURLToPath} from 'node:url';
|
|
12
|
+
import {runTree} from '../../foundation/route/route.mjs';
|
|
13
|
+
import {gatherCandidates, loadSearchData} from './_adapter.mjs';
|
|
14
|
+
import {routeProbs, ROUTES} from './_query-words.mjs';
|
|
15
|
+
import {SEARCH_TREE} from './tree.mjs';
|
|
16
|
+
|
|
17
|
+
const REPO = path.resolve(
|
|
18
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
19
|
+
'../../../..',
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
/** @param {string} query */
|
|
23
|
+
async function route(query) {
|
|
24
|
+
const catalog = {
|
|
25
|
+
...(await gatherCandidates({cwd: REPO})),
|
|
26
|
+
data: loadSearchData(),
|
|
27
|
+
};
|
|
28
|
+
/** @type {string[]} */
|
|
29
|
+
const steps = [];
|
|
30
|
+
const answer = await runTree(
|
|
31
|
+
SEARCH_TREE,
|
|
32
|
+
{query, options: {cwd: REPO}},
|
|
33
|
+
catalog,
|
|
34
|
+
{
|
|
35
|
+
tuning: {onTrace: e => steps.push(e.id)},
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
return {steps, answer: /** @type {any} */ (answer)};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
describe('search tree', () => {
|
|
42
|
+
it('sends a doc question to the doc searcher', async () => {
|
|
43
|
+
const {steps, answer} = await route('how do I install a theme');
|
|
44
|
+
expect(steps).toEqual(['root', 'doc']);
|
|
45
|
+
expect(answer.data.results[0].domain).toBe('doc');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('sends a page request to the template searcher', async () => {
|
|
49
|
+
const {steps, answer} = await route('page of settings with a side menu');
|
|
50
|
+
expect(steps).toEqual(['root', 'template']);
|
|
51
|
+
expect(
|
|
52
|
+
answer.data.results.slice(0, 3).map((/** @type {any} */ r) => r.name),
|
|
53
|
+
).toContain('settings');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('sends a component query to the main searcher', async () => {
|
|
57
|
+
const {steps} = await route('date chooser');
|
|
58
|
+
expect(steps).toEqual(['root', 'main']);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('gives one probability per class that sums to one', () => {
|
|
62
|
+
const p = routeProbs(loadSearchData().router, 'toast notice');
|
|
63
|
+
expect(p).toHaveLength(ROUTES.length);
|
|
64
|
+
expect(p.reduce((a, b) => a + b, 0)).toBeCloseTo(1, 12);
|
|
65
|
+
});
|
|
66
|
+
});
|