@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
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file init command — thin wrapper around the init API.
|
|
5
5
|
*
|
|
6
|
-
* `astryx init` is non-interactive by default: it installs the
|
|
7
|
-
*
|
|
6
|
+
* `astryx init` is non-interactive by default: it installs the agent-docs
|
|
7
|
+
* cheat sheet with NO prompts, so it behaves identically for humans,
|
|
8
8
|
* AI agents, CI, and piped I/O — it never hangs or errors on a missing TTY.
|
|
9
9
|
* Non-interactive feature install: `astryx init --features agents,theme,template`
|
|
10
10
|
* Re-runnable: safe to run multiple times, idempotent.
|
|
@@ -113,6 +113,7 @@ export const doc = {
|
|
|
113
113
|
cli: 'astryx integration add theme ocean --from neutral',
|
|
114
114
|
},
|
|
115
115
|
],
|
|
116
|
+
outsideProject: 'refuse',
|
|
116
117
|
exitCodes: [
|
|
117
118
|
{code: 0, when: 'the contribution is written or the dry run succeeds'},
|
|
118
119
|
{
|
|
@@ -121,4 +122,10 @@ export const doc = {
|
|
|
121
122
|
},
|
|
122
123
|
],
|
|
123
124
|
related: ['integration verify', 'doctor integration validate', 'theme add'],
|
|
125
|
+
notes: [
|
|
126
|
+
{
|
|
127
|
+
type: 'prose',
|
|
128
|
+
text: "In global mode: outside a package, integration add writes nothing and stops with `ERR_FILE_NOT_FOUND`: \"No package.json found. Run this command inside an integration package.\" In a project, the project's version of Astryx runs it, whichever astryx command you start. See {@link namespace:global} and {@link generic:global-integrations}.",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
124
131
|
};
|
|
@@ -147,6 +147,52 @@ describe('integration authoring CLI', () => {
|
|
|
147
147
|
);
|
|
148
148
|
});
|
|
149
149
|
|
|
150
|
+
it("verify carries each issue's fix, file, and line in JSON and prints them in text", async () => {
|
|
151
|
+
fs.writeFileSync(
|
|
152
|
+
path.join(tmpDir, 'package.json'),
|
|
153
|
+
`${JSON.stringify({
|
|
154
|
+
name: '@acme/widgets',
|
|
155
|
+
version: '1.0.0',
|
|
156
|
+
files: ['astryx.integration.mjs', 'docs'],
|
|
157
|
+
})}\n`,
|
|
158
|
+
);
|
|
159
|
+
fs.writeFileSync(
|
|
160
|
+
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
161
|
+
"export default {docs: './docs'};\n",
|
|
162
|
+
);
|
|
163
|
+
fs.mkdirSync(path.join(tmpDir, 'docs'));
|
|
164
|
+
fs.writeFileSync(
|
|
165
|
+
path.join(tmpDir, 'docs', 'deploying.doc.mjs'),
|
|
166
|
+
"export const docs = {type: 'generic', name: 'deploying', title: 'Deploying', description: 'How to deploy.', sections: [{title: 'Overview', content: [{type: 'prose', text: 'Ship it.'}]}]};\n",
|
|
167
|
+
);
|
|
168
|
+
fs.writeFileSync(
|
|
169
|
+
path.join(tmpDir, 'docs', 'ghost.doc.zh.mjs'),
|
|
170
|
+
"export default {title: 'ghost'};\n",
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const json = parseEnvelope(
|
|
174
|
+
(await runCli(['integration', 'verify', '--json'], tmpDir)).stdout,
|
|
175
|
+
);
|
|
176
|
+
const orphans = json.data.issues.filter(issue =>
|
|
177
|
+
issue.code.endsWith('orphan_doc_overlay'),
|
|
178
|
+
);
|
|
179
|
+
expect(orphans.map(issue => issue.code).sort()).toEqual([
|
|
180
|
+
'orphan_doc_overlay',
|
|
181
|
+
'packed_orphan_doc_overlay',
|
|
182
|
+
]);
|
|
183
|
+
for (const issue of orphans) {
|
|
184
|
+
expect(issue).toMatchObject({
|
|
185
|
+
file: 'docs/ghost.doc.zh.mjs',
|
|
186
|
+
line: 1,
|
|
187
|
+
fix: expect.stringContaining('Delete docs/ghost.doc.zh.mjs'),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const text = (await runCli(['integration', 'verify'], tmpDir)).stdout;
|
|
192
|
+
expect(text).toContain('file: docs/ghost.doc.zh.mjs:1');
|
|
193
|
+
expect(text).toContain(`fix: ${orphans[0].fix}`);
|
|
194
|
+
});
|
|
195
|
+
|
|
150
196
|
it('keeps `integration pack --check` as a deprecated alias of `integration verify`', async () => {
|
|
151
197
|
// The old spelling runs the same check: the same JSON, the same exit code.
|
|
152
198
|
const verify = await runCli(['integration', 'verify', '--json'], tmpDir);
|
|
@@ -173,7 +219,7 @@ describe('integration authoring CLI', () => {
|
|
|
173
219
|
expect(text.status).toBe(verifyText.status);
|
|
174
220
|
expect(text.stdout).toBe(verifyText.stdout);
|
|
175
221
|
expect(text.stderr).toContain('`integration pack --check` is deprecated');
|
|
176
|
-
expect(text.stderr).toContain('
|
|
222
|
+
expect(text.stderr).toContain(' integration verify`');
|
|
177
223
|
// Without --check it fails, as it did, and points only at the new name:
|
|
178
224
|
// suggesting `--check` would send people to the deprecated spelling.
|
|
179
225
|
const bare = await runCli(['integration', 'pack'], tmpDir);
|
|
@@ -181,13 +227,13 @@ describe('integration authoring CLI', () => {
|
|
|
181
227
|
expect(bare.stderr).toContain(
|
|
182
228
|
'`integration pack` is now `integration verify`',
|
|
183
229
|
);
|
|
184
|
-
expect(bare.stderr).toContain('
|
|
230
|
+
expect(bare.stderr).toContain(' integration verify`');
|
|
185
231
|
expect(bare.stderr).toContain('npm pack');
|
|
186
232
|
expect(bare.stderr).not.toContain('--check');
|
|
187
233
|
const bareJson = await runCli(['--json', 'integration', 'pack'], tmpDir);
|
|
188
234
|
expect(parseEnvelope(bareJson.stdout)).toMatchObject({
|
|
189
235
|
code: 'ERR_INVALID_ARGUMENT',
|
|
190
|
-
error: expect.stringContaining('
|
|
236
|
+
error: expect.stringContaining(' integration verify`'),
|
|
191
237
|
});
|
|
192
238
|
// Help lists it, marked deprecated: nothing is hidden.
|
|
193
239
|
const help = await runCli(['integration', '--help'], tmpDir);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file CommandDoc for `astryx integration check`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** @type {import('@astryxdesign/cli/authoring').CommandDoc} */
|
|
8
|
+
export const doc = {
|
|
9
|
+
type: 'command',
|
|
10
|
+
name: 'integration check',
|
|
11
|
+
displayName: 'astryx integration check',
|
|
12
|
+
namespace: 'cli/commands',
|
|
13
|
+
summary:
|
|
14
|
+
"The CI check for an integration package's own build: every source check, run in continuous integration or a typecheck script, against the package in the current folder",
|
|
15
|
+
description:
|
|
16
|
+
'Takes no package argument: it runs the four `doctor integration` checks, ' +
|
|
17
|
+
'`validate`, `components`, `templates`, and `docs`, against the integration ' +
|
|
18
|
+
'package in the current folder, which is where its own build runs it. It prints ' +
|
|
19
|
+
'each result as that check ' +
|
|
20
|
+
'prints it, then a summary with the errors, warnings, and skipped work of each, ' +
|
|
21
|
+
'and exits 1 when any of the four would exit 1 on its own. With `--strict` it ' +
|
|
22
|
+
'also exits 1 on any warning and on any check, or comparison within a check, ' +
|
|
23
|
+
'that did not run, such as a package with no `astryx.integration.*` or a ' +
|
|
24
|
+
'comparison skipped because the project has no TypeScript, or prop types not ' +
|
|
25
|
+
'judged because its TypeScript is older than 4.8: it adds no check, ' +
|
|
26
|
+
'and lists each of those again as an error, after the checks, in their own ' +
|
|
27
|
+
'issue format. That is the line ' +
|
|
28
|
+
"for the package's own build, so its docs, types, and links stay in sync: run " +
|
|
29
|
+
'it as a `ci` step, or add ' +
|
|
30
|
+
'`"typecheck": "tsc --noEmit && astryx integration check --strict"` to the ' +
|
|
31
|
+
'scripts in package.json. Its exit codes and JSON are a contract for the builds ' +
|
|
32
|
+
'that run it: a new check, or a new failure code, joins only in a minor release ' +
|
|
33
|
+
'that names it in the release notes. A patch can still ship a Core component, ' +
|
|
34
|
+
'template, or CLI topic whose name conflicts with one of yours. Run ' +
|
|
35
|
+
'`integration check` on every build; run ' +
|
|
36
|
+
'`integration verify` before you publish, to check that the packed package ' +
|
|
37
|
+
'works in an app. To check an installed integration by name, run the ' +
|
|
38
|
+
'`doctor integration` subcommands with its package name. Outside a package, ' +
|
|
39
|
+
'it writes nothing, `validate` reports one `no_package` issue, and it exits 1.',
|
|
40
|
+
fn: 'integrationCheck',
|
|
41
|
+
options: [
|
|
42
|
+
{
|
|
43
|
+
flag: '--strict',
|
|
44
|
+
param: 'options.strict',
|
|
45
|
+
description:
|
|
46
|
+
'Also exit 1 on any warning and on any check that did not run. A new check or failure code joins only in a minor release, named in the release notes; until then, a malformed `cliCommand` is reported as a note (`invalid_cli_command`) that fails nothing.',
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
examples: [
|
|
50
|
+
{
|
|
51
|
+
label:
|
|
52
|
+
'In CI, as the typecheck script: add "typecheck": "tsc --noEmit && astryx integration check --strict" to package.json',
|
|
53
|
+
cli: 'integration check --strict',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
label: 'Errors only, while you fix the warnings a package already has',
|
|
57
|
+
cli: 'integration check',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
label: 'Read the result as JSON',
|
|
61
|
+
cli: 'integration check --strict --json',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
label:
|
|
65
|
+
'Before you publish: check that the packed package works in an app',
|
|
66
|
+
cli: 'integration verify',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
outsideProject: 'own',
|
|
70
|
+
exitCodes: [
|
|
71
|
+
{
|
|
72
|
+
code: 0,
|
|
73
|
+
when: 'no check fails on its own; with --strict, also no warning, and every check ran',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
code: 1,
|
|
77
|
+
when: 'a check fails on its own (an error); with --strict, also any warning, or a check that did not run',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
related: [
|
|
81
|
+
'integration verify',
|
|
82
|
+
'doctor integration validate',
|
|
83
|
+
'doctor integration components',
|
|
84
|
+
'doctor integration templates',
|
|
85
|
+
'doctor integration docs',
|
|
86
|
+
],
|
|
87
|
+
notes: [
|
|
88
|
+
{
|
|
89
|
+
type: 'prose',
|
|
90
|
+
text: "In global mode: outside a package, it writes nothing, its `validate` check reports one `no_package` issue, and it exits 1. In a project, the project's version of Astryx runs it, whichever astryx command you start. See {@link namespace:global} and {@link generic:global-integrations}.",
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file `astryx integration check`: every source check in one command, the
|
|
5
|
+
* summary, exit codes with and without `--strict`, and the `--strict`
|
|
6
|
+
* failures, in text and JSON alike.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
14
|
+
import {discoverCoreTemplates} from '../../../foundation/discovery/template-adapter.mjs';
|
|
15
|
+
|
|
16
|
+
/** @type {string} */
|
|
17
|
+
let tmpDir;
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
// Under the repository, so the components check resolves Core.
|
|
21
|
+
tmpDir = fs.mkdtempSync(
|
|
22
|
+
path.join(process.cwd(), '.astryx-integration-check-cli-'),
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A package whose one page template takes a Core template's id: one warning
|
|
32
|
+
* (`templates` conflict). The doc matches TemplateDoc, so no other check
|
|
33
|
+
* warns about it.
|
|
34
|
+
* @param {{id: string, replaces?: string, extraManifest?: string, dir?: string}} options
|
|
35
|
+
*/
|
|
36
|
+
function writePackage({id, replaces, extraManifest = '', dir = tmpDir}) {
|
|
37
|
+
fs.writeFileSync(
|
|
38
|
+
path.join(dir, 'package.json'),
|
|
39
|
+
JSON.stringify({name: '@acme/widgets', version: '1.2.3'}),
|
|
40
|
+
);
|
|
41
|
+
fs.writeFileSync(
|
|
42
|
+
path.join(dir, 'astryx.integration.mjs'),
|
|
43
|
+
`export default {templates: './templates'${extraManifest}};\n`,
|
|
44
|
+
);
|
|
45
|
+
fs.mkdirSync(path.join(dir, 'templates'), {recursive: true});
|
|
46
|
+
fs.writeFileSync(
|
|
47
|
+
path.join(dir, 'templates', `${id}.doc.mjs`),
|
|
48
|
+
`export default {type: 'page', name: 'Integration template', displayName: 'Integration template', description: 'fixture'${replaces == null ? '' : `, replaces: ${JSON.stringify(replaces)}`}};\n`,
|
|
49
|
+
);
|
|
50
|
+
fs.writeFileSync(
|
|
51
|
+
path.join(dir, 'templates', `${id}.tsx`),
|
|
52
|
+
'export default function Fixture() { return null; }\n',
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function coreTemplateId() {
|
|
57
|
+
const core = (await discoverCoreTemplates()).find(
|
|
58
|
+
template => template.type === 'page',
|
|
59
|
+
);
|
|
60
|
+
expect(core).toBeDefined();
|
|
61
|
+
return /** @type {{dirName: string}} */ (core).dirName;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
describe('astryx integration check', () => {
|
|
65
|
+
it('runs validate, components, templates, and docs in order, then a summary, and exits 0 on a warning', async () => {
|
|
66
|
+
writePackage({id: await coreTemplateId()});
|
|
67
|
+
|
|
68
|
+
const run = await runCli(['integration', 'check'], tmpDir);
|
|
69
|
+
|
|
70
|
+
const order = [
|
|
71
|
+
'Validating integration: @acme/widgets@1.2.3',
|
|
72
|
+
'Checking integration components: @acme/widgets@1.2.3',
|
|
73
|
+
'Checking integration templates: @acme/widgets@1.2.3',
|
|
74
|
+
'Checking integration docs: @acme/widgets@1.2.3',
|
|
75
|
+
'Integration check: @acme/widgets@1.2.3',
|
|
76
|
+
].map(line => run.stdout.indexOf(line));
|
|
77
|
+
expect(order.every(index => index >= 0)).toBe(true);
|
|
78
|
+
expect([...order].sort((a, b) => a - b)).toEqual(order);
|
|
79
|
+
expect(run.stdout).toContain('Consider renaming');
|
|
80
|
+
expect(run.stdout).not.toContain('Failing under --strict');
|
|
81
|
+
expect(run.stdout).toContain(
|
|
82
|
+
'[ok] 0 errors, 1 warning, 0 skipped. No check failed;',
|
|
83
|
+
);
|
|
84
|
+
// Each check's output stands apart from the next.
|
|
85
|
+
const lines = run.stdout.split('\n');
|
|
86
|
+
for (const header of [
|
|
87
|
+
'Checking integration components:',
|
|
88
|
+
'Checking integration templates:',
|
|
89
|
+
'Checking integration docs:',
|
|
90
|
+
]) {
|
|
91
|
+
expect(lines[lines.findIndex(line => line.includes(header)) - 1]).toBe(
|
|
92
|
+
'',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
expect(run.status).toBe(0);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('--strict lists the warning again as an error, after the checks, and exits 1', async () => {
|
|
99
|
+
const id = await coreTemplateId();
|
|
100
|
+
writePackage({id});
|
|
101
|
+
|
|
102
|
+
const run = await runCli(['integration', 'check', '--strict'], tmpDir);
|
|
103
|
+
|
|
104
|
+
expect(run.stdout).toContain(
|
|
105
|
+
'Integration check: @acme/widgets@1.2.3 (strict)',
|
|
106
|
+
);
|
|
107
|
+
const block = run.stdout.indexOf('Failing under --strict');
|
|
108
|
+
expect(block).toBeGreaterThan(
|
|
109
|
+
run.stdout.indexOf('Checking integration docs:'),
|
|
110
|
+
);
|
|
111
|
+
expect(run.stdout.slice(block)).toMatch(
|
|
112
|
+
/severity: \[fail\]\ncheck: +templates\ncode: +template_id_conflict\n/,
|
|
113
|
+
);
|
|
114
|
+
expect(run.stdout).toContain(
|
|
115
|
+
'[fail] 0 errors, 1 warning, 0 skipped. --strict fails on every warning and on skipped work;',
|
|
116
|
+
);
|
|
117
|
+
expect(run.status).toBe(1);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('--strict prints each finding once: its message above, its code in the failing list', async () => {
|
|
121
|
+
const id = await coreTemplateId();
|
|
122
|
+
writePackage({id});
|
|
123
|
+
|
|
124
|
+
const run = await runCli(['integration', 'check', '--strict'], tmpDir);
|
|
125
|
+
const json = await runCli(
|
|
126
|
+
['integration', 'check', '--strict', '--json'],
|
|
127
|
+
tmpDir,
|
|
128
|
+
);
|
|
129
|
+
const [failure] = JSON.parse(json.stdout.trim()).data.failures;
|
|
130
|
+
|
|
131
|
+
expect(run.stdout.split(failure.message).length - 1).toBe(1);
|
|
132
|
+
expect(
|
|
133
|
+
run.stdout.slice(run.stdout.indexOf('Failing under --strict')),
|
|
134
|
+
).toContain('template_id_conflict');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('--json carries each check with its own envelope, the --strict failures, and exits as the text does', async () => {
|
|
138
|
+
const id = await coreTemplateId();
|
|
139
|
+
writePackage({id});
|
|
140
|
+
|
|
141
|
+
const run = await runCli(
|
|
142
|
+
['integration', 'check', '--strict', '--json'],
|
|
143
|
+
tmpDir,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const parsed = JSON.parse(run.stdout.trim());
|
|
147
|
+
expect(parsed.type).toBe('integration.check');
|
|
148
|
+
expect(parsed.data).toMatchObject({
|
|
149
|
+
validated: true,
|
|
150
|
+
name: '@acme/widgets',
|
|
151
|
+
version: '1.2.3',
|
|
152
|
+
strict: true,
|
|
153
|
+
errors: 0,
|
|
154
|
+
warnings: 1,
|
|
155
|
+
skipped: [],
|
|
156
|
+
failed: true,
|
|
157
|
+
});
|
|
158
|
+
expect(parsed.data.checks.map(check => check.check)).toEqual([
|
|
159
|
+
'validate',
|
|
160
|
+
'components',
|
|
161
|
+
'templates',
|
|
162
|
+
'docs',
|
|
163
|
+
]);
|
|
164
|
+
const templates = parsed.data.checks[2];
|
|
165
|
+
expect(templates).toMatchObject({
|
|
166
|
+
check: 'templates',
|
|
167
|
+
errors: 0,
|
|
168
|
+
warnings: 1,
|
|
169
|
+
skipped: [],
|
|
170
|
+
failed: false,
|
|
171
|
+
response: {
|
|
172
|
+
type: 'integration.template-conflicts',
|
|
173
|
+
data: {conflicts: [expect.objectContaining({id, severity: 'warning'})]},
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
expect(parsed.data.failures).toEqual([
|
|
177
|
+
{
|
|
178
|
+
check: 'templates',
|
|
179
|
+
severity: 'error',
|
|
180
|
+
code: 'template_id_conflict',
|
|
181
|
+
message: templates.response.data.conflicts[0].message,
|
|
182
|
+
},
|
|
183
|
+
]);
|
|
184
|
+
expect(run.status).toBe(1);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('exits 1 without --strict when one check fails on its own, and lists no failures', async () => {
|
|
188
|
+
writePackage({id: 'acme-app-shell', replaces: 'missing-core-shell'});
|
|
189
|
+
|
|
190
|
+
const text = await runCli(['integration', 'check'], tmpDir);
|
|
191
|
+
const json = await runCli(['integration', 'check', '--json'], tmpDir);
|
|
192
|
+
|
|
193
|
+
expect(text.stdout).toContain('missing_template_replacement_target');
|
|
194
|
+
expect(text.stdout).toMatch(
|
|
195
|
+
/\[fail\] [1-9]\d* errors?, .*Address the items marked \[fail\] above\./,
|
|
196
|
+
);
|
|
197
|
+
expect(text.stdout).not.toContain('Failing under --strict');
|
|
198
|
+
expect(JSON.parse(json.stdout.trim()).data).toMatchObject({
|
|
199
|
+
strict: false,
|
|
200
|
+
failures: [],
|
|
201
|
+
failed: true,
|
|
202
|
+
});
|
|
203
|
+
expect(text.status).toBe(1);
|
|
204
|
+
expect(json.status).toBe(1);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('counts a package with no manifest as skipped work: exit 0, and 1 with --strict', async () => {
|
|
208
|
+
fs.writeFileSync(
|
|
209
|
+
path.join(tmpDir, 'package.json'),
|
|
210
|
+
JSON.stringify({name: '@acme/plain', version: '1.0.0'}),
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
const loose = await runCli(['integration', 'check'], tmpDir);
|
|
214
|
+
expect(loose.stdout).toContain(
|
|
215
|
+
"Nothing was checked: no astryx.integration.* found next to package.json. Run this command in an integration package's folder.",
|
|
216
|
+
);
|
|
217
|
+
// One cause, however many checks it stops: counted once.
|
|
218
|
+
expect(loose.stdout).toContain('[ok] 0 errors, 0 warnings, 1 skipped.');
|
|
219
|
+
expect(loose.status).toBe(0);
|
|
220
|
+
|
|
221
|
+
const strict = await runCli(
|
|
222
|
+
['integration', 'check', '--strict', '--json'],
|
|
223
|
+
tmpDir,
|
|
224
|
+
);
|
|
225
|
+
const {data} = JSON.parse(strict.stdout.trim());
|
|
226
|
+
expect(data).toMatchObject({validated: false, errors: 0, failed: true});
|
|
227
|
+
// One cause, however many checks it stops: listed once.
|
|
228
|
+
expect(data.failures).toEqual([
|
|
229
|
+
{
|
|
230
|
+
check: 'validate',
|
|
231
|
+
severity: 'error',
|
|
232
|
+
code: 'missing_manifest',
|
|
233
|
+
message:
|
|
234
|
+
'No astryx.integration.* found next to package.json, so nothing was checked.',
|
|
235
|
+
},
|
|
236
|
+
]);
|
|
237
|
+
expect(strict.status).toBe(1);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('exits 1 for no package.json, as validate does', async () => {
|
|
241
|
+
const empty = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-no-pkg-'));
|
|
242
|
+
try {
|
|
243
|
+
const run = await runCli(['integration', 'check'], empty);
|
|
244
|
+
expect(run.stdout).toContain(
|
|
245
|
+
'Nothing was checked: no package.json found.',
|
|
246
|
+
);
|
|
247
|
+
expect(run.stdout).toContain('Integration check: (no package.json)');
|
|
248
|
+
expect(run.stdout).toContain(
|
|
249
|
+
'[fail] 1 error, 0 warnings, 0 skipped. No package.json was found here, so nothing was checked.',
|
|
250
|
+
);
|
|
251
|
+
expect(run.stdout).not.toContain('marked [fail] above');
|
|
252
|
+
expect(run.status).toBe(1);
|
|
253
|
+
} finally {
|
|
254
|
+
fs.rmSync(empty, {recursive: true, force: true});
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('states in its help that it is the CI check, the line to add, and what --strict promises', async () => {
|
|
259
|
+
const run = await runCli(['integration', 'check', '--help'], tmpDir);
|
|
260
|
+
|
|
261
|
+
expect(run.stdout).toContain(
|
|
262
|
+
"The CI check for an integration package's own build",
|
|
263
|
+
);
|
|
264
|
+
expect(run.stdout).toContain(
|
|
265
|
+
'"typecheck": "tsc --noEmit && astryx integration check --strict"',
|
|
266
|
+
);
|
|
267
|
+
expect(run.stdout).toContain(
|
|
268
|
+
'A new check or failure code joins only in a minor release, named in the release notes; until then, a malformed `cliCommand` is reported as a note (`invalid_cli_command`) that fails nothing.',
|
|
269
|
+
);
|
|
270
|
+
expect(run.stdout).toContain('integration verify');
|
|
271
|
+
expect(run.stdout).toContain('against the package in the current folder');
|
|
272
|
+
expect(run.stdout).not.toContain('[package]');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('reports a malformed cliCommand as a note beside the issues, which --strict does not fail', async () => {
|
|
276
|
+
// A unique template id, so nothing else warns.
|
|
277
|
+
writePackage({
|
|
278
|
+
id: 'acme-notes-only-fixture',
|
|
279
|
+
extraManifest: ", cliCommand: ' acme astryx\\n'",
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
const json = await runCli(
|
|
283
|
+
['--json', 'integration', 'check', '--strict'],
|
|
284
|
+
tmpDir,
|
|
285
|
+
);
|
|
286
|
+
const envelope = JSON.parse(json.stdout);
|
|
287
|
+
const validate = envelope.data.checks[0].response.data;
|
|
288
|
+
expect(validate.issues.map((/** @type {any} */ i) => i.code)).not.toContain(
|
|
289
|
+
'invalid_cli_command',
|
|
290
|
+
);
|
|
291
|
+
expect(validate.notes).toEqual([
|
|
292
|
+
{code: 'invalid_cli_command', message: expect.any(String)},
|
|
293
|
+
]);
|
|
294
|
+
expect(envelope.data.failed).toBe(false);
|
|
295
|
+
expect(json.status).toBe(0);
|
|
296
|
+
|
|
297
|
+
const text = await runCli(['integration', 'check'], tmpDir);
|
|
298
|
+
expect(
|
|
299
|
+
text.stdout
|
|
300
|
+
.split('\n')
|
|
301
|
+
.filter(line => line.startsWith('note (invalid_cli_command): ')),
|
|
302
|
+
).toHaveLength(1);
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it('takes no package name: one passed is an error, not a check of the current folder', async () => {
|
|
306
|
+
writePackage({id: 'acme-page'});
|
|
307
|
+
|
|
308
|
+
const run = await runCli(['integration', 'check', '@acme/widgets'], tmpDir);
|
|
309
|
+
|
|
310
|
+
expect(run.stderr).toContain('too many arguments');
|
|
311
|
+
expect(run.stdout).not.toContain('Integration check:');
|
|
312
|
+
expect(run.status).toBe(1);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
describe('a copied passage', () => {
|
|
317
|
+
const passage =
|
|
318
|
+
'Themes cannot style the layer that holds a menu or a popover, so a menu ' +
|
|
319
|
+
'keeps the default surface color until the next release adds a token for it.';
|
|
320
|
+
|
|
321
|
+
function writeCopiedDocs() {
|
|
322
|
+
fs.writeFileSync(
|
|
323
|
+
path.join(tmpDir, 'package.json'),
|
|
324
|
+
JSON.stringify({name: '@acme/widgets', version: '1.2.3'}),
|
|
325
|
+
);
|
|
326
|
+
fs.writeFileSync(
|
|
327
|
+
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
328
|
+
`export default {docs: './docs'};\n`,
|
|
329
|
+
);
|
|
330
|
+
fs.mkdirSync(path.join(tmpDir, 'docs'));
|
|
331
|
+
for (const name of ['acme-setup', 'acme-menus']) {
|
|
332
|
+
const doc = {
|
|
333
|
+
type: 'generic',
|
|
334
|
+
name,
|
|
335
|
+
title: 'Fixture',
|
|
336
|
+
description: 'Fixture topic.',
|
|
337
|
+
sections: [
|
|
338
|
+
{title: 'Overview', content: [{type: 'prose', text: passage}]},
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
fs.writeFileSync(
|
|
342
|
+
path.join(tmpDir, 'docs', `${name}.doc.mjs`),
|
|
343
|
+
`export default ${JSON.stringify(doc)};\n`,
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
it('keeps doctor integration docs at exit 0, and fails integration check --strict', async () => {
|
|
349
|
+
writeCopiedDocs();
|
|
350
|
+
|
|
351
|
+
const doctor = await runCli(['doctor', 'integration', 'docs'], tmpDir);
|
|
352
|
+
expect(doctor.status).toBe(0);
|
|
353
|
+
expect(doctor.stdout).toContain('1 copied passage(s)');
|
|
354
|
+
|
|
355
|
+
const loose = await runCli(['integration', 'check'], tmpDir);
|
|
356
|
+
expect(loose.status).toBe(0);
|
|
357
|
+
|
|
358
|
+
const strict = await runCli(['integration', 'check', '--strict'], tmpDir);
|
|
359
|
+
expect(strict.status).toBe(1);
|
|
360
|
+
expect(strict.stdout).toContain('copied_passage');
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
describe('a padding phrase', () => {
|
|
365
|
+
it('keeps doctor integration docs at exit 0, and fails integration check --strict', async () => {
|
|
366
|
+
fs.writeFileSync(
|
|
367
|
+
path.join(tmpDir, 'package.json'),
|
|
368
|
+
JSON.stringify({name: '@acme/widgets', version: '1.2.3'}),
|
|
369
|
+
);
|
|
370
|
+
fs.writeFileSync(
|
|
371
|
+
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
372
|
+
`export default {docs: './docs'};\n`,
|
|
373
|
+
);
|
|
374
|
+
fs.mkdirSync(path.join(tmpDir, 'docs'));
|
|
375
|
+
const doc = {
|
|
376
|
+
type: 'generic',
|
|
377
|
+
name: 'acme-setup',
|
|
378
|
+
title: 'Fixture',
|
|
379
|
+
description: 'Fixture topic.',
|
|
380
|
+
sections: [
|
|
381
|
+
{
|
|
382
|
+
title: 'Overview',
|
|
383
|
+
content: [{type: 'prose', text: 'In order to start, run the setup.'}],
|
|
384
|
+
},
|
|
385
|
+
],
|
|
386
|
+
};
|
|
387
|
+
fs.writeFileSync(
|
|
388
|
+
path.join(tmpDir, 'docs', 'acme-setup.doc.mjs'),
|
|
389
|
+
`export default ${JSON.stringify(doc)};\n`,
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
const doctor = await runCli(['doctor', 'integration', 'docs'], tmpDir);
|
|
393
|
+
expect(doctor.status).toBe(0);
|
|
394
|
+
expect(doctor.stdout).toContain('1 fluff finding(s)');
|
|
395
|
+
|
|
396
|
+
const strict = await runCli(['integration', 'check', '--strict'], tmpDir);
|
|
397
|
+
expect(strict.status).toBe(1);
|
|
398
|
+
expect(strict.stdout).toContain('doc_fluff');
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
describe('a stray doc pointer', () => {
|
|
403
|
+
it('keeps doctor integration docs at exit 0, and fails integration check --strict', async () => {
|
|
404
|
+
fs.writeFileSync(
|
|
405
|
+
path.join(tmpDir, 'package.json'),
|
|
406
|
+
JSON.stringify({name: '@acme/widgets', version: '1.2.3'}),
|
|
407
|
+
);
|
|
408
|
+
fs.writeFileSync(
|
|
409
|
+
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
410
|
+
`export default {docs: './docs'};\n`,
|
|
411
|
+
);
|
|
412
|
+
fs.mkdirSync(path.join(tmpDir, 'docs'));
|
|
413
|
+
const doc = {
|
|
414
|
+
type: 'generic',
|
|
415
|
+
name: 'acme-setup',
|
|
416
|
+
title: 'Fixture',
|
|
417
|
+
description: 'Fixture topic.',
|
|
418
|
+
sections: [
|
|
419
|
+
{
|
|
420
|
+
title: 'Overview',
|
|
421
|
+
content: [
|
|
422
|
+
{type: 'prose', text: 'The theme is in `astryx docs theme`.'},
|
|
423
|
+
],
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
};
|
|
427
|
+
fs.writeFileSync(
|
|
428
|
+
path.join(tmpDir, 'docs', 'acme-setup.doc.mjs'),
|
|
429
|
+
`export default ${JSON.stringify(doc)};\n`,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
const doctor = await runCli(['doctor', 'integration', 'docs'], tmpDir);
|
|
433
|
+
expect(doctor.status).toBe(0);
|
|
434
|
+
expect(doctor.stdout).toContain('1 stray doc pointer(s)');
|
|
435
|
+
expect(doctor.stdout).toContain('{@link @astryxdesign/cli:generic:theme}');
|
|
436
|
+
|
|
437
|
+
const strict = await runCli(['integration', 'check', '--strict'], tmpDir);
|
|
438
|
+
expect(strict.status).toBe(1);
|
|
439
|
+
expect(strict.stdout).toContain('stray_doc_pointer');
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
describe('a command written with a runner', () => {
|
|
443
|
+
it('is a note in doctor integration validate, and integration check --strict still passes', async () => {
|
|
444
|
+
fs.writeFileSync(
|
|
445
|
+
path.join(tmpDir, 'package.json'),
|
|
446
|
+
JSON.stringify({name: '@acme/widgets', version: '1.2.3'}),
|
|
447
|
+
);
|
|
448
|
+
fs.writeFileSync(
|
|
449
|
+
path.join(tmpDir, 'astryx.integration.mjs'),
|
|
450
|
+
`export default {docs: './docs'};\n`,
|
|
451
|
+
);
|
|
452
|
+
fs.mkdirSync(path.join(tmpDir, 'docs'));
|
|
453
|
+
const doc = {
|
|
454
|
+
type: 'generic',
|
|
455
|
+
name: 'acme-setup',
|
|
456
|
+
title: 'Fixture',
|
|
457
|
+
description: 'Fixture topic.',
|
|
458
|
+
sections: [
|
|
459
|
+
{
|
|
460
|
+
title: 'Overview',
|
|
461
|
+
content: [{type: 'code', lang: 'bash', code: 'npx astryx doctor'}],
|
|
462
|
+
},
|
|
463
|
+
],
|
|
464
|
+
};
|
|
465
|
+
fs.writeFileSync(
|
|
466
|
+
path.join(tmpDir, 'docs', 'acme-setup.doc.mjs'),
|
|
467
|
+
`export default ${JSON.stringify(doc)};\n`,
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
const doctor = await runCli(['doctor', 'integration', 'validate'], tmpDir);
|
|
471
|
+
expect(doctor.status).toBe(0);
|
|
472
|
+
expect(doctor.stdout).toContain(
|
|
473
|
+
'note (runner_command): docs/acme-setup.doc.mjs:',
|
|
474
|
+
);
|
|
475
|
+
expect(doctor.stdout).toContain('Write `astryx doctor`');
|
|
476
|
+
|
|
477
|
+
const strict = await runCli(
|
|
478
|
+
['--json', 'integration', 'check', '--strict'],
|
|
479
|
+
tmpDir,
|
|
480
|
+
);
|
|
481
|
+
expect(strict.status).toBe(0);
|
|
482
|
+
const validate = JSON.parse(strict.stdout).data.checks.find(
|
|
483
|
+
(/** @type {any} */ each) => each.check === 'validate',
|
|
484
|
+
).response.data;
|
|
485
|
+
expect(validate.notes.map((/** @type {any} */ note) => note.code)).toEqual([
|
|
486
|
+
'runner_command',
|
|
487
|
+
]);
|
|
488
|
+
});
|
|
489
|
+
});
|