@astryxdesign/cli 0.1.8-canary.0c4d8d7 → 0.1.8-canary.0db5dfd
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/{src/api → api/blog}/blog.mjs +42 -6
- package/{src/api → api/blog}/blog.test.mjs +2 -2
- package/api/build/build.mjs +92 -0
- package/api/build/build.test.mjs +92 -0
- package/{src/api → api/component}/component.mjs +49 -26
- package/{src/api → api/discover}/discover.mjs +55 -18
- package/{src/api → api/docs}/docs.mjs +47 -21
- package/{src/api → api/doctor}/doctor.mjs +11 -8
- package/{src/api → api/hook}/hook.mjs +11 -11
- package/{src/api → api}/index.mjs +16 -9
- package/{src/api → api/integration}/validate-integration.mjs +48 -15
- package/{src/api → api/integration}/validate-integration.test.mjs +1 -1
- package/{src/api → api/layout}/layout.mjs +66 -17
- package/{src/api → api/layout}/layout.test.mjs +1 -1
- package/{src/api → api/search}/search.mjs +71 -12
- package/api/swizzle/swizzle.mjs +283 -0
- package/{src/commands → api/swizzle}/swizzle.test.mjs +26 -1
- package/{src/api → api/template}/template-integration.test.mjs +2 -2
- package/{src/api → api/template}/template-suffix.test.mjs +3 -3
- package/{src/api → api/template}/template.mjs +96 -19
- package/{src/api → api/theme}/theme-add.mjs +35 -7
- package/{src → authoring}/codemod.mjs +6 -6
- package/{src → authoring}/config.test.mjs +1 -1
- package/{src → authoring}/doc.mjs +1 -1
- package/{src → authoring}/doc.test.mjs +1 -1
- package/{src → authoring}/template.mjs +1 -1
- package/bin/astryx.mjs +12 -10
- package/{src → cli}/commands/blog.mjs +48 -7
- package/{src → cli}/commands/build-theme.mjs +125 -46
- package/{src → cli}/commands/build.mjs +33 -57
- package/{src → cli}/commands/component/index.mjs +49 -22
- package/{src → cli}/commands/component-ownership.test.mjs +3 -3
- package/{src → cli}/commands/component-package.test.mjs +1 -1
- package/{src → cli}/commands/component-resolution.test.mjs +2 -2
- package/{src → cli}/commands/discover.mjs +17 -8
- package/{src → cli}/commands/docs.mjs +39 -7
- package/{src → cli}/commands/docs.test.mjs +1 -1
- package/{src → cli}/commands/doctor.mjs +3 -3
- package/{src → cli}/commands/doctor.test.mjs +2 -2
- package/{src → cli}/commands/ensure-core-built.mjs +3 -2
- package/{src → cli}/commands/external-showcase.test.mjs +1 -1
- package/{src → cli}/commands/hook/index.mjs +37 -14
- package/{src → cli}/commands/import-hint-correctness.test.mjs +1 -1
- package/{src → cli}/commands/init.mjs +20 -9
- package/{src → cli}/commands/layout.mjs +58 -18
- package/{src → cli}/commands/search.mjs +19 -12
- package/{src → cli}/commands/search.test.mjs +1 -1
- package/{src → cli}/commands/setup-nudge.test.mjs +1 -1
- package/cli/commands/swizzle.mjs +103 -0
- package/{src → cli}/commands/template.mjs +73 -22
- package/{src → cli}/commands/template.path-safety.test.mjs +2 -2
- package/{src → cli}/commands/upgrade.integration-policy.test.mjs +1 -1
- package/{src → cli}/commands/upgrade.mjs +160 -52
- package/{src → cli}/commands/upgrade.test.mjs +1 -1
- package/{src → cli}/commands/validate-integration.mjs +17 -37
- package/{src → cli}/index.mjs +17 -15
- package/{src/codemods → codemods}/ensure-jscodeshift.mjs +1 -1
- package/{src/codemods → codemods}/integration-discovery.mjs +6 -3
- package/{src/codemods → codemods}/integration-discovery.test.mjs +1 -1
- package/{src/codemods → codemods}/integration-runner.mjs +8 -3
- package/{src/codemods → codemods}/registry.mjs +3 -1
- package/{src/codemods → codemods}/run-codemod.mjs +17 -10
- package/{src/codemods → codemods}/runner.mjs +22 -12
- package/{src/codemods → codemods}/transforms/v0.0.10/remove-size-props.mjs +9 -4
- package/{src/codemods → codemods}/transforms/v0.0.12/add-is-icon-only.mjs +27 -22
- package/{src/codemods → codemods}/transforms/v0.0.13/icon-name-deprecations.mjs +12 -5
- package/{src/codemods → codemods}/transforms/v0.0.13/rename-attachments-to-drawer.mjs +15 -8
- package/{src/codemods → codemods}/transforms/v0.0.13/toolbar-density-to-size.mjs +10 -4
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-action-props.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-section-wash-to-muted.mjs +11 -6
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-status-variants.mjs +15 -10
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-item-children-to-endcontent.mjs +13 -8
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-selector-children-to-render-option.mjs +18 -13
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-theme-selectors-to-data-attrs.mjs +8 -4
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-date-picker-to-input.mjs +11 -6
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-imperative-ref-to-handleRef.mjs +6 -1
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-isStreaming-to-isStopShown.mjs +6 -1
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-stack-element-to-as.mjs +8 -3
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-badge-dot-to-statusdot.mjs +17 -10
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-gap-to-numeric.mjs +7 -1
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-isFullBleed-to-padding.mjs +9 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-useXDSIcon-to-getIcon.mjs +12 -7
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-banner-endButton-to-endContent.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-form-tooltip-startIcon.mjs +8 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-isShown-to-isOpen.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-selector-items-to-options.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-sidenav-header-to-heading.mjs +11 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-topnav-title-to-heading.mjs +10 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/unify-uncontrolled-to-defaultX.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/unify-visibility-to-onOpenChange.mjs +10 -5
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-badge-children-to-label.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-collapse-to-collapsible.mjs +9 -3
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-radius-tokens.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-shadow-tokens.mjs +13 -6
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-skeleton-radius.mjs +7 -1
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-token-names.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.7/rename-banner-variant-to-container.mjs +8 -3
- package/{src/codemods → codemods}/transforms/v0.0.8/migrate-token-renames.mjs +15 -8
- package/{src/codemods → codemods}/transforms/v0.0.8/rename-endslot-to-endcontent.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.1.0/drop-xds-prefix-imports.mjs +19 -14
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-css-surfaces.mjs +21 -17
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-declare-module.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-module-specifiers.mjs +16 -11
- package/{src/codemods → codemods}/transforms/v0.1.2/rename-text-color-active-to-accent.mjs +15 -9
- package/{src/codemods → codemods}/transforms/v0.1.3/migrate-layout-components-to-experimental.mjs +17 -12
- package/{src/codemods → codemods}/transforms/v0.1.5/rename-switch-label-spacing-default-to-hug.mjs +15 -9
- package/{src/codemods → codemods}/transforms/v0.1.7/migrate-table-tableprops-to-direct-props.mjs +17 -10
- package/{src/codemods → codemods}/transforms/v0.1.7/rename-table-renderprops-styles-to-xstyle.mjs +18 -13
- package/{src/codemods → codemods}/transforms/v0.1.8/rename-avatar-size-scale.mjs +15 -10
- package/docs/internationalization.doc.mjs +92 -46
- package/{src/commands → lib/agent-docs}/agent-docs.mjs +30 -11
- package/{src/commands → lib/agent-docs}/agent-docs.path-safety.test.mjs +1 -1
- package/{src/lib → lib}/component-discovery.mjs +44 -2
- package/{src/lib → lib}/component-format.mjs +65 -24
- package/{src/lib → lib}/component-loader.mjs +27 -13
- package/{src/lib → lib}/componentDocOverlay.test.mjs +0 -1
- package/{src/lib → lib}/error-codes.test.mjs +1 -1
- package/{src/lib → lib}/hook-discovery.mjs +14 -1
- package/{src/lib → lib}/hook-format.mjs +29 -5
- package/{src/lib → lib}/integration-warnings.mjs +2 -2
- package/{src/lib → lib}/integrations.mjs +20 -0
- package/{src/lib → lib}/integrations.test.mjs +1 -1
- package/{src/lib → lib}/json-contract.test.mjs +1 -1
- package/{src/lib → lib}/json-shim.mjs +10 -5
- package/{src/lib → lib}/json-shim.test.mjs +1 -1
- package/{src/lib → lib}/levenshtein.mjs +6 -0
- package/{src/lib → lib}/manifest.mjs +7 -5
- package/{src/lib → lib}/manifest.test.mjs +2 -2
- package/{src/lib → lib}/module-loader.mjs +1 -0
- package/{src/lib → lib}/package-scanner.mjs +47 -0
- package/{src/lib → lib}/project.mjs +48 -18
- package/{src/lib → lib}/project.test.mjs +1 -1
- package/{src/lib → lib}/resolve-theme.mjs +5 -0
- package/{src/lib → lib}/string-utils.mjs +15 -0
- package/{src/lib → lib}/term-log.mjs +12 -3
- package/{src/lib → lib}/xle/browser.mjs +18 -8
- package/{src/lib → lib}/xle/expand.mjs +155 -22
- package/{src/lib → lib}/xle/parse.mjs +119 -13
- package/{src/lib → lib}/xle/print.mjs +54 -14
- package/{src/lib → lib}/xle/registry-core.mjs +28 -3
- package/{src/lib → lib}/xle/registry.mjs +9 -4
- package/{src/lib → lib}/xle/splice.mjs +13 -2
- package/{src/lib → lib}/xle/validate.mjs +95 -14
- package/lib/xle/xle-ast.d.ts +214 -0
- package/package.json +33 -26
- package/scripts/postinstall.mjs +4 -4
- package/templates/blocks/components/Avatar/AvatarShowcase.tsx +1 -1
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.doc.mjs +19 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +46 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.doc.mjs +14 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.tsx +33 -0
- package/{src/types → types}/api.contract.assert.ts +17 -8
- package/{src/types → types}/api.d.ts +106 -0
- package/{src/types → types}/base.d.ts +17 -2
- package/types/build.d.ts +53 -0
- package/types/codemod.d.ts +166 -0
- package/{src/types → types}/component.d.ts +1 -1
- package/{src/types → types}/discover.d.ts +1 -1
- package/{src/types → types}/docs.d.ts +1 -4
- package/{src/types → types}/hook.d.ts +1 -1
- package/types/jscodeshift.d.ts +19 -0
- package/types/layout.d.ts +74 -0
- package/types/theme.d.ts +53 -0
- package/{src/types → types}/upgrade.d.ts +8 -1
- package/{src/utils → utils}/paths.mjs +4 -1
- package/src/commands/swizzle.mjs +0 -417
- package/src/types/build.d.ts +0 -23
- package/src/types/codemod.d.ts +0 -81
- package/src/types/theme.d.ts +0 -23
- /package/{src/api → api/docs}/docOverlays.test.mjs +0 -0
- /package/{src/api → api}/error.mjs +0 -0
- /package/{src/api → api/integration}/integration-block-exports.test.mjs +0 -0
- /package/{src/api → api/template}/template.test.mjs +0 -0
- /package/{src → authoring}/codemod.test.mjs +0 -0
- /package/{src → authoring}/config.mjs +0 -0
- /package/{src → authoring}/integration.mjs +0 -0
- /package/{src → authoring}/template.test.mjs +0 -0
- /package/{src → cli}/cli-exit-codes.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.color-scheme.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.import-path.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.path-safety.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.prose.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.variants.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.watch.test.mjs +0 -0
- /package/{src → cli}/commands/cli-postinstall.test.mjs +0 -0
- /package/{src → cli}/commands/component.test.mjs +0 -0
- /package/{src → cli}/commands/detail-levels.test.mjs +0 -0
- /package/{src → cli}/commands/init.next-steps.test.mjs +0 -0
- /package/{src → cli}/commands/interactive-guard.test.mjs +0 -0
- /package/{src → cli}/commands/json-contract.test.mjs +0 -0
- /package/{src → cli}/commands/swizzle.path-safety.test.mjs +0 -0
- /package/{src → cli}/commands/swizzle.routing.test.mjs +0 -0
- /package/{src → cli}/commands/template.test.mjs +0 -0
- /package/{src → cli}/commands/upgrade.config-ordering.test.mjs +0 -0
- /package/{src → cli}/commands/validate-integration.test.mjs +0 -0
- /package/{src → cli}/update-hint-commands.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/registry.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-imperative-ref-to-handleRef.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-isStreaming-to-isStopShown.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-section-wash-to-muted.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/runner.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/toolbar-density-to-size.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/validation.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.10/__tests__/remove-size-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.10/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.12/__tests__/add-is-icon-only.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.12/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/icon-name-deprecations.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/rename-attachments-to-drawer.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-action-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-item-children-to-endcontent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-selector-children-to-render-option.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-theme-selectors-to-data-attrs.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-date-picker-to-input.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-stack-element-to-as.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-badge-dot-to-statusdot.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-gap-to-numeric.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-isFullBleed-to-padding.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-useXDSIcon-to-getIcon.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-banner-endButton-to-endContent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-form-tooltip-startIcon.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-isShown-to-isOpen.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-selector-items-to-options.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-sidenav-header-to-heading.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-topnav-title-to-heading.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-uncontrolled-to-defaultX.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-visibility-to-onOpenChange.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-collapse-to-collapsible.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-radius-tokens.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-shadow-tokens.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-skeleton-radius.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-token-names.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.7/__tests__/rename-banner-variant-to-container.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.7/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/migrate-token-renames.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/rename-endslot-to-endcontent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/drop-xds-prefix-imports.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-css-surfaces.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-declare-module.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-module-specifiers.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/v0.1.0-ordering.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.2/__tests__/rename-text-color-active-to-accent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.2/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.3/__tests__/migrate-layout-components-to-experimental.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.3/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.5/__tests__/rename-switch-label-spacing-default-to-hug.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.5/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/migrate-table-tableprops-to-direct-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/rename-table-renderprops-styles-to-xstyle.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.8/index.mjs +0 -0
- /package/{src/commands → lib/agent-docs}/agent-docs.test.mjs +0 -0
- /package/{src/lib → lib}/cli-error.mjs +0 -0
- /package/{src/lib → lib}/cli-error.test.mjs +0 -0
- /package/{src/lib → lib}/component-discovery.importpath.test.mjs +0 -0
- /package/{src/lib → lib}/component-format.test.mjs +0 -0
- /package/{src/lib → lib}/component-loader.test.mjs +0 -0
- /package/{src/lib → lib}/config-cache.mjs +0 -0
- /package/{src/lib → lib}/config-cache.test.mjs +0 -0
- /package/{src/lib → lib}/config-schema.mjs +0 -0
- /package/{src/lib → lib}/error-codes.mjs +0 -0
- /package/{src/lib → lib}/integration-warnings.test.mjs +0 -0
- /package/{src/lib → lib}/json.mjs +0 -0
- /package/{src/lib → lib}/module-loader.test.mjs +0 -0
- /package/{src/lib → lib}/node-version.mjs +0 -0
- /package/{src/lib → lib}/node-version.test.mjs +0 -0
- /package/{src/lib → lib}/parse.mjs +0 -0
- /package/{src/lib → lib}/site.mjs +0 -0
- /package/{src/lib → lib}/xle/browser.d.ts +0 -0
- /package/{src/lib → lib}/xle/xle.test.mjs +0 -0
- /package/{src/schemas → schemas}/doc-schema.mjs +0 -0
- /package/{src/schemas → schemas}/template-schema.mjs +0 -0
- /package/{src/types → types}/config.d.ts +0 -0
- /package/{src/types → types}/doc.d.ts +0 -0
- /package/{src/types → types}/doctor.d.ts +0 -0
- /package/{src/types → types}/error-codes.d.ts +0 -0
- /package/{src/types → types}/index.d.ts +0 -0
- /package/{src/types → types}/integration.d.ts +0 -0
- /package/{src/types → types}/manifest.d.ts +0 -0
- /package/{src/types → types}/search.d.ts +0 -0
- /package/{src/types → types}/swizzle.d.ts +0 -0
- /package/{src/types → types}/template-api.d.ts +0 -0
- /package/{src/types → types}/template.d.ts +0 -0
- /package/{src/types → types}/validate-integration.d.ts +0 -0
- /package/{src/utils → utils}/github.mjs +0 -0
- /package/{src/utils → utils}/package-manager.mjs +0 -0
- /package/{src/utils → utils}/package-manager.test.mjs +0 -0
- /package/{src/utils → utils}/path-safety.mjs +0 -0
- /package/{src/utils → utils}/path-safety.test.mjs +0 -0
- /package/{src/utils → utils}/paths.test.mjs +0 -0
- /package/{src/utils → utils}/semver.mjs +0 -0
- /package/{src/utils → utils}/semver.test.mjs +0 -0
- /package/{src/utils → utils}/update-check.mjs +0 -0
- /package/{src/utils → utils}/update-check.test.mjs +0 -0
|
@@ -14,37 +14,34 @@
|
|
|
14
14
|
* an integration package is not a failure).
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {jsonOut, humanLog} from '
|
|
17
|
+
import {jsonOut, humanLog} from '../../lib/json.mjs';
|
|
18
18
|
import {
|
|
19
|
-
|
|
20
|
-
validateInstalledIntegration,
|
|
19
|
+
validateIntegration,
|
|
21
20
|
summarizeIssues,
|
|
22
|
-
} from '
|
|
21
|
+
} from '../../api/integration/validate-integration.mjs';
|
|
23
22
|
|
|
24
23
|
/**
|
|
25
24
|
* Render a validation result for humans.
|
|
26
|
-
* @param {import('
|
|
25
|
+
* @param {import('../../types/validate-integration').ValidateIntegrationResponse['data']} data
|
|
27
26
|
*/
|
|
28
|
-
function printHuman(
|
|
27
|
+
function printHuman(data) {
|
|
29
28
|
const label =
|
|
30
|
-
|
|
31
|
-
? `${result.name}@${result.version}`
|
|
32
|
-
: result.name;
|
|
29
|
+
data.version != null ? `${data.name}@${data.version}` : data.name;
|
|
33
30
|
humanLog(`Validating integration: ${label}`);
|
|
34
31
|
|
|
35
|
-
if (
|
|
32
|
+
if (data.issues.length === 0) {
|
|
36
33
|
humanLog('\n\u2713 No issues found.');
|
|
37
34
|
return;
|
|
38
35
|
}
|
|
39
36
|
|
|
40
37
|
humanLog('');
|
|
41
|
-
for (const issue of
|
|
38
|
+
for (const issue of data.issues) {
|
|
42
39
|
humanLog(` ${issue.severity} ${issue.code}: ${issue.message}`);
|
|
43
40
|
}
|
|
44
41
|
|
|
45
|
-
const {errors, warnings} = summarizeIssues(
|
|
42
|
+
const {errors, warnings} = summarizeIssues(data.issues);
|
|
46
43
|
humanLog(
|
|
47
|
-
`\n${
|
|
44
|
+
`\n${data.issues.length} issue(s): ${errors} error(s), ${warnings} warning(s)`,
|
|
48
45
|
);
|
|
49
46
|
}
|
|
50
47
|
|
|
@@ -74,35 +71,18 @@ export function registerValidateIntegration(program) {
|
|
|
74
71
|
.action(async pkg => {
|
|
75
72
|
const json = program.opts().json || false;
|
|
76
73
|
|
|
77
|
-
const result = pkg
|
|
78
|
-
? await validateInstalledIntegration(pkg)
|
|
79
|
-
: await validateLocalIntegration();
|
|
80
|
-
|
|
81
|
-
// No-arg + no local manifest: guidance, not an error.
|
|
82
|
-
if (!result.found) {
|
|
83
|
-
if (json) {
|
|
84
|
-
jsonOut('integration.validate', {
|
|
85
|
-
name: null,
|
|
86
|
-
version: null,
|
|
87
|
-
issues: [],
|
|
88
|
-
});
|
|
89
|
-
} else {
|
|
90
|
-
humanLog(NO_MANIFEST_GUIDANCE);
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
74
|
+
const result = await validateIntegration(pkg);
|
|
94
75
|
|
|
95
76
|
if (json) {
|
|
96
|
-
jsonOut(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
77
|
+
jsonOut(result.type, result.data);
|
|
78
|
+
} else if (result.data.name === null) {
|
|
79
|
+
// No-arg + no local manifest: guidance, not an error.
|
|
80
|
+
humanLog(NO_MANIFEST_GUIDANCE);
|
|
101
81
|
} else {
|
|
102
|
-
printHuman(result);
|
|
82
|
+
printHuman(result.data);
|
|
103
83
|
}
|
|
104
84
|
|
|
105
|
-
const {errors} = summarizeIssues(result.issues);
|
|
85
|
+
const {errors} = summarizeIssues(result.data.issues);
|
|
106
86
|
if (errors > 0) {
|
|
107
87
|
process.exitCode = 1;
|
|
108
88
|
}
|
package/{src → cli}/index.mjs
RENAMED
|
@@ -11,15 +11,15 @@ import {Command, Option} from 'commander';
|
|
|
11
11
|
import {fileURLToPath} from 'node:url';
|
|
12
12
|
import * as fs from 'node:fs';
|
|
13
13
|
import * as path from 'node:path';
|
|
14
|
-
import {checkForUpdate} from '
|
|
15
|
-
import {getCliInvocation} from '
|
|
16
|
-
import {API_VERSION, setJsonMode} from '
|
|
17
|
-
import {buildManifest} from '
|
|
18
|
-
import {cliError} from '
|
|
19
|
-
import {ERROR_CODES} from '
|
|
20
|
-
import {levenshteinDistance} from '
|
|
21
|
-
import {installJsonShim} from '
|
|
22
|
-
import {isAstryxInitialized} from '
|
|
14
|
+
import {checkForUpdate} from '../utils/update-check.mjs';
|
|
15
|
+
import {getCliInvocation} from '../utils/package-manager.mjs';
|
|
16
|
+
import {API_VERSION, setJsonMode} from '../lib/json.mjs';
|
|
17
|
+
import {buildManifest} from '../lib/manifest.mjs';
|
|
18
|
+
import {cliError} from '../lib/cli-error.mjs';
|
|
19
|
+
import {ERROR_CODES} from '../lib/error-codes.mjs';
|
|
20
|
+
import {levenshteinDistance} from '../lib/string-utils.mjs';
|
|
21
|
+
import {installJsonShim} from '../lib/json-shim.mjs';
|
|
22
|
+
import {isAstryxInitialized} from '../lib/agent-docs/agent-docs.mjs';
|
|
23
23
|
|
|
24
24
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
25
25
|
|
|
@@ -56,6 +56,7 @@ export const JSON_SUPPORTED = new Set([
|
|
|
56
56
|
'docs',
|
|
57
57
|
'discover',
|
|
58
58
|
'search',
|
|
59
|
+
'build',
|
|
59
60
|
'swizzle',
|
|
60
61
|
'template',
|
|
61
62
|
'hook',
|
|
@@ -102,7 +103,7 @@ program
|
|
|
102
103
|
if (extras.length > 0) {
|
|
103
104
|
const unknown = String(extras[0]);
|
|
104
105
|
const known = (program.commands || [])
|
|
105
|
-
.filter((c) => !c._hidden && c.name() !== 'help')
|
|
106
|
+
.filter((c) => !(/** @type {any} */ (c)._hidden) && c.name() !== 'help')
|
|
106
107
|
.map((c) => c.name());
|
|
107
108
|
const close = known
|
|
108
109
|
.map((name) => ({name, distance: levenshteinDistance(unknown.toLowerCase(), name.toLowerCase())}))
|
|
@@ -162,6 +163,7 @@ program
|
|
|
162
163
|
*/
|
|
163
164
|
function fullCommandName(actionCommand) {
|
|
164
165
|
const parts = [];
|
|
166
|
+
/** @type {import('commander').Command | null} */
|
|
165
167
|
let cmd = actionCommand;
|
|
166
168
|
while (cmd && cmd !== program) {
|
|
167
169
|
parts.unshift(cmd.name());
|
|
@@ -307,10 +309,10 @@ for (const cmd of commands) {
|
|
|
307
309
|
// Command fails to load but CLI still works
|
|
308
310
|
program
|
|
309
311
|
.command(cmd.name)
|
|
310
|
-
.description(`(failed to load: ${e.message})`)
|
|
312
|
+
.description(`(failed to load: ${/** @type {any} */ (e).message})`)
|
|
311
313
|
.action(() => {
|
|
312
314
|
console.error(`Command "${cmd.name}" failed to load:`);
|
|
313
|
-
console.error(e.message);
|
|
315
|
+
console.error(/** @type {any} */ (e).message);
|
|
314
316
|
process.exit(1);
|
|
315
317
|
});
|
|
316
318
|
}
|
|
@@ -348,9 +350,9 @@ program
|
|
|
348
350
|
.command('postinstall', {hidden: true})
|
|
349
351
|
.action(() => {
|
|
350
352
|
const r = getCliInvocation();
|
|
351
|
-
const pad = (s, len) => s + ' '.repeat(Math.max(0, len - s.length));
|
|
353
|
+
const pad = (/** @type {string} */ s, /** @type {number} */ len) => s + ' '.repeat(Math.max(0, len - s.length));
|
|
352
354
|
const W = 49; // inner width of the box
|
|
353
|
-
const line = (s) => ` │ ${pad(s, W)}│`;
|
|
355
|
+
const line = (/** @type {string} */ s) => ` │ ${pad(s, W)}│`;
|
|
354
356
|
console.log(`
|
|
355
357
|
╭${'─'.repeat(W + 2)}╮
|
|
356
358
|
${line('')}
|
|
@@ -376,5 +378,5 @@ ${line('')}
|
|
|
376
378
|
// patch outputHelp on every command (root + subcommands). The shim
|
|
377
379
|
// extends the --json contract to cover Commander's parse-time short
|
|
378
380
|
// circuits (parse errors, unknown options, --help, unknown commands).
|
|
379
|
-
// See packages/cli/
|
|
381
|
+
// See packages/cli/lib/json-shim.mjs for the rationale.
|
|
380
382
|
installJsonShim(program);
|
|
@@ -64,7 +64,7 @@ function installJscodeshift(silent = false) {
|
|
|
64
64
|
log.success('jscodeshift installed.');
|
|
65
65
|
return true;
|
|
66
66
|
} catch (err) {
|
|
67
|
-
log.error(`Failed to install jscodeshift: ${err.message}`);
|
|
67
|
+
log.error(`Failed to install jscodeshift: ${/** @type {any} */ (err).message}`);
|
|
68
68
|
return false;
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
import * as fs from 'node:fs';
|
|
28
28
|
import * as path from 'node:path';
|
|
29
29
|
import {loadModuleWithSchema} from '../lib/module-loader.mjs';
|
|
30
|
-
import {CodemodEnvelopeSchema} from '../codemod.mjs';
|
|
30
|
+
import {CodemodEnvelopeSchema} from '../authoring/codemod.mjs';
|
|
31
31
|
import {semverCompare} from '../utils/semver.mjs';
|
|
32
32
|
|
|
33
33
|
/** File extensions recognized as codemod modules. */
|
|
@@ -41,6 +41,7 @@ const CODEMOD_EXTENSIONS = ['.ts', '.mjs', '.js'];
|
|
|
41
41
|
* @returns {Array<{id: string, file: string}>}
|
|
42
42
|
*/
|
|
43
43
|
function collectCodemodFiles(versionDir) {
|
|
44
|
+
/** @type {Array<{id: string, file: string}>} */
|
|
44
45
|
const out = [];
|
|
45
46
|
|
|
46
47
|
/** @param {string} dir */
|
|
@@ -74,7 +75,7 @@ function collectCodemodFiles(versionDir) {
|
|
|
74
75
|
* for that version (across all integrations).
|
|
75
76
|
*/
|
|
76
77
|
export async function discoverIntegrationCodemods(loadedIntegrations = []) {
|
|
77
|
-
/** @type {Map<string, Array<{id: string, type:
|
|
78
|
+
/** @type {Map<string, Array<{id: string, type: 'code'|'config', codemod: object, package: string}>>} */
|
|
78
79
|
const byVersion = new Map();
|
|
79
80
|
|
|
80
81
|
for (const integration of loadedIntegrations ?? []) {
|
|
@@ -158,10 +159,12 @@ export async function discoverIntegrationCodemods(loadedIntegrations = []) {
|
|
|
158
159
|
*/
|
|
159
160
|
export function selectIntegrationCodemods(byVersion, from, to) {
|
|
160
161
|
const versions = [...byVersion.keys()].sort(semverCompare);
|
|
162
|
+
/** @type {Array<{version: string, codemods: Array<object>}>} */
|
|
161
163
|
const results = [];
|
|
162
164
|
for (const version of versions) {
|
|
163
165
|
if (semverCompare(version, from) > 0 && semverCompare(version, to) <= 0) {
|
|
164
|
-
|
|
166
|
+
const codemods = byVersion.get(version);
|
|
167
|
+
if (codemods) results.push({version, codemods});
|
|
165
168
|
}
|
|
166
169
|
}
|
|
167
170
|
return results;
|
|
@@ -54,7 +54,7 @@ function scaffold(codemodFiles) {
|
|
|
54
54
|
// from the vitest cwd (the repo root) instead.
|
|
55
55
|
const codemodModulePath = path.resolve(
|
|
56
56
|
process.cwd(),
|
|
57
|
-
'packages/cli/
|
|
57
|
+
'packages/cli/authoring/codemod.mjs',
|
|
58
58
|
);
|
|
59
59
|
const codemodModuleUrl = pathToFileURL(codemodModulePath).href;
|
|
60
60
|
|
|
@@ -31,15 +31,15 @@ import {
|
|
|
31
31
|
* Optional codemods (isOptional) are skipped unless explicitly requested via
|
|
32
32
|
* `codemod` (matched against the codemod id).
|
|
33
33
|
*
|
|
34
|
-
* @param {Array<{version: string, codemods: Array<
|
|
34
|
+
* @param {Array<{version: string, codemods: Array<import('../types/codemod').CodemodEntry>}>} versionGroups
|
|
35
35
|
* @param {object} options
|
|
36
36
|
* @param {boolean} options.apply
|
|
37
37
|
* @param {string} options.path source directory to scan
|
|
38
38
|
* @param {string} [options.codemod] run only this codemod id
|
|
39
39
|
* @param {Set<string>} [options.skipCodemods] codemod ids to exclude
|
|
40
|
-
* @param {
|
|
40
|
+
* @param {import('../types/codemod').JscodeshiftFactory} options.jscodeshift
|
|
41
41
|
* @param {boolean} [options.silent]
|
|
42
|
-
* @returns {{totalFilesChanged: number, totalTransformsApplied: number, writtenFiles: string[], errors: Array, skippedOptional: Array}}
|
|
42
|
+
* @returns {{totalFilesChanged: number, totalTransformsApplied: number, writtenFiles: string[], errors: Array<{file: string, codemod: string, error: string}>, skippedOptional: Array<import('../types/codemod').CodemodEntry>}}
|
|
43
43
|
*/
|
|
44
44
|
export function runIntegrationCodemods(
|
|
45
45
|
versionGroups,
|
|
@@ -49,12 +49,17 @@ export function runIntegrationCodemods(
|
|
|
49
49
|
|
|
50
50
|
let totalFilesChanged = 0;
|
|
51
51
|
let totalTransformsApplied = 0;
|
|
52
|
+
/** @type {string[]} */
|
|
52
53
|
const writtenFiles = [];
|
|
54
|
+
/** @type {Array<{file: string, codemod: string, error: string}>} */
|
|
53
55
|
const errors = [];
|
|
56
|
+
/** @type {Array<import('../types/codemod').CodemodEntry>} */
|
|
54
57
|
const skippedOptional = [];
|
|
55
58
|
|
|
56
59
|
// Flatten and split by type, preserving version ordering.
|
|
60
|
+
/** @type {Array<import('../types/codemod').CodemodEntry>} */
|
|
57
61
|
const configEntries = [];
|
|
62
|
+
/** @type {Array<import('../types/codemod').CodemodEntry>} */
|
|
58
63
|
const codeEntries = [];
|
|
59
64
|
for (const {version, codemods} of versionGroups) {
|
|
60
65
|
for (const entry of codemods) {
|
|
@@ -45,16 +45,18 @@ export const latestVersion = versions[versions.length - 1];
|
|
|
45
45
|
*
|
|
46
46
|
* @param {string} from - Current version (exclusive)
|
|
47
47
|
* @param {string} to - Target version (inclusive)
|
|
48
|
-
* @returns {Promise<Array<{version: string, transforms: Array<{name: string,
|
|
48
|
+
* @returns {Promise<Array<{version: string, transforms: Array<{name: string, transform: import('../types/codemod').CodemodTransform, meta: {title: string, description?: string}}>}>>}
|
|
49
49
|
*/
|
|
50
50
|
export async function getTransformsBetween(from, to) {
|
|
51
51
|
const applicable = versions.filter(
|
|
52
52
|
v => semverCompare(v, from) > 0 && semverCompare(v, to) <= 0,
|
|
53
53
|
);
|
|
54
|
+
/** @type {Array<{version: string, transforms: Array<{name: string, transform: import('../types/codemod').CodemodTransform, meta: {title: string, description?: string}}>}>} */
|
|
54
55
|
const results = [];
|
|
55
56
|
|
|
56
57
|
for (const version of applicable) {
|
|
57
58
|
const loader = registry.get(version);
|
|
59
|
+
if (!loader) continue;
|
|
58
60
|
const manifest = await loader();
|
|
59
61
|
results.push({
|
|
60
62
|
version,
|
|
@@ -49,7 +49,9 @@ const PARSEABLE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs'];
|
|
|
49
49
|
* @returns {string[]}
|
|
50
50
|
*/
|
|
51
51
|
export function findSourceFiles(dir) {
|
|
52
|
+
/** @type {string[]} */
|
|
52
53
|
const results = [];
|
|
54
|
+
/** @param {string} currentDir */
|
|
53
55
|
function walk(currentDir) {
|
|
54
56
|
let entries;
|
|
55
57
|
try {
|
|
@@ -74,6 +76,7 @@ export function findSourceFiles(dir) {
|
|
|
74
76
|
/**
|
|
75
77
|
* No-op log surface for silent (`--json`) mode.
|
|
76
78
|
* @param {boolean} silent
|
|
79
|
+
* @returns {import('../types/codemod').CliLog}
|
|
77
80
|
*/
|
|
78
81
|
export function makeLog(silent) {
|
|
79
82
|
return silent
|
|
@@ -84,9 +87,9 @@ export function makeLog(silent) {
|
|
|
84
87
|
/**
|
|
85
88
|
* Apply a config codemod to the consumer's astryx.config.* file.
|
|
86
89
|
*
|
|
87
|
-
* @param {
|
|
88
|
-
* @param {{apply: boolean, log:
|
|
89
|
-
* @returns {
|
|
90
|
+
* @param {import('../types/codemod').CodemodEntry} entry normalized codemod entry {id, codemod, package}
|
|
91
|
+
* @param {{apply: boolean, log: import('../types/codemod').CliLog, jscodeshift: import('../types/codemod').JscodeshiftFactory}} ctx
|
|
92
|
+
* @returns {import('../types/codemod').CodemodRunResult}
|
|
90
93
|
*/
|
|
91
94
|
export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
|
|
92
95
|
const {codemod, id, package: pkg} = entry;
|
|
@@ -135,11 +138,12 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
|
|
|
135
138
|
errors: [],
|
|
136
139
|
};
|
|
137
140
|
} catch (err) {
|
|
138
|
-
|
|
141
|
+
const message = /** @type {any} */ (err).message;
|
|
142
|
+
log.error(` ✗ ${relativePath} — ${message}`);
|
|
139
143
|
return {
|
|
140
144
|
filesChanged: 0,
|
|
141
145
|
writtenFiles: [],
|
|
142
|
-
errors: [{file: relativePath, codemod: name, error:
|
|
146
|
+
errors: [{file: relativePath, codemod: name, error: message}],
|
|
143
147
|
};
|
|
144
148
|
}
|
|
145
149
|
}
|
|
@@ -147,10 +151,10 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
|
|
|
147
151
|
/**
|
|
148
152
|
* Apply a code codemod to discovered source files.
|
|
149
153
|
*
|
|
150
|
-
* @param {
|
|
154
|
+
* @param {import('../types/codemod').CodemodEntry} entry normalized codemod entry {id, codemod, package}
|
|
151
155
|
* @param {string[]} files
|
|
152
|
-
* @param {{apply: boolean, log:
|
|
153
|
-
* @returns {
|
|
156
|
+
* @param {{apply: boolean, log: import('../types/codemod').CliLog, jscodeshift: import('../types/codemod').JscodeshiftFactory}} ctx
|
|
157
|
+
* @returns {import('../types/codemod').CodemodRunResult}
|
|
154
158
|
*/
|
|
155
159
|
export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
|
|
156
160
|
const {codemod, id, package: pkg} = entry;
|
|
@@ -158,7 +162,9 @@ export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
|
|
|
158
162
|
const extensions = new Set(codemod.fileExtensions ?? DEFAULT_CODE_EXTENSIONS);
|
|
159
163
|
|
|
160
164
|
let filesChanged = 0;
|
|
165
|
+
/** @type {string[]} */
|
|
161
166
|
const writtenFiles = [];
|
|
167
|
+
/** @type {Array<{file: string, codemod: string, error: string}>} */
|
|
162
168
|
const errors = [];
|
|
163
169
|
|
|
164
170
|
for (const filePath of files) {
|
|
@@ -198,8 +204,9 @@ export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
|
|
|
198
204
|
log.warn(` ~ ${relativePath} (would change)`);
|
|
199
205
|
}
|
|
200
206
|
} catch (err) {
|
|
201
|
-
|
|
202
|
-
|
|
207
|
+
const message = /** @type {any} */ (err).message;
|
|
208
|
+
log.error(` ✗ ${relativePath} — ${message}`);
|
|
209
|
+
errors.push({file: relativePath, codemod: name, error: message});
|
|
203
210
|
}
|
|
204
211
|
}
|
|
205
212
|
|
|
@@ -51,6 +51,7 @@ export function fixDirectiveCorruption(code) {
|
|
|
51
51
|
* @returns {string[]}
|
|
52
52
|
*/
|
|
53
53
|
function findSourceFiles(dir) {
|
|
54
|
+
/** @type {string[]} */
|
|
54
55
|
const results = [];
|
|
55
56
|
const extensions = new Set([
|
|
56
57
|
'.tsx',
|
|
@@ -65,6 +66,7 @@ function findSourceFiles(dir) {
|
|
|
65
66
|
'.less',
|
|
66
67
|
]);
|
|
67
68
|
|
|
69
|
+
/** @param {string} currentDir */
|
|
68
70
|
function walk(currentDir) {
|
|
69
71
|
let entries;
|
|
70
72
|
try {
|
|
@@ -96,8 +98,9 @@ function findSourceFiles(dir) {
|
|
|
96
98
|
*
|
|
97
99
|
* @param {string} result - The transformed source code
|
|
98
100
|
* @param {string} source - The original source code
|
|
99
|
-
* @param {
|
|
100
|
-
* @
|
|
101
|
+
* @param {import('../types/codemod').JscodeshiftFactory} j - jscodeshift instance (with parser configured)
|
|
102
|
+
* @param {{parse?: boolean}} [options]
|
|
103
|
+
* @returns {{ valid: true } | { valid: false, reason: string }}
|
|
101
104
|
*/
|
|
102
105
|
export function validateOutput(result, source, j, {parse = true} = {}) {
|
|
103
106
|
// Check 1: Re-parse the output — catches syntax-breaking corruption
|
|
@@ -105,9 +108,10 @@ export function validateOutput(result, source, j, {parse = true} = {}) {
|
|
|
105
108
|
try {
|
|
106
109
|
j(result);
|
|
107
110
|
} catch (parseError) {
|
|
111
|
+
const message = /** @type {any} */ (parseError).message;
|
|
108
112
|
return {
|
|
109
113
|
valid: false,
|
|
110
|
-
reason: `transform produced unparseable output: ${
|
|
114
|
+
reason: `transform produced unparseable output: ${message}`,
|
|
111
115
|
};
|
|
112
116
|
}
|
|
113
117
|
}
|
|
@@ -147,9 +151,9 @@ export function validateOutput(result, source, j, {parse = true} = {}) {
|
|
|
147
151
|
* with the same `(file, api) => string | null | undefined` contract used by
|
|
148
152
|
* `createConfigCodemod`.
|
|
149
153
|
*
|
|
150
|
-
* @param {{name: string, transform:
|
|
154
|
+
* @param {{name: string, transform: import('../types/codemod').CodemodTransform, meta: {title: string, description?: string, fileExtensions?: string[], codemodType?: string}, optional?: boolean}} transformEntry
|
|
151
155
|
* @param {string} version
|
|
152
|
-
* @returns {
|
|
156
|
+
* @returns {import('../types/codemod').CodemodEntry}
|
|
153
157
|
*/
|
|
154
158
|
function toUnifiedEntry(transformEntry, version) {
|
|
155
159
|
const {name, transform, meta, optional} = transformEntry;
|
|
@@ -171,14 +175,14 @@ function toUnifiedEntry(transformEntry, version) {
|
|
|
171
175
|
/**
|
|
172
176
|
* Run codemods against source files.
|
|
173
177
|
*
|
|
174
|
-
* @param {Array<{version: string, transforms: Array}>} versionManifests
|
|
178
|
+
* @param {Array<{version: string, transforms: Array<{name: string, transform: import('../types/codemod').CodemodTransform, meta: {title: string, description?: string, fileExtensions?: string[], codemodType?: string}, optional?: boolean}>}>} versionManifests
|
|
175
179
|
* @param {object} options
|
|
176
180
|
* @param {boolean} options.apply - Write changes to disk
|
|
177
181
|
* @param {string} options.path - Source directory to scan
|
|
178
182
|
* @param {string|undefined} options.codemod - Run only this specific transform
|
|
179
183
|
* @param {Set<string>} [options.skipCodemods] - Transform names to exclude
|
|
180
184
|
* @param {boolean} [options.silent] - Suppress all human-facing output (for --json)
|
|
181
|
-
* @returns {{totalFilesChanged: number, totalTransformsApplied: number, totalValidationBlocked: number, writtenFiles: string[], errors: Array, skippedOptional: Array}}
|
|
185
|
+
* @returns {Promise<{totalFilesChanged: number, totalTransformsApplied: number, totalValidationBlocked: number, writtenFiles: string[], 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}>}
|
|
182
186
|
*/
|
|
183
187
|
export async function runCodemods(
|
|
184
188
|
versionManifests,
|
|
@@ -208,11 +212,11 @@ export async function runCodemods(
|
|
|
208
212
|
return {ok: false, reason: 'source_path_missing', resolvedPath};
|
|
209
213
|
}
|
|
210
214
|
|
|
215
|
+
/** @type {string[]} */
|
|
211
216
|
let files = [];
|
|
212
217
|
if (sourcePathExists) {
|
|
213
218
|
log.step(`Scanning ${resolvedPath} for source files...`);
|
|
214
219
|
files = findSourceFiles(resolvedPath);
|
|
215
|
-
|
|
216
220
|
if (files.length === 0) {
|
|
217
221
|
log.warn('No source files found.');
|
|
218
222
|
} else {
|
|
@@ -223,15 +227,20 @@ export async function runCodemods(
|
|
|
223
227
|
}
|
|
224
228
|
|
|
225
229
|
// Dynamically import jscodeshift
|
|
226
|
-
const jscodeshift =
|
|
230
|
+
const jscodeshift =
|
|
231
|
+
/** @type {import('../types/codemod').JscodeshiftFactory} */ (
|
|
232
|
+
(await import('jscodeshift')).default
|
|
233
|
+
);
|
|
227
234
|
|
|
228
235
|
let totalFilesChanged = 0;
|
|
229
236
|
let totalTransformsApplied = 0;
|
|
230
237
|
let totalValidationBlocked = 0;
|
|
238
|
+
/** @type {Array<{file: string, codemod: string, error: string}>} */
|
|
231
239
|
const errors = [];
|
|
240
|
+
/** @type {string[]} */
|
|
232
241
|
const writtenFiles = [];
|
|
242
|
+
/** @type {Array<{name: string, meta: {title: string, description?: string, fileExtensions?: string[], codemodType?: string}, version: string}>} */
|
|
233
243
|
const skippedOptional = [];
|
|
234
|
-
|
|
235
244
|
for (const {version, transforms} of versionManifests) {
|
|
236
245
|
log.step(`Applying v${version} codemods...`);
|
|
237
246
|
|
|
@@ -333,8 +342,9 @@ export async function runCodemods(
|
|
|
333
342
|
}
|
|
334
343
|
}
|
|
335
344
|
} catch (err) {
|
|
336
|
-
|
|
337
|
-
|
|
345
|
+
const message = /** @type {any} */ (err).message;
|
|
346
|
+
log.error(` ✗ ${relativePath} — ${message}`);
|
|
347
|
+
errors.push({file: relativePath, codemod: name, error: message});
|
|
338
348
|
}
|
|
339
349
|
}
|
|
340
350
|
|
|
@@ -32,6 +32,11 @@ export const meta = {
|
|
|
32
32
|
pr: '#966',
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* @param {import('../../../types/codemod').AstryxCodemodFile} file
|
|
37
|
+
* @param {import('../../../types/codemod').CodemodTransformApi} api
|
|
38
|
+
* @returns {string | null | undefined}
|
|
39
|
+
*/
|
|
35
40
|
export default function transformer(file, api) {
|
|
36
41
|
const j = api.jscodeshift;
|
|
37
42
|
const root = j(file.source);
|
|
@@ -40,7 +45,7 @@ export default function transformer(file, api) {
|
|
|
40
45
|
// 1. Remove size JSX prop from target components
|
|
41
46
|
root
|
|
42
47
|
.find(j.JSXOpeningElement)
|
|
43
|
-
.filter((path) => {
|
|
48
|
+
.filter((/** @type {any} */ path) => {
|
|
44
49
|
const name = path.node.name;
|
|
45
50
|
// Handle simple names like <XDSStatusDot>
|
|
46
51
|
if (name.type === 'JSXIdentifier') {
|
|
@@ -48,10 +53,10 @@ export default function transformer(file, api) {
|
|
|
48
53
|
}
|
|
49
54
|
return false;
|
|
50
55
|
})
|
|
51
|
-
.forEach((path) => {
|
|
56
|
+
.forEach((/** @type {any} */ path) => {
|
|
52
57
|
const attrs = path.node.attributes;
|
|
53
58
|
const sizeIdx = attrs.findIndex(
|
|
54
|
-
(attr) =>
|
|
59
|
+
(/** @type {any} */ attr) =>
|
|
55
60
|
attr.type === 'JSXAttribute' &&
|
|
56
61
|
attr.name &&
|
|
57
62
|
attr.name.name === 'size',
|
|
@@ -63,7 +68,7 @@ export default function transformer(file, api) {
|
|
|
63
68
|
});
|
|
64
69
|
|
|
65
70
|
// 2. Remove size type imports (XDSStatusDotSize, XDSProgressBarSize)
|
|
66
|
-
root.find(j.ImportDeclaration).forEach((path) => {
|
|
71
|
+
root.find(j.ImportDeclaration).forEach((/** @type {any} */ path) => {
|
|
67
72
|
const specifiers = path.node.specifiers;
|
|
68
73
|
if (!specifiers) return;
|
|
69
74
|
|