@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.2
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 +175 -154
- package/api/build/_adapter.d.mts +8 -0
- package/api/build/_adapter.mjs +12 -1
- package/api/build/build.doc.mjs +4 -0
- package/api/build/help/help.mjs +1 -1
- package/api/build/kit/kit.mjs +3 -11
- package/api/component/_adapter.d.mts +72 -1
- package/api/component/_adapter.mjs +212 -18
- package/api/component/component.doc.mjs +6 -1
- package/api/component/component.mjs +82 -15
- package/api/component/component.test.mjs +80 -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 +132 -12
- package/api/discover/_adapter.mjs +488 -27
- package/api/discover/_adapter.test.mjs +599 -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 +121 -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 +74 -0
- package/api/docs/_adapter.mjs +553 -16
- package/api/docs/docs.doc.mjs +2 -1
- package/api/docs/docs.mjs +2 -1
- package/api/docs/docs.test.mjs +5 -2
- package/api/docs/integration-tree.test.mjs +22 -0
- package/api/docs/integrationDocs.test.mjs +124 -0
- package/api/docs/list/list.mjs +12 -2
- package/api/docs/reference-blocks.test.mjs +1 -3
- package/api/doctor/_adapter.d.mts +108 -0
- package/api/doctor/_adapter.mjs +223 -4
- package/api/doctor/doctor.d.mts +199 -0
- package/api/doctor/doctor.doc.mjs +3 -2
- package/api/doctor/doctor.mjs +530 -34
- package/api/doctor/doctor.test.mjs +180 -14
- 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/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 +28 -7
- package/api/init/init.mjs +28 -4
- package/api/init/init.type.d.mts +48 -3
- package/api/init/init.type.mjs +37 -3
- package/api/init/run/run.d.mts +1 -1
- package/api/init/run/run.mjs +17 -6
- 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 +45 -0
- package/api/integration/_adapter.mjs +112 -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 +110 -6
- package/api/integration/authoring-checks.test.mjs +808 -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 +364 -120
- package/api/integration/pack-check.test.mjs +730 -10
- package/api/integration/validate-integration-fixes.test.mjs +67 -0
- package/api/integration/validate-integration.d.mts +8 -0
- package/api/integration/validate-integration.mjs +63 -9
- package/api/integration/validate-integration.test.mjs +88 -8
- package/api/integration/validate-integration.type.d.mts +16 -0
- package/api/integration/validate-integration.type.mjs +14 -1
- package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
- package/api/integration/validateIntegration.doc.mjs +19 -3
- package/api/search/_adapter.d.mts +11 -0
- package/api/search/_adapter.mjs +25 -0
- package/api/search/search.d.mts +82 -13
- package/api/search/search.doc.mjs +8 -3
- 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 +645 -64
- package/api/search/search.test.mjs +179 -1
- package/api/search/search.type.d.mts +14 -1
- package/api/search/search.type.mjs +6 -1
- 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.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 +20 -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 +40 -2
- package/api/upgrade/_adapter.mjs +118 -5
- package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
- package/api/upgrade/run/run.mjs +35 -2
- package/api/upgrade/status/status.d.mts +21 -5
- package/api/upgrade/status/status.mjs +45 -8
- package/api/upgrade/upgrade.doc.mjs +6 -3
- package/api/upgrade/upgrade.mjs +5 -1
- package/api/upgrade/upgrade.type.d.mts +23 -0
- package/api/upgrade/upgrade.type.mjs +16 -1
- 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.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 +3 -3
- package/assets/docs/browser-support.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +26 -6
- 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 +13 -3
- 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/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 +4 -0
- 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 +88 -0
- package/assets/docs/tree/cli-command.doc.mjs +142 -0
- package/assets/docs/tree/cli.doc.mjs +6 -0
- 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 +7 -3
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
- package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
- 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 +3 -3
- 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/tree/fonts-and-assets.doc.mjs +2 -2
- package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
- 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/install-once.doc.mjs +105 -0
- package/assets/docs/tree/integrations.doc.mjs +13 -1
- 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 +53 -27
- 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/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-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 +4 -0
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- 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 +14 -2
- package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
- package/assets/docs/tree/versioning.doc.mjs +10 -9
- package/assets/docs/tree/who-answers.doc.mjs +119 -0
- 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/working-with-ai.doc.mjs +66 -13
- 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 +9 -9
- 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 +12 -0
- package/clients/cli/bin/astryx.mjs +20 -3
- package/clients/cli/cli-command.test.mjs +166 -0
- 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.font-warning.test.mjs +3 -3
- package/clients/cli/commands/build-theme.mjs +26 -13
- 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/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 +1 -0
- package/clients/cli/commands/docs.mjs +49 -19
- package/clients/cli/commands/docs.test.mjs +2 -2
- 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 +888 -3
- package/clients/cli/commands/doctor.doc.mjs +12 -2
- package/clients/cli/commands/doctor.mjs +292 -7
- package/clients/cli/commands/doctor.test.mjs +10 -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/init.behavior.test.mjs +5 -0
- package/clients/cli/commands/init.doc.mjs +29 -3
- 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 +441 -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 +1 -0
- package/clients/cli/commands/outside-project.test.mjs +774 -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 +102 -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/upgrade.config-ordering.test.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +22 -1
- 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.older-cli.test.mjs +160 -0
- package/clients/cli/index.mjs +112 -16
- package/clients/cli/lib/cli-error.mjs +4 -1
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +2 -2
- 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 +25 -0
- package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
- package/foundation/agent-docs/agent-doc-state.mjs +66 -6
- package/foundation/agent-docs/agent-docs.d.mts +4 -3
- package/foundation/agent-docs/agent-docs.mjs +11 -9
- package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
- package/foundation/agent-docs/computer-agent-text.mjs +623 -0
- package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
- package/foundation/config/project.d.mts +35 -3
- package/foundation/config/project.mjs +226 -7
- package/foundation/config/project.test.mjs +66 -0
- package/foundation/config/theme-state.mjs +5 -4
- package/foundation/discovery/authoring-self-docs.mjs +2 -1
- package/foundation/discovery/cli-self-docs.mjs +20 -3
- package/foundation/discovery/cli-self-docs.test.mjs +3 -2
- package/foundation/discovery/component-discovery.d.mts +190 -10
- package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
- package/foundation/discovery/component-discovery.mjs +864 -56
- package/foundation/discovery/component-discovery.test.mjs +96 -0
- 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 +83 -2
- 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 +27 -0
- package/foundation/discovery/module-exports.mjs +356 -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 +40 -0
- package/foundation/discovery/runner-allowlist.mjs +53 -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 +74 -5
- package/foundation/discovery/template-needs.mjs +5 -2
- 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 +51 -1
- 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/tree.mjs +30 -1
- package/foundation/doc-compiler/tree.test.mjs +8 -1
- 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 +57 -1
- package/foundation/fs/paths.mjs +131 -3
- package/foundation/fs/paths.test.mjs +10 -1
- package/foundation/integrations/computer-integrations.d.mts +78 -0
- package/foundation/integrations/computer-integrations.mjs +316 -0
- package/foundation/integrations/computer-integrations.test.mjs +292 -0
- package/foundation/integrations/contribution-inventory.d.mts +11 -0
- package/foundation/integrations/contribution-inventory.mjs +56 -3
- package/foundation/integrations/integration-warnings.mjs +3 -2
- package/foundation/integrations/integration-warnings.test.mjs +8 -9
- package/foundation/integrations/integrations.d.mts +25 -1
- package/foundation/integrations/integrations.mjs +46 -3
- package/foundation/integrations/issue.ts +6 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +41 -1
- 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 +920 -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 +259 -0
- package/foundation/release/global-state.mjs +472 -0
- package/foundation/release/global-state.test.mjs +381 -0
- package/foundation/release/handoff.d.mts +60 -0
- package/foundation/release/handoff.e2e.test.mjs +278 -0
- package/foundation/release/handoff.mjs +357 -0
- package/foundation/release/lock-lease.d.mts +23 -0
- package/foundation/release/lock-lease.mjs +80 -0
- package/foundation/release/notices.d.mts +253 -0
- package/foundation/release/notices.mjs +596 -0
- package/foundation/release/notices.test.mjs +565 -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 +149 -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/xle/browser-imports.test.mjs +74 -0
- package/foundation/xle/registry.mjs +4 -0
- package/foundation/xle/registry.test.mjs +28 -0
- package/package.json +11 -11
- package/scripts/postinstall.mjs +24 -5
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
* - `config_fixable` — DRY-RUN only: the config fails strict validation but a
|
|
11
11
|
* pending core CONFIG codemod would repair it; preview the fix, don't write.
|
|
12
12
|
*
|
|
13
|
+
* `no_codemods` and `config_fixable` also carry `cliBehindCore` when the
|
|
14
|
+
* installed Core is newer than this CLI: the run cannot finish the upgrade, so
|
|
15
|
+
* neither says it is done, and `logCliBehindCore` names the command that can.
|
|
16
|
+
*
|
|
13
17
|
* These builders own the exact human progress lines for their path (emitted via
|
|
14
18
|
* the shared `logger`) and return the `upgrade.status` envelope; the caller
|
|
15
19
|
* just returns what they hand back.
|
|
@@ -40,13 +44,43 @@ export function statusUpToDate({from, to, agentDocs, registryCompositions}) {
|
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
47
|
+
* The one warning for a CLI older than the installed Core: it has no codemods
|
|
48
|
+
* for the releases after its own version, and the pinned command does. The
|
|
49
|
+
* command gets a line of its own, so it copies exactly, whatever quotes or
|
|
50
|
+
* backticks its arguments carry. On Windows it is written for PowerShell, and
|
|
51
|
+
* the warning says so.
|
|
52
|
+
* @param {import('../upgrade.type.mjs').CliBehindCore} cliBehindCore
|
|
53
|
+
* @param {string} to the installed Core version
|
|
54
|
+
* @param {string} [platform] the `process.platform` the command was printed
|
|
55
|
+
* for, as `quoteCommandArgument` and `commandInFolder` take it
|
|
56
|
+
*/
|
|
57
|
+
export function logCliBehindCore({cliVersion, command}, to, platform = process.platform) {
|
|
58
|
+
const shell = platform === 'win32' ? ' in PowerShell' : '';
|
|
59
|
+
logger.warn(
|
|
60
|
+
`This CLI (${cliVersion}) is older than the installed @astryxdesign/core (${to}): ` +
|
|
61
|
+
`it has no codemods for releases after ${cliVersion}, so it cannot finish this upgrade. ` +
|
|
62
|
+
`Run it${shell} with the CLI that matches your Core:`,
|
|
63
|
+
);
|
|
64
|
+
logger.warn(` ${command}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* No core or integration codemods apply to the requested version range. When
|
|
69
|
+
* the CLI is older than the installed Core, that only means this CLI has none:
|
|
70
|
+
* the result carries `cliBehindCore` and the human lines say so.
|
|
71
|
+
* @param {{from: string, to: string, agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, registryCompositions?: import('../upgrade.type.mjs').RegistryCompositionSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
|
|
45
72
|
* @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
|
|
46
73
|
*/
|
|
47
|
-
export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
|
|
48
|
-
|
|
49
|
-
logger.log(
|
|
74
|
+
export function statusNoCodemods({from, to, agentDocs, registryCompositions, cliBehindCore}) {
|
|
75
|
+
if (cliBehindCore) logCliBehindCore(cliBehindCore, to);
|
|
76
|
+
else logger.log('[ok] No codemods available for this version range.');
|
|
77
|
+
logger.log(
|
|
78
|
+
registryCompositions?.ok === false
|
|
79
|
+
? 'Finished with unresolved registry items\n'
|
|
80
|
+
: cliBehindCore
|
|
81
|
+
? 'Upgrade incomplete\n'
|
|
82
|
+
: 'Done\n',
|
|
83
|
+
);
|
|
50
84
|
return {
|
|
51
85
|
type: 'upgrade.status',
|
|
52
86
|
data: {
|
|
@@ -55,6 +89,7 @@ export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
|
|
|
55
89
|
to,
|
|
56
90
|
agentDocs,
|
|
57
91
|
...(registryCompositions ? {registryCompositions} : {}),
|
|
92
|
+
...(cliBehindCore ? {cliBehindCore} : {}),
|
|
58
93
|
},
|
|
59
94
|
};
|
|
60
95
|
}
|
|
@@ -63,10 +98,10 @@ export function statusNoCodemods({from, to, agentDocs, registryCompositions}) {
|
|
|
63
98
|
* DRY-RUN only: the consumer's astryx.config fails strict validation, but a
|
|
64
99
|
* pending core CONFIG codemod previewed a change that would repair it. Preview
|
|
65
100
|
* the fix + report the exact `--apply` command; integrations are skipped here.
|
|
66
|
-
* @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary}} data
|
|
101
|
+
* @param {{from: string, to: string, configError: string, configCodemods: string[], agentDocs: import('../upgrade.type.mjs').AgentDocsSummary, cliBehindCore?: import('../upgrade.type.mjs').CliBehindCore | null}} data
|
|
67
102
|
* @returns {import('../upgrade.type.mjs').UpgradeStatusResponse}
|
|
68
103
|
*/
|
|
69
|
-
export function statusConfigFixable({from, to, configError, configCodemods, agentDocs}) {
|
|
104
|
+
export function statusConfigFixable({from, to, configError, configCodemods, agentDocs, cliBehindCore}) {
|
|
70
105
|
const codemodFlags = configCodemods.map(name => `--codemod ${name}`).join(' ');
|
|
71
106
|
const suggestedCommand = `astryx upgrade --from ${from} ${codemodFlags} --apply`;
|
|
72
107
|
const guidance =
|
|
@@ -77,7 +112,8 @@ export function statusConfigFixable({from, to, configError, configCodemods, agen
|
|
|
77
112
|
logger.warn(guidance);
|
|
78
113
|
logger.log(` ${formatCliCommand(suggestedCommand)}`);
|
|
79
114
|
logger.log('Integrations are skipped in this preview; they will be processed on the --apply run.');
|
|
80
|
-
|
|
115
|
+
if (cliBehindCore) logCliBehindCore(cliBehindCore, to);
|
|
116
|
+
logger.log(cliBehindCore ? 'Upgrade incomplete\n' : 'Dry run complete\n');
|
|
81
117
|
return {
|
|
82
118
|
type: 'upgrade.status',
|
|
83
119
|
data: {
|
|
@@ -90,6 +126,7 @@ export function statusConfigFixable({from, to, configError, configCodemods, agen
|
|
|
90
126
|
message: guidance,
|
|
91
127
|
note: 'Integrations are skipped in this preview; they will be processed on the --apply run.',
|
|
92
128
|
agentDocs,
|
|
129
|
+
...(cliBehindCore ? {cliBehindCore} : {}),
|
|
93
130
|
},
|
|
94
131
|
};
|
|
95
132
|
}
|
|
@@ -22,7 +22,10 @@ export const doc = {
|
|
|
22
22
|
'loaded, so they can repair an invalid config. Also updates copied compositions from ' +
|
|
23
23
|
'their install receipts: unchanged files are updated, non-overlapping edits are merged, ' +
|
|
24
24
|
'and conflicts are left untouched. `list` only lists codemods; `registry` only updates ' +
|
|
25
|
-
'copied compositions.'
|
|
25
|
+
'copied compositions. Core codemods ship inside the CLI, so a CLI older than the installed ' +
|
|
26
|
+
'Core has none for the releases after its own version: the result then carries ' +
|
|
27
|
+
'`cliBehindCore` with the command that runs the same upgrade on the matching CLI.' +
|
|
28
|
+
" In global mode: in a project, the CLI runs `upgrade` with the project's own CLI, whichever astryx command started it (in a project with no CLI of its own, the one you started); this function runs the codemods of the package it is imported from. With `cwd` outside a project, `list` lists this release's codemods, `registry` finds no copied compositions, and a migration writes nothing and fails with `ERR_VERSION_DETECT`. See {@link namespace:global} and {@link generic:who-answers}.",
|
|
26
29
|
importPath: '@astryxdesign/cli/api',
|
|
27
30
|
signature:
|
|
28
31
|
'upgrade(options?: UpgradeOptions, ctx?: {cwd?: string}): Promise<UpgradeListResponse | UpgradeRegistryResponse | UpgradeStatusResponse | UpgradeRunResponse>',
|
|
@@ -118,12 +121,12 @@ export const doc = {
|
|
|
118
121
|
{
|
|
119
122
|
type: 'upgrade.status',
|
|
120
123
|
description:
|
|
121
|
-
'A short-circuit outcome (no codemods executed): `up_to_date` (`from` is at/after the installed target and no `force`), `no_codemods` (none apply to the range), or `config_fixable` (dry-run preview that a pending config codemod would repair an invalid astryx.config). up_to_date and no_codemods carry the agent-docs summary and, when receipts are found, the copied-composition summary; config_fixable carries configError, configCodemods, suggestedCommand, message, note, and the agent-docs summary.',
|
|
124
|
+
'A short-circuit outcome (no codemods executed): `up_to_date` (`from` is at/after the installed target and no `force`), `no_codemods` (none apply to the range), or `config_fixable` (dry-run preview that a pending config codemod would repair an invalid astryx.config). up_to_date and no_codemods carry the agent-docs summary and, when receipts are found, the copied-composition summary; config_fixable carries configError, configCodemods, suggestedCommand, message, note, and the agent-docs summary. When the installed Core is newer than the CLI, no_codemods and config_fixable also carry cliBehindCore ({cliVersion, command}): this CLI has no codemods for the releases after cliVersion, and command runs the same upgrade with the CLI release that matches the installed Core.',
|
|
122
125
|
},
|
|
123
126
|
{
|
|
124
127
|
type: 'upgrade.run',
|
|
125
128
|
description:
|
|
126
|
-
'The terminal run receipt: from, to, codemods (count), integrations, agentDocs, agentDocsRefreshed, registryCompositions (when receipts are found), sourcePathFound (false when the resolved `path` does not exist, so nothing was scanned), filesChanged, transformsApplied, modifiedFiles, protectedFiles, declinedCandidates, errors, and complete. When a protected file still requires a change, complete is false and errorCode is ERR_CODEMOD_PROTECTED; the CLI exits nonzero while preserving the structured receipt.',
|
|
129
|
+
'The terminal run receipt: from, to, codemods (count), integrations, agentDocs, agentDocsRefreshed, registryCompositions (when receipts are found), sourcePathFound (false when the resolved `path` does not exist, so nothing was scanned), filesChanged, transformsApplied, modifiedFiles, protectedFiles, declinedCandidates, errors, and complete. When a protected file still requires a change, complete is false and errorCode is ERR_CODEMOD_PROTECTED; the CLI exits nonzero while preserving the structured receipt. When the installed Core is newer than the CLI, it also carries cliBehindCore ({cliVersion, command}): codemods for the releases after cliVersion did not run, and command runs the same upgrade with the matching CLI.',
|
|
127
130
|
},
|
|
128
131
|
],
|
|
129
132
|
throws: [
|
package/api/upgrade/upgrade.mjs
CHANGED
|
@@ -26,6 +26,7 @@ import {registryUpgrade} from './registry/registry.mjs';
|
|
|
26
26
|
import {run} from './run/run.mjs';
|
|
27
27
|
import {isValidSemver} from '../../foundation/env/semver.mjs';
|
|
28
28
|
import {getCliInvocation} from '../../foundation/env/package-manager.mjs';
|
|
29
|
+
import {isOutsideProject} from '../../foundation/env/project-scope.mjs';
|
|
29
30
|
import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
|
|
30
31
|
import {AstryxError} from '../error.mjs';
|
|
31
32
|
import {logger} from '../logger.mjs';
|
|
@@ -91,7 +92,10 @@ export async function upgrade(options = {}, {cwd = process.cwd()} = {}) {
|
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
if (!options.list && !options.from) {
|
|
94
|
-
|
|
95
|
+
// Outside a project there is no version to install (spec AST-081 FR3).
|
|
96
|
+
const msg = isOutsideProject(cwd)
|
|
97
|
+
? 'Missing required --from. This folder is outside a project; upgrade migrates the code of an app project that installs @astryxdesign/core.'
|
|
98
|
+
: `Missing required --from. Install the target version first, then run \`${getCliInvocation()} upgrade --from <old-version>\`.`;
|
|
95
99
|
logger.error(msg);
|
|
96
100
|
logger.log('Aborted\n');
|
|
97
101
|
throw new AstryxError(msg, undefined, ERROR_CODES.ERR_INVALID_ARGUMENT);
|
|
@@ -160,6 +160,22 @@ export type ProtectedCodemodFile = {
|
|
|
160
160
|
*/
|
|
161
161
|
commands: string[];
|
|
162
162
|
};
|
|
163
|
+
/**
|
|
164
|
+
* Present only when the installed `@astryxdesign/core` (the response's `to`) is
|
|
165
|
+
* newer than the running CLI. Core codemods ship inside the CLI, so this CLI
|
|
166
|
+
* has none for the releases after `cliVersion`: the run could not migrate them,
|
|
167
|
+
* whatever else the response reports.
|
|
168
|
+
*/
|
|
169
|
+
export type CliBehindCore = {
|
|
170
|
+
/**
|
|
171
|
+
* The running CLI's version, the last release it has codemods for.
|
|
172
|
+
*/
|
|
173
|
+
cliVersion: string;
|
|
174
|
+
/**
|
|
175
|
+
* The same upgrade, run with the CLI release that matches the installed Core. It first changes to the folder this run used, then names the directory this run scanned as an absolute `--path`, both with symbolic links resolved, so pasted from any folder it finds the same Core and scans the same directory. It is written for a POSIX shell (sh, bash, zsh), or for PowerShell on Windows, with each argument quoted for that shell; cmd.exe is not a target.
|
|
176
|
+
*/
|
|
177
|
+
command: string;
|
|
178
|
+
};
|
|
163
179
|
/**
|
|
164
180
|
* astryx --json upgrade [--apply]
|
|
165
181
|
*/
|
|
@@ -190,6 +206,7 @@ export type UpgradeRunResponse = {
|
|
|
190
206
|
codemod: string;
|
|
191
207
|
error: string;
|
|
192
208
|
}[] | undefined;
|
|
209
|
+
cliBehindCore?: CliBehindCore | undefined;
|
|
193
210
|
};
|
|
194
211
|
};
|
|
195
212
|
/**
|
|
@@ -202,6 +219,10 @@ export type UpgradeRunResponse = {
|
|
|
202
219
|
* range) would repair it. The dry run previews the fix without writing and
|
|
203
220
|
* reports the exact command to apply it; integrations are skipped for the
|
|
204
221
|
* preview (they will be processed on the `--apply` run).
|
|
222
|
+
*
|
|
223
|
+
* `no_codemods` and `config_fixable` carry `cliBehindCore` when the installed
|
|
224
|
+
* Core is newer than this CLI; `no_codemods` then means only that this CLI has
|
|
225
|
+
* no codemods for the range.
|
|
205
226
|
*/
|
|
206
227
|
export type UpgradeStatusResponse = {
|
|
207
228
|
type: "upgrade.status";
|
|
@@ -217,6 +238,7 @@ export type UpgradeStatusResponse = {
|
|
|
217
238
|
to: string;
|
|
218
239
|
agentDocs: AgentDocsSummary;
|
|
219
240
|
registryCompositions?: RegistryCompositionSummary;
|
|
241
|
+
cliBehindCore?: CliBehindCore;
|
|
220
242
|
} | {
|
|
221
243
|
status: "config_fixable";
|
|
222
244
|
from: string;
|
|
@@ -227,6 +249,7 @@ export type UpgradeStatusResponse = {
|
|
|
227
249
|
message: string;
|
|
228
250
|
note: string;
|
|
229
251
|
agentDocs: AgentDocsSummary;
|
|
252
|
+
cliBehindCore?: CliBehindCore;
|
|
230
253
|
};
|
|
231
254
|
};
|
|
232
255
|
/**
|
|
@@ -106,6 +106,16 @@
|
|
|
106
106
|
* @property {string[]} commands Exact regeneration commands found in generated headers, when present.
|
|
107
107
|
*/
|
|
108
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Present only when the installed `@astryxdesign/core` (the response's `to`) is
|
|
111
|
+
* newer than the running CLI. Core codemods ship inside the CLI, so this CLI
|
|
112
|
+
* has none for the releases after `cliVersion`: the run could not migrate them,
|
|
113
|
+
* whatever else the response reports.
|
|
114
|
+
* @typedef {object} CliBehindCore
|
|
115
|
+
* @property {string} cliVersion The running CLI's version, the last release it has codemods for.
|
|
116
|
+
* @property {string} command The same upgrade, run with the CLI release that matches the installed Core. It first changes to the folder this run used, then names the directory this run scanned as an absolute `--path`, both with symbolic links resolved, so pasted from any folder it finds the same Core and scans the same directory. It is written for a POSIX shell (sh, bash, zsh), or for PowerShell on Windows, with each argument quoted for that shell; cmd.exe is not a target.
|
|
117
|
+
*/
|
|
118
|
+
|
|
109
119
|
/**
|
|
110
120
|
* astryx --json upgrade [--apply]
|
|
111
121
|
* @typedef {object} UpgradeRunResponse
|
|
@@ -127,6 +137,7 @@
|
|
|
127
137
|
* @property {Array<{file: string, location?: string, reason: string}>} [data.declinedCandidates] Candidates left unchanged because proof was insufficient.
|
|
128
138
|
* @property {number} [data.transformsApplied] Total codemod changes. A code or config codemod counts once for each file it changed, so one file changed by four of them counts four times; a project codemod counts once, however many files it writes.
|
|
129
139
|
* @property {Array<{file: string, codemod: string, error: string}>} [data.errors] Per-codemod errors, when any codemod failed.
|
|
140
|
+
* @property {CliBehindCore} [data.cliBehindCore] Present only when the installed Core is newer than this CLI: codemods for the releases after `cliBehindCore.cliVersion` did not run.
|
|
130
141
|
*/
|
|
131
142
|
|
|
132
143
|
/**
|
|
@@ -140,9 +151,13 @@
|
|
|
140
151
|
* reports the exact command to apply it; integrations are skipped for the
|
|
141
152
|
* preview (they will be processed on the `--apply` run).
|
|
142
153
|
*
|
|
154
|
+
* `no_codemods` and `config_fixable` carry `cliBehindCore` when the installed
|
|
155
|
+
* Core is newer than this CLI; `no_codemods` then means only that this CLI has
|
|
156
|
+
* no codemods for the range.
|
|
157
|
+
*
|
|
143
158
|
* @typedef {object} UpgradeStatusResponse
|
|
144
159
|
* @property {'upgrade.status'} type
|
|
145
|
-
* @property {{status: 'up_to_date', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'no_codemods', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'config_fixable', from: string, to: string, configError: string, configCodemods: string[], suggestedCommand: string, message: string, note: string, agentDocs: AgentDocsSummary}} data
|
|
160
|
+
* @property {{status: 'up_to_date', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary} | {status: 'no_codemods', from: string, to: string, agentDocs: AgentDocsSummary, registryCompositions?: RegistryCompositionSummary, cliBehindCore?: CliBehindCore} | {status: 'config_fixable', from: string, to: string, configError: string, configCodemods: string[], suggestedCommand: string, message: string, note: string, agentDocs: AgentDocsSummary, cliBehindCore?: CliBehindCore}} data
|
|
146
161
|
*/
|
|
147
162
|
|
|
148
163
|
/**
|
|
@@ -32,6 +32,7 @@ const registry = new Map([
|
|
|
32
32
|
['0.6.4', () => import('./transforms/v0.6.4/index.mjs')],
|
|
33
33
|
['0.6.7', () => import('./transforms/v0.6.7/index.mjs')],
|
|
34
34
|
['0.7.0', () => import('./transforms/v0.7.0/index.mjs')],
|
|
35
|
+
['0.7.2', () => import('./transforms/v0.7.2/index.mjs')],
|
|
35
36
|
]);
|
|
36
37
|
|
|
37
38
|
// Re-export from the shared utility so registry callers and other consumers
|
|
@@ -418,6 +418,7 @@ async function runProjectCodemod(
|
|
|
418
418
|
* @param {boolean} [options.silent] - Suppress all human-facing output (for --json)
|
|
419
419
|
* @param {string} [options.root] - Project root a project codemod reads (default: the process cwd)
|
|
420
420
|
* @param {{root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}} [options.protection] - Preloaded protection resolver
|
|
421
|
+
* @param {boolean} [options.coversTarget] - False when these codemods stop before the installed target (the CLI is older than Core), so a run with no changes does not say the code is up to date. Default true.
|
|
421
422
|
* @returns {Promise<{totalFilesChanged: number, totalTransformsApplied: number, totalValidationBlocked: number, changedFiles: string[], writtenFiles: string[], stagedContents: Map<string, string>, protectedFiles: import('../../authoring/codemod/type').CodemodRunResult['protectedFiles'], errors: Array<{file: string, codemod: string, error: string}>, skippedOptional: Array<{name: string, meta: {title: string, description?: string, fileExtensions?: string[], codemodType?: string}, version: string}>} | {ok: false, reason: string, resolvedPath: string}>}
|
|
422
423
|
*/
|
|
423
424
|
export async function runCodemods(
|
|
@@ -430,6 +431,7 @@ export async function runCodemods(
|
|
|
430
431
|
silent = false,
|
|
431
432
|
root = process.cwd(),
|
|
432
433
|
protection: providedProtection,
|
|
434
|
+
coversTarget = true,
|
|
433
435
|
},
|
|
434
436
|
) {
|
|
435
437
|
// No-op stub object so silent mode skips log output entirely without
|
|
@@ -643,7 +645,11 @@ export async function runCodemods(
|
|
|
643
645
|
errors.length === 0 &&
|
|
644
646
|
protectedFiles.length === 0
|
|
645
647
|
) {
|
|
646
|
-
|
|
648
|
+
// Codemods that stop before the installed target cannot vouch for the
|
|
649
|
+
// code; the caller says what is missing.
|
|
650
|
+
if (coversTarget) {
|
|
651
|
+
log.success('No changes needed — your code is already up to date!');
|
|
652
|
+
}
|
|
647
653
|
} else if (apply && protectedFiles.length > 0) {
|
|
648
654
|
log.warn(
|
|
649
655
|
`Applied ${totalTransformsApplied} owned change${totalTransformsApplied === 1 ? '' : 's'} across ${totalFilesChanged} file${totalFilesChanged === 1 ? '' : 's'}; protected changes remain.`,
|
package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import transform from '../migrate-list-edge-compensation-to-edge.mjs';
|
|
5
|
+
|
|
6
|
+
async function applyTransform(source) {
|
|
7
|
+
const jscodeshift = (await import('jscodeshift')).default;
|
|
8
|
+
const j = jscodeshift.withParser('tsx');
|
|
9
|
+
const api = {jscodeshift: j, stats: () => {}, report: () => {}};
|
|
10
|
+
return transform({source, path: 'test.tsx'}, api) ?? source;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('migrate-list-edge-compensation-to-edge', () => {
|
|
14
|
+
it("renames edgeCompensation='inline' to edge='outset'", async () => {
|
|
15
|
+
const output =
|
|
16
|
+
await applyTransform(`import {List, ListItem} from '@astryxdesign/core/List';
|
|
17
|
+
const a = <List edgeCompensation="inline"><ListItem label="a" /></List>;
|
|
18
|
+
const b = <List hasDividers edgeCompensation={'inline'} />;`);
|
|
19
|
+
|
|
20
|
+
expect(output).not.toContain('edgeCompensation');
|
|
21
|
+
expect(output.match(/edge='outset'/g)).toHaveLength(2);
|
|
22
|
+
expect(output).toContain('hasDividers');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('follows aliases and the package root import', async () => {
|
|
26
|
+
const output =
|
|
27
|
+
await applyTransform(`import {List as Rows} from '@astryxdesign/core';
|
|
28
|
+
const a = <Rows edgeCompensation="inline" />;`);
|
|
29
|
+
|
|
30
|
+
expect(output).toContain("<Rows edge='outset' />");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('drops edgeCompensation beside an edge string, whatever its value', async () => {
|
|
34
|
+
const output =
|
|
35
|
+
await applyTransform(`import {List} from '@astryxdesign/core/List';
|
|
36
|
+
const a = <List edge="bleed" edgeCompensation="inline" />;
|
|
37
|
+
const b = <List edge={'flush'} edgeCompensation={mode} />;
|
|
38
|
+
const c = <List {...rest} edge="padded" edgeCompensation="inline" />;`);
|
|
39
|
+
|
|
40
|
+
// c: the spread comes before edge, so it cannot override it.
|
|
41
|
+
expect(output).toContain('edge="bleed"');
|
|
42
|
+
expect(output).toContain("edge={'flush'}");
|
|
43
|
+
expect(output).toContain('edge="padded"');
|
|
44
|
+
expect(output).not.toContain('edgeCompensation');
|
|
45
|
+
expect(output).not.toContain('TODO');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('leaves a TODO where edge may be undefined at runtime', async () => {
|
|
49
|
+
const output =
|
|
50
|
+
await applyTransform(`import {List} from '@astryxdesign/core/List';
|
|
51
|
+
const a = <List edge={edge} edgeCompensation="inline" />;
|
|
52
|
+
const b = <List edge="flush" {...rest} edgeCompensation="inline" />;
|
|
53
|
+
const c = <List edge={props.edge} edgeCompensation={mode} />;`);
|
|
54
|
+
|
|
55
|
+
// a and c: a computed edge falls back to the old prop when undefined.
|
|
56
|
+
// b: the spread after edge may set it to undefined.
|
|
57
|
+
expect(output.match(/TODO\(astryx upgrade\)/g)).toHaveLength(3);
|
|
58
|
+
expect(output.match(/edgeCompensation=/g)).toHaveLength(3);
|
|
59
|
+
expect(output).toContain('edge={edge}');
|
|
60
|
+
expect(output).toContain('edge={props.edge}');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('leaves a TODO on a dynamic value and keeps it working', async () => {
|
|
64
|
+
const output =
|
|
65
|
+
await applyTransform(`import {List} from '@astryxdesign/core/List';
|
|
66
|
+
const a = <List edgeCompensation={mode} />;
|
|
67
|
+
const b = <List edgeCompensation={flag ? 'inline' : undefined} />;`);
|
|
68
|
+
|
|
69
|
+
expect(output.match(/TODO\(astryx upgrade\)/g)).toHaveLength(2);
|
|
70
|
+
expect(output).toContain('edgeCompensation={mode}');
|
|
71
|
+
expect(output).toContain("edgeCompensation={flag ? 'inline' : undefined}");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('keeps edgeCompensation with a TODO when the List also spreads props', async () => {
|
|
75
|
+
const output =
|
|
76
|
+
await applyTransform(`import {List} from '@astryxdesign/core/List';
|
|
77
|
+
const a = <List {...rest} edgeCompensation="inline" />;
|
|
78
|
+
const b = <List edgeCompensation="inline" {...rest} />;
|
|
79
|
+
const c = <List {...rest} edgeCompensation={mode} />;
|
|
80
|
+
const d = <List {...props} />;
|
|
81
|
+
const e = <List {...rest} edge="padded" />;`);
|
|
82
|
+
|
|
83
|
+
// a: an edge in the spread wins today, and a new edge would override
|
|
84
|
+
// it. b: the spread may override either prop. c: dynamic value and a
|
|
85
|
+
// spread, one TODO. d: no evidence of the old prop, so unchanged; its
|
|
86
|
+
// @deprecated type reports a typed use where the props are written.
|
|
87
|
+
// e: no old prop.
|
|
88
|
+
expect(output.match(/TODO\(astryx upgrade\)/g)).toHaveLength(3);
|
|
89
|
+
const code = output.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
90
|
+
expect(code).not.toContain("edge='outset'");
|
|
91
|
+
expect(code.match(/edgeCompensation="inline"/g)).toHaveLength(2);
|
|
92
|
+
expect(output).toContain('edgeCompensation={mode}');
|
|
93
|
+
expect(output).toContain('const d = <List {...props} />;');
|
|
94
|
+
expect(output).toContain('edge="padded"');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('leaves other components, other packages, and unrelated spreads alone', async () => {
|
|
98
|
+
const source = `import {List} from '@astryxdesign/core/List';
|
|
99
|
+
import {TabList} from '@astryxdesign/core/TabList';
|
|
100
|
+
import {List as Other} from 'some-other-package';
|
|
101
|
+
const a = <TabList edgeCompensation="inline" {...props} />;
|
|
102
|
+
const b = <Other edgeCompensation="inline" {...props} />;
|
|
103
|
+
const c = <div {...props} />;`;
|
|
104
|
+
expect(await applyTransform(source)).toBe(source);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('changes nothing on a second run', async () => {
|
|
108
|
+
const once =
|
|
109
|
+
await applyTransform(`import {List} from '@astryxdesign/core/List';
|
|
110
|
+
const a = <List edgeCompensation="inline" />;
|
|
111
|
+
const b = <List edgeCompensation={mode} />;
|
|
112
|
+
const c = <List {...props} edgeCompensation="inline" />;
|
|
113
|
+
const d = <List edge="flush" edgeCompensation="inline" />;
|
|
114
|
+
const e = <List edge={edge} edgeCompensation="inline" />;`);
|
|
115
|
+
const twice = await applyTransform(once);
|
|
116
|
+
|
|
117
|
+
expect(twice).toBe(once);
|
|
118
|
+
expect(twice.match(/TODO\(astryx upgrade\)/g)).toHaveLength(3);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file next transform manifest
|
|
5
|
+
*
|
|
6
|
+
* Staged codemods for the next release. The Version Packages PR promotes
|
|
7
|
+
* this file into the resolved version folder.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import migrateListEdgeCompensationToEdge, {
|
|
11
|
+
meta as migrateListEdgeCompensationToEdgeMeta,
|
|
12
|
+
} from './migrate-list-edge-compensation-to-edge.mjs';
|
|
13
|
+
|
|
14
|
+
export default [
|
|
15
|
+
{
|
|
16
|
+
name: 'migrate-list-edge-compensation-to-edge',
|
|
17
|
+
transform: migrateListEdgeCompensationToEdge,
|
|
18
|
+
meta: migrateListEdgeCompensationToEdgeMeta,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Codemod: migrate List edgeCompensation to edge
|
|
5
|
+
*
|
|
6
|
+
* `edgeCompensation="inline"` on an imported `List` becomes `edge="outset"`,
|
|
7
|
+
* the value it already resolves to. List resolves
|
|
8
|
+
* `edge ?? (edgeCompensation === 'inline' ? 'outset' : 'padded')`, so `edge`
|
|
9
|
+
* wins only when it has a value. The deprecated prop is removed beside an
|
|
10
|
+
* `edge` string that no later spread can override; beside a computed `edge`,
|
|
11
|
+
* which may be undefined at runtime, it gets a TODO instead.
|
|
12
|
+
*
|
|
13
|
+
* Built on the shared `transformProp` helper, so it does not follow
|
|
14
|
+
* variables, helpers, wrappers, or types. Where a List writes
|
|
15
|
+
* `edgeCompensation` but the codemod cannot prove the result, it keeps the
|
|
16
|
+
* old prop and leaves a TODO instead of guessing: on a dynamic value, and
|
|
17
|
+
* wherever the List also spreads props. A spread before the old prop may
|
|
18
|
+
* carry an `edge` that wins today and that a new `edge` would override; one
|
|
19
|
+
* after it may override either prop. A spread onto a List that never writes
|
|
20
|
+
* `edgeCompensation` is not evidence of use, so it stays unchanged
|
|
21
|
+
* (`spec:AST-040` FR1): the deprecated prop keeps working through it, and
|
|
22
|
+
* its `@deprecated` type reports a typed use where the props are written.
|
|
23
|
+
* Comments are the codemod's only report channel (`api.report` is a stub),
|
|
24
|
+
* and each is added once, so a second run changes nothing.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import {transformProp} from '../../transform-prop.mjs';
|
|
28
|
+
|
|
29
|
+
export const meta = {
|
|
30
|
+
title: 'Migrate List edgeCompensation to edge',
|
|
31
|
+
description:
|
|
32
|
+
'Renames `edgeCompensation="inline"` to `edge="outset"` on List, and ' +
|
|
33
|
+
'drops `edgeCompensation` beside an `edge` string. Keeps the old prop ' +
|
|
34
|
+
'with a TODO where `edge` is computed or a later spread may override ' +
|
|
35
|
+
'it, on a dynamic value, and where the List also spreads props; the ' +
|
|
36
|
+
'deprecated prop still works there.',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const OLD_NAME = 'edgeCompensation';
|
|
40
|
+
const NEW_NAME = 'edge';
|
|
41
|
+
const CORE_IMPORT_RE = /^@(astryxdesign|xds)\/core(?:\/|$)/;
|
|
42
|
+
|
|
43
|
+
const COMPONENT_PROPS = new Map([['List', new Set([OLD_NAME])]]);
|
|
44
|
+
|
|
45
|
+
const DYNAMIC_COMMENT =
|
|
46
|
+
' TODO(astryx upgrade): edgeCompensation is deprecated. Replace ' +
|
|
47
|
+
'edgeCompensation="inline" with edge="outset" by hand; this value is ' +
|
|
48
|
+
'computed. ';
|
|
49
|
+
const BOTH_SET_COMMENT =
|
|
50
|
+
' TODO(astryx upgrade): edgeCompensation is deprecated. edge is also set ' +
|
|
51
|
+
'here, but it may be undefined, and then edgeCompensation still applies. ' +
|
|
52
|
+
'Make edge default to "outset" where edgeCompensation is "inline", then ' +
|
|
53
|
+
'remove edgeCompensation. ';
|
|
54
|
+
const SPREAD_COMMENT =
|
|
55
|
+
' TODO(astryx upgrade): edgeCompensation is deprecated, but this List ' +
|
|
56
|
+
'also spreads props that may set edge, so it was left unchanged. Replace ' +
|
|
57
|
+
'edgeCompensation="inline" with edge="outset" by hand, after checking ' +
|
|
58
|
+
'which edge the spread passes. ';
|
|
59
|
+
|
|
60
|
+
const TYPE_WRAPPERS = new Set([
|
|
61
|
+
'TSAsExpression',
|
|
62
|
+
'TSSatisfiesExpression',
|
|
63
|
+
'TSTypeAssertion',
|
|
64
|
+
'TSNonNullExpression',
|
|
65
|
+
'TypeCastExpression',
|
|
66
|
+
'ParenthesizedExpression',
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
/** @param {any} node */
|
|
70
|
+
function unwrap(node) {
|
|
71
|
+
let current = node;
|
|
72
|
+
while (current && TYPE_WRAPPERS.has(current.type)) {
|
|
73
|
+
current = current.expression;
|
|
74
|
+
}
|
|
75
|
+
return current;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** @param {any} node */
|
|
79
|
+
function isStringLiteral(node) {
|
|
80
|
+
const value = unwrap(node);
|
|
81
|
+
return (
|
|
82
|
+
value != null &&
|
|
83
|
+
(value.type === 'StringLiteral' || value.type === 'Literal') &&
|
|
84
|
+
typeof value.value === 'string'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The value of a JSX attribute: the string of `edge="flush"`, or the
|
|
90
|
+
* expression inside `edge={...}`.
|
|
91
|
+
* @param {any} attribute
|
|
92
|
+
*/
|
|
93
|
+
function attributeValue(attribute) {
|
|
94
|
+
return attribute.value?.type === 'JSXExpressionContainer'
|
|
95
|
+
? attribute.value.expression
|
|
96
|
+
: attribute.value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** @param {any} node */
|
|
100
|
+
function isInlineLiteral(node) {
|
|
101
|
+
const value = unwrap(node);
|
|
102
|
+
return (
|
|
103
|
+
value != null &&
|
|
104
|
+
(value.type === 'StringLiteral' || value.type === 'Literal') &&
|
|
105
|
+
value.value === 'inline'
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Attach a comment to a node once, so re-running the codemod adds nothing.
|
|
111
|
+
* @param {any} j @param {any} node @param {string} text
|
|
112
|
+
*/
|
|
113
|
+
function addComment(j, node, text) {
|
|
114
|
+
node.comments ??= [];
|
|
115
|
+
if (node.comments.some((/** @type {any} */ c) => c.value === text)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
node.comments.push(j.commentBlock(text, true, false));
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** @param {any} attributes */
|
|
123
|
+
function firstSpread(attributes) {
|
|
124
|
+
return attributes.find(
|
|
125
|
+
(/** @type {any} */ attribute) => attribute.type === 'JSXSpreadAttribute',
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @param {import('../../../../authoring/codemod/type').AstryxCodemodFile} file
|
|
131
|
+
* @param {import('../../../../authoring/codemod/type').CodemodTransformApi} api
|
|
132
|
+
* @returns {string | null | undefined}
|
|
133
|
+
*/
|
|
134
|
+
export default function transformer(file, api) {
|
|
135
|
+
const j = api.jscodeshift;
|
|
136
|
+
const root = j(file.source);
|
|
137
|
+
let hasChanges = false;
|
|
138
|
+
|
|
139
|
+
transformProp(
|
|
140
|
+
root,
|
|
141
|
+
j,
|
|
142
|
+
{
|
|
143
|
+
matchesImport: source => CORE_IMPORT_RE.test(source),
|
|
144
|
+
components: COMPONENT_PROPS,
|
|
145
|
+
},
|
|
146
|
+
propPath => {
|
|
147
|
+
const opening = propPath.parent?.node;
|
|
148
|
+
const attributes = opening?.attributes ?? [];
|
|
149
|
+
const prop = propPath.node;
|
|
150
|
+
const edgeIndex = attributes.findIndex(
|
|
151
|
+
(/** @type {any} */ attribute) =>
|
|
152
|
+
attribute.type === 'JSXAttribute' &&
|
|
153
|
+
attribute.name?.name === NEW_NAME,
|
|
154
|
+
);
|
|
155
|
+
if (edgeIndex !== -1) {
|
|
156
|
+
// `edge` wins only when it has a value. A string that no later
|
|
157
|
+
// spread can override always does, so the old prop is inert and
|
|
158
|
+
// removing it changes nothing. A computed `edge` may be undefined,
|
|
159
|
+
// and then the old prop still decides.
|
|
160
|
+
const isProven =
|
|
161
|
+
isStringLiteral(attributeValue(attributes[edgeIndex])) &&
|
|
162
|
+
!attributes
|
|
163
|
+
.slice(edgeIndex + 1)
|
|
164
|
+
.some(
|
|
165
|
+
(/** @type {any} */ attribute) =>
|
|
166
|
+
attribute.type === 'JSXSpreadAttribute',
|
|
167
|
+
);
|
|
168
|
+
if (isProven) {
|
|
169
|
+
opening.attributes = attributes.filter(
|
|
170
|
+
(/** @type {any} */ attribute) => attribute !== prop,
|
|
171
|
+
);
|
|
172
|
+
hasChanges = true;
|
|
173
|
+
} else {
|
|
174
|
+
hasChanges = addComment(j, prop, BOTH_SET_COMMENT) || hasChanges;
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// With a spread on the element the rename cannot be proven: a spread
|
|
179
|
+
// before the old prop may carry an `edge` that wins today and that a
|
|
180
|
+
// new `edge` would override, and one after it may override either
|
|
181
|
+
// prop. The old prop keeps working, so it stays, with a TODO.
|
|
182
|
+
if (firstSpread(attributes)) {
|
|
183
|
+
hasChanges = addComment(j, prop, SPREAD_COMMENT) || hasChanges;
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (isInlineLiteral(attributeValue(prop))) {
|
|
187
|
+
prop.name.name = NEW_NAME;
|
|
188
|
+
prop.value = j.stringLiteral('outset');
|
|
189
|
+
hasChanges = true;
|
|
190
|
+
} else {
|
|
191
|
+
hasChanges = addComment(j, prop, DYNAMIC_COMMENT) || hasChanges;
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
if (!hasChanges) return undefined;
|
|
197
|
+
return root.toSource({quote: 'single'});
|
|
198
|
+
}
|