@astryxdesign/cli 0.6.3 → 0.6.4-canary.06c8fa3
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 +194 -0
- package/README.md +121 -85
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +36 -13
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +166 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +104 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/index.d.mts +2 -3
- package/api/index.mjs +5 -4
- package/api/init/init.doc.mjs +6 -1
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +8 -1
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +105 -0
- package/api/integration/pack-check.mjs +111 -10
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -1
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +142 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1008 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +46 -9
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.rollback.test.mjs +148 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +20 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +359 -60
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +353 -104
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +11 -3
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +31 -8
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -0
- package/authoring/doctypes/command/command.doc.mjs +5 -4
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +6 -5
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +48 -6
- package/authoring/doctypes/reference/type.ts +70 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +19 -8
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/command-result-coverage.test.mjs +7 -7
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +16 -50
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -3
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +24 -7
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/debug-result-summary.test.mjs +2 -2
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +222 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +32 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/integration.mjs +1 -0
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +702 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -34
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +90 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- package/clients/cli/lib/json-shim.test.mjs +69 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +39 -10
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +775 -84
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1630 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +291 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +127 -0
- package/foundation/doc-compiler/read.mjs +325 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +606 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +46 -38
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/browser.d.mts +3 -3
- package/foundation/xle/browser.mjs +3 -3
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +6 -5
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/parse.mjs +1 -1
- package/foundation/xle/print.mjs +2 -2
- package/foundation/xle/splice.mjs +1 -1
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -11
- package/api/layout/_adapter.d.mts +0 -34
- package/api/layout/_adapter.mjs +0 -133
- package/api/layout/check/check.d.mts +0 -16
- package/api/layout/check/check.mjs +0 -40
- package/api/layout/expand/expand.d.mts +0 -22
- package/api/layout/expand/expand.mjs +0 -153
- package/api/layout/grammar/grammar.d.mts +0 -13
- package/api/layout/grammar/grammar.mjs +0 -86
- package/api/layout/layout.d.mts +0 -6
- package/api/layout/layout.mjs +0 -17
- package/api/layout/layout.test.mjs +0 -297
- package/api/layout/layout.type.d.mts +0 -89
- package/api/layout/layout.type.mjs +0 -103
- package/api/layout/layoutCheck.doc.d.mts +0 -11
- package/api/layout/layoutCheck.doc.mjs +0 -84
- package/api/layout/layoutExpand.doc.d.mts +0 -11
- package/api/layout/layoutExpand.doc.mjs +0 -106
- package/api/layout/layoutGrammar.doc.d.mts +0 -11
- package/api/layout/layoutGrammar.doc.mjs +0 -56
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/layout-check.doc.mjs +0 -54
- package/clients/cli/commands/layout-expand.doc.mjs +0 -66
- package/clients/cli/commands/layout-grammar.doc.mjs +0 -30
- package/clients/cli/commands/layout.doc.mjs +0 -34
- package/clients/cli/commands/layout.error-codes.test.mjs +0 -66
- package/clients/cli/commands/layout.exit-parity.test.mjs +0 -41
- package/clients/cli/commands/layout.mjs +0 -263
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
|
@@ -4,86 +4,81 @@
|
|
|
4
4
|
* @file Codemod: Rename status variants positive/negative → success/error
|
|
5
5
|
* @see https://github.com/facebookexperimental/xds/issues/996
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Affected components:
|
|
13
|
-
* - XDSStatusDot: variant="positive|negative|info" → variant="success|error|accent"
|
|
14
|
-
* - XDSAvatarStatusDot: variant="positive|negative" → variant="success|error"
|
|
15
|
-
* - XDSIcon: color="positive|negative" → color="success|error"
|
|
16
|
-
* - XDSProgressBar: variant="positive|negative" → variant="success|error"
|
|
17
|
-
*
|
|
18
|
-
* Transforms JSX attributes, object properties (in files importing affected
|
|
19
|
-
* components), TypeScript type annotations, and Storybook argType options.
|
|
7
|
+
* This transform is deliberately limited to static literals written directly
|
|
8
|
+
* in affected props on imported JSX components. It does not infer through
|
|
9
|
+
* variables, helpers, objects, types, or wrappers: missing an indirect
|
|
10
|
+
* migration is safer than rewriting an unrelated domain using the same words.
|
|
20
11
|
*/
|
|
21
12
|
|
|
13
|
+
import {transformProp} from '../../transform-prop.mjs';
|
|
14
|
+
|
|
22
15
|
export const meta = {
|
|
23
16
|
title: 'Rename status variants positive/negative → success/error',
|
|
24
17
|
description:
|
|
25
|
-
'Renames
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'components (where the component is known); in context-blind locations (object ' +
|
|
29
|
-
'properties, type unions) `info` is left untouched because it is a valid variant on ' +
|
|
30
|
-
'other components such as Badge.',
|
|
18
|
+
'Renames static status values written directly on imported StatusDot, ' +
|
|
19
|
+
'AvatarStatusDot, Icon, SVGIcon, ProgressBar, and Badge JSX elements. ' +
|
|
20
|
+
'Indirect values are left unchanged for manual migration.',
|
|
31
21
|
pr: '#996',
|
|
32
22
|
};
|
|
33
23
|
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
const CORE_IMPORT_RE = /^@(astryxdesign|xds)\/core(?:\/|$)/;
|
|
25
|
+
|
|
26
|
+
const COMPONENT_PROPS = new Map([
|
|
27
|
+
['StatusDot', new Set(['variant'])],
|
|
28
|
+
['AvatarStatusDot', new Set(['variant'])],
|
|
29
|
+
['Icon', new Set(['color'])],
|
|
30
|
+
['SVGIcon', new Set(['color'])],
|
|
31
|
+
['ProgressBar', new Set(['variant'])],
|
|
32
|
+
['Badge', new Set(['variant'])],
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
const STATUS_RENAMES = new Map([
|
|
36
36
|
['positive', 'success'],
|
|
37
37
|
['negative', 'error'],
|
|
38
38
|
['info', 'accent'],
|
|
39
39
|
]);
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
* `info` is a VALID variant on non-target components (notably XDSBadge, whose
|
|
45
|
-
* BadgeVariantMap still has `info`). `positive`/`negative` are not retained by
|
|
46
|
-
* any component post-migration, so renaming them is always safe. Therefore the
|
|
47
|
-
* context-blind heuristic paths (object properties, type unions, and suffixed
|
|
48
|
-
* props on wrapper components) must NOT rewrite `info` — only the precise path,
|
|
49
|
-
* a direct JSX attribute on a known target component, may. Otherwise a
|
|
50
|
-
* `variant: 'info'` on an unrelated Badge config in a file that merely also
|
|
51
|
-
* imports e.g. XDSIcon gets wrongly rewritten to the invalid `accent`.
|
|
52
|
-
*/
|
|
53
|
-
const AMBIGUOUS_VALUES = new Set(['info']);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Components and which props are affected.
|
|
58
|
-
* Key: component name. Value: set of prop names to check.
|
|
59
|
-
*/
|
|
60
|
-
const COMPONENT_PROPS = new Map([
|
|
61
|
-
['XDSStatusDot', new Set(['variant'])],
|
|
62
|
-
['XDSAvatarStatusDot', new Set(['variant'])],
|
|
63
|
-
['XDSIcon', new Set(['color'])],
|
|
64
|
-
['XDSProgressBar', new Set(['variant'])],
|
|
41
|
+
const BADGE_RENAMES = new Map([
|
|
42
|
+
['positive', 'success'],
|
|
43
|
+
['negative', 'error'],
|
|
65
44
|
]);
|
|
66
45
|
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
/** All affected prop names (variant, color). */
|
|
71
|
-
const TARGET_PROP_NAMES = new Set();
|
|
72
|
-
for (const props of COMPONENT_PROPS.values()) {
|
|
73
|
-
for (const p of props) TARGET_PROP_NAMES.add(p);
|
|
46
|
+
/** @param {string} name */
|
|
47
|
+
function canonicalComponentName(name) {
|
|
48
|
+
return name.startsWith('XDS') ? name.slice(3) : name;
|
|
74
49
|
}
|
|
75
50
|
|
|
76
51
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
52
|
+
* @param {any} node
|
|
53
|
+
* @param {ReadonlyMap<string, string>} renames
|
|
54
|
+
* @returns {boolean}
|
|
79
55
|
*/
|
|
80
|
-
function
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
56
|
+
function renameStaticValue(node, renames) {
|
|
57
|
+
if (!node) return false;
|
|
58
|
+
if (
|
|
59
|
+
node.type === 'TSAsExpression' ||
|
|
60
|
+
node.type === 'TSSatisfiesExpression' ||
|
|
61
|
+
node.type === 'TypeCastExpression' ||
|
|
62
|
+
node.type === 'ParenthesizedExpression'
|
|
63
|
+
) {
|
|
64
|
+
return renameStaticValue(node.expression, renames);
|
|
85
65
|
}
|
|
86
|
-
|
|
66
|
+
if (node.type === 'ConditionalExpression') {
|
|
67
|
+
const consequentChanged = renameStaticValue(node.consequent, renames);
|
|
68
|
+
const alternateChanged = renameStaticValue(node.alternate, renames);
|
|
69
|
+
return consequentChanged || alternateChanged;
|
|
70
|
+
}
|
|
71
|
+
if (
|
|
72
|
+
(node.type !== 'StringLiteral' && node.type !== 'Literal') ||
|
|
73
|
+
typeof node.value !== 'string'
|
|
74
|
+
) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const replacement = renames.get(node.value);
|
|
78
|
+
if (!replacement) return false;
|
|
79
|
+
node.value = replacement;
|
|
80
|
+
if (node.raw) node.raw = undefined;
|
|
81
|
+
return true;
|
|
87
82
|
}
|
|
88
83
|
|
|
89
84
|
/**
|
|
@@ -96,158 +91,25 @@ export default function transformer(file, api) {
|
|
|
96
91
|
const root = j(file.source);
|
|
97
92
|
let hasChanges = false;
|
|
98
93
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
// Ambiguous values (e.g. `info`) are only renamed in a precise context
|
|
118
|
-
// where the target component is known (a direct JSX attribute on a target).
|
|
119
|
-
// In context-blind paths they may belong to a component that legitimately
|
|
120
|
-
// keeps the value (e.g. Badge's `info`), so leave them untouched.
|
|
121
|
-
if (!precise && AMBIGUOUS_VALUES.has(target.value)) return false;
|
|
122
|
-
|
|
123
|
-
target.value = replacement;
|
|
124
|
-
if (target.raw) target.raw = undefined;
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Rename elements in an array (handles TSAsExpression wrapping).
|
|
130
|
-
*/
|
|
131
|
-
function renameArrayElements(/** @type {any} */ node, {precise = false} = {}) {
|
|
132
|
-
let arrayNode = node;
|
|
133
|
-
if (arrayNode.type === 'TSAsExpression') arrayNode = arrayNode.expression;
|
|
134
|
-
if (arrayNode.type !== 'ArrayExpression') return;
|
|
135
|
-
arrayNode.elements.forEach((/** @type {any} */ el) => {
|
|
136
|
-
if (renameValue(el, {precise})) hasChanges = true;
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Determine early: does this file import any target component?
|
|
141
|
-
const importsTarget = [...TARGET_COMPONENTS].some(
|
|
142
|
-
(name) =>
|
|
143
|
-
root.find(j.ImportSpecifier, {imported: {name}}).length > 0,
|
|
94
|
+
transformProp(
|
|
95
|
+
root,
|
|
96
|
+
j,
|
|
97
|
+
{
|
|
98
|
+
matchesImport: source => CORE_IMPORT_RE.test(source),
|
|
99
|
+
components: COMPONENT_PROPS,
|
|
100
|
+
normalizeComponentName: canonicalComponentName,
|
|
101
|
+
},
|
|
102
|
+
(propPath, {component}) => {
|
|
103
|
+
const prop = propPath.node;
|
|
104
|
+
const value =
|
|
105
|
+
prop.value?.type === 'JSXExpressionContainer'
|
|
106
|
+
? prop.value.expression
|
|
107
|
+
: prop.value;
|
|
108
|
+
const renames = component === 'Badge' ? BADGE_RENAMES : STATUS_RENAMES;
|
|
109
|
+
if (renameStaticValue(value, renames)) hasChanges = true;
|
|
110
|
+
},
|
|
144
111
|
);
|
|
145
112
|
|
|
146
|
-
// 1. JSX attributes on target components
|
|
147
|
-
root.find(j.JSXOpeningElement).forEach((/** @type {any} */ path) => {
|
|
148
|
-
const name = path.node.name;
|
|
149
|
-
const componentName = name.type === 'JSXIdentifier' ? name.name : null;
|
|
150
|
-
if (!componentName) return;
|
|
151
|
-
|
|
152
|
-
const isDirectTarget = TARGET_COMPONENTS.has(componentName);
|
|
153
|
-
// For non-target components, only check suffixed props if file imports targets
|
|
154
|
-
if (!isDirectTarget && !importsTarget) return;
|
|
155
|
-
|
|
156
|
-
path.node.attributes.forEach((/** @type {any} */ attr) => {
|
|
157
|
-
if (attr.type !== 'JSXAttribute') return;
|
|
158
|
-
const attrName = attr.name.name;
|
|
159
|
-
|
|
160
|
-
if (isDirectTarget) {
|
|
161
|
-
// Direct targets: only their specific props
|
|
162
|
-
const targetProps = COMPONENT_PROPS.get(componentName);
|
|
163
|
-
if (!targetProps || !targetProps.has(attrName)) return;
|
|
164
|
-
} else {
|
|
165
|
-
// Non-target components: suffixed prop names only
|
|
166
|
-
// (e.g. dotVariant on ChangelogSection wrapping XDSStatusDot)
|
|
167
|
-
if (!matchesPropName(attrName) || TARGET_PROP_NAMES.has(attrName)) return;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Only a direct JSX attribute on a target component is a precise context
|
|
171
|
-
// where the component (and thus the validity of `info`) is known. The
|
|
172
|
-
// wrapper/suffixed-prop case is a heuristic and must not touch ambiguous
|
|
173
|
-
// values.
|
|
174
|
-
const precise = isDirectTarget;
|
|
175
|
-
const value = attr.value;
|
|
176
|
-
|
|
177
|
-
// variant="positive" (string literal)
|
|
178
|
-
if (renameValue(value, {precise})) {
|
|
179
|
-
hasChanges = true;
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// variant={'positive'} (expression container)
|
|
184
|
-
if (
|
|
185
|
-
value &&
|
|
186
|
-
value.type === 'JSXExpressionContainer' &&
|
|
187
|
-
value.expression
|
|
188
|
-
) {
|
|
189
|
-
if (renameValue(value.expression, {precise})) {
|
|
190
|
-
hasChanges = true;
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// variant={condition ? 'positive' : 'negative'} (ternary)
|
|
195
|
-
if (value.expression.type === 'ConditionalExpression') {
|
|
196
|
-
if (renameValue(value.expression.consequent, {precise}))
|
|
197
|
-
hasChanges = true;
|
|
198
|
-
if (renameValue(value.expression.alternate, {precise}))
|
|
199
|
-
hasChanges = true;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
// 2. Object properties in files importing target components.
|
|
206
|
-
// Handles args objects, config objects, Storybook argTypes, etc.
|
|
207
|
-
if (importsTarget) {
|
|
208
|
-
const PropertyType = j.ObjectProperty ?? j.Property;
|
|
209
|
-
root.find(PropertyType).forEach((/** @type {any} */ path) => {
|
|
210
|
-
const key = path.node.key;
|
|
211
|
-
const keyName =
|
|
212
|
-
key.type === 'Identifier'
|
|
213
|
-
? key.name
|
|
214
|
-
: key.type === 'StringLiteral' || key.type === 'Literal'
|
|
215
|
-
? key.value
|
|
216
|
-
: null;
|
|
217
|
-
|
|
218
|
-
if (!keyName || !matchesPropName(keyName)) return;
|
|
219
|
-
|
|
220
|
-
const value = path.node.value;
|
|
221
|
-
|
|
222
|
-
// variant: 'positive' → variant: 'success'
|
|
223
|
-
if (renameValue(value)) {
|
|
224
|
-
hasChanges = true;
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// variant: { options: ['positive', 'negative', ...] }
|
|
229
|
-
if (value.type === 'ObjectExpression') {
|
|
230
|
-
const optionsProp = value.properties.find(
|
|
231
|
-
(/** @type {any} */ p) => p.key && (p.key.name === 'options' || p.key.value === 'options'),
|
|
232
|
-
);
|
|
233
|
-
if (optionsProp) {
|
|
234
|
-
renameArrayElements(optionsProp.value);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// variant: ['positive', 'negative'] or [...] as Type[]
|
|
239
|
-
renameArrayElements(value);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// 3. TypeScript type references: 'positive' | 'negative' in union types
|
|
244
|
-
if (importsTarget) {
|
|
245
|
-
root.find(j.TSLiteralType).forEach((/** @type {any} */ path) => {
|
|
246
|
-
const lit = path.node.literal;
|
|
247
|
-
if (renameValue(lit)) hasChanges = true;
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
113
|
if (!hasChanges) return undefined;
|
|
252
114
|
return root.toSource({quote: 'single'});
|
|
253
115
|
}
|
|
@@ -1,161 +1,129 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
-
import {describe,
|
|
3
|
+
import {describe, expect, it} from 'vitest';
|
|
4
|
+
import transform from '../rename-avatar-size-scale.mjs';
|
|
4
5
|
|
|
5
6
|
async function applyTransform(source) {
|
|
6
|
-
const {default: transform} = await import('../rename-avatar-size-scale.mjs');
|
|
7
7
|
const jscodeshift = (await import('jscodeshift')).default;
|
|
8
8
|
const j = jscodeshift.withParser('tsx');
|
|
9
9
|
const api = {jscodeshift: j, stats: () => {}, report: () => {}};
|
|
10
|
-
|
|
11
|
-
const result = transform(file, api);
|
|
12
|
-
return result ?? source;
|
|
10
|
+
return transform({source, path: 'test.tsx'}, api) ?? source;
|
|
13
11
|
}
|
|
14
12
|
|
|
15
13
|
describe('rename-avatar-size-scale', () => {
|
|
16
|
-
it('renames every
|
|
17
|
-
const
|
|
14
|
+
it('renames every direct Avatar size literal', async () => {
|
|
15
|
+
const output =
|
|
16
|
+
await applyTransform(`import {Avatar} from '@astryxdesign/core';
|
|
18
17
|
const a = <Avatar name="A" size="tiny" />;
|
|
19
18
|
const b = <Avatar name="B" size="xsmall" />;
|
|
20
19
|
const c = <Avatar name="C" size="small" />;
|
|
21
20
|
const d = <Avatar name="D" size="medium" />;
|
|
22
|
-
const e = <Avatar name="E" size="large"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(output).toContain(`size='md'`);
|
|
27
|
-
expect(output).toContain(`size='lg'`);
|
|
28
|
-
expect(output).toContain(`size='xl'`);
|
|
29
|
-
for (const old of ['tiny', 'xsmall', 'small', 'medium', 'large']) {
|
|
30
|
-
expect(output).not.toContain(`size="${old}"`);
|
|
21
|
+
const e = <Avatar name="E" size="large" />;`);
|
|
22
|
+
|
|
23
|
+
for (const size of ['xsm', 'sm', 'md', 'lg', 'xl']) {
|
|
24
|
+
expect(output).toContain(`size='${size}'`);
|
|
31
25
|
}
|
|
32
26
|
});
|
|
33
27
|
|
|
34
|
-
it('renames
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
expect(output).toContain(`size='lg'`);
|
|
39
|
-
});
|
|
28
|
+
it('renames literals inside satisfies expressions while preserving the type', async () => {
|
|
29
|
+
const output =
|
|
30
|
+
await applyTransform(`import {Avatar} from '@astryxdesign/core';
|
|
31
|
+
const view = <Avatar size={'small' satisfies AvatarSize} />;`);
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
const input = `import {Avatar} from '@astryxdesign/core';
|
|
43
|
-
const x = <Avatar name="A" size={48} />;`;
|
|
44
|
-
const output = await applyTransform(input);
|
|
45
|
-
expect(output).toContain('size={48}');
|
|
33
|
+
expect(output).toContain("{'md' satisfies AvatarSize}");
|
|
46
34
|
});
|
|
47
35
|
|
|
48
|
-
it('
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
expect(output).toContain(`size='md'`);
|
|
53
|
-
});
|
|
36
|
+
it('renames AvatarGroup and conditional literals', async () => {
|
|
37
|
+
const output =
|
|
38
|
+
await applyTransform(`import {AvatarGroup} from '@astryxdesign/core';
|
|
39
|
+
const view = <AvatarGroup size={large ? 'large' : 'small'}>{kids}</AvatarGroup>;`);
|
|
54
40
|
|
|
55
|
-
|
|
56
|
-
const sub = `import {Avatar} from '@astryxdesign/core/Avatar';
|
|
57
|
-
const x = <Avatar name="A" size="large" />;`;
|
|
58
|
-
expect(await applyTransform(sub)).toContain(`size='xl'`);
|
|
59
|
-
const legacy = `import {Avatar} from '@xds/core';
|
|
60
|
-
const x = <Avatar name="A" size="tiny" />;`;
|
|
61
|
-
expect(await applyTransform(legacy)).toContain(`size='xsm'`);
|
|
41
|
+
expect(output).toContain("large ? 'xl' : 'md'");
|
|
62
42
|
});
|
|
63
43
|
|
|
64
|
-
it('
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
});
|
|
44
|
+
it('maps import aliases and default subpath imports', async () => {
|
|
45
|
+
const output =
|
|
46
|
+
await applyTransform(`import {Avatar as Face} from '@xds/core';
|
|
47
|
+
import Faces from '@astryxdesign/core/AvatarGroup';
|
|
48
|
+
const view = <><Face size="medium" /><Faces size="large" /></>;`);
|
|
70
49
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const meta = {
|
|
74
|
-
argTypes: {size: {control: 'select', options: ['tiny', 'xsmall']}},
|
|
75
|
-
args: {size: 'tiny'},
|
|
76
|
-
};`;
|
|
77
|
-
const output = await applyTransform(input);
|
|
78
|
-
expect(output).toContain(`['xsm', 'sm']`);
|
|
79
|
-
expect(output).toContain(`size: 'xsm'`);
|
|
50
|
+
expect(output).toContain("<Face size='lg'");
|
|
51
|
+
expect(output).toContain("<Faces size='xl'");
|
|
80
52
|
});
|
|
81
53
|
|
|
82
|
-
it('
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const meta = {
|
|
87
|
-
argTypes: {size: {control: 'select', options: ['tiny', 'xsmall', 'small', 'medium', 'large']}},
|
|
88
|
-
};`;
|
|
89
|
-
const output = await applyTransform(input);
|
|
90
|
-
expect(output).toContain(`['xsm', 'sm', 'md', 'lg', 'xl']`);
|
|
91
|
-
});
|
|
54
|
+
it('ignores declaration-level type imports paired with a local Avatar', async () => {
|
|
55
|
+
const input = `import type {Avatar} from '@astryxdesign/core';
|
|
56
|
+
const Avatar = props => <div {...props} />;
|
|
57
|
+
const view = <Avatar size="small" />;`;
|
|
92
58
|
|
|
93
|
-
|
|
94
|
-
const input = `import {AvatarGroup} from '@astryxdesign/core';
|
|
95
|
-
const sizes = (['tiny', 'xsmall', 'small', 'medium', 'large'] as const).map(s => s);`;
|
|
96
|
-
const output = await applyTransform(input);
|
|
97
|
-
expect(output).toContain(`['xsm', 'sm', 'md', 'lg', 'xl']`);
|
|
59
|
+
expect(await applyTransform(input)).toBe(input);
|
|
98
60
|
});
|
|
99
61
|
|
|
100
|
-
it('
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
const output = await applyTransform(input);
|
|
106
|
-
expect(output).toContain(`['small', 'medium', 'large']`);
|
|
107
|
-
});
|
|
62
|
+
it('ignores mixed type specifiers while migrating runtime imports', async () => {
|
|
63
|
+
const output =
|
|
64
|
+
await applyTransform(`import {type Avatar, AvatarGroup} from '@astryxdesign/core';
|
|
65
|
+
const Avatar = props => <div {...props} />;
|
|
66
|
+
const view = <><Avatar size="small" /><AvatarGroup size="large" /></>;`);
|
|
108
67
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
type Props = {size: 'tiny' | 'xsmall'};`;
|
|
112
|
-
const output = await applyTransform(input);
|
|
113
|
-
expect(output).toContain(`'xsm' | 'sm'`);
|
|
68
|
+
expect(output).toContain('<Avatar size="small"');
|
|
69
|
+
expect(output).toContain("<AvatarGroup size='xl'");
|
|
114
70
|
});
|
|
115
71
|
|
|
116
|
-
|
|
117
|
-
|
|
72
|
+
it('maps namespace imports', async () => {
|
|
73
|
+
const output =
|
|
74
|
+
await applyTransform(`import * as Core from '@astryxdesign/core';
|
|
75
|
+
const view = <Core.Avatar size="small" />;`);
|
|
118
76
|
|
|
119
|
-
|
|
120
|
-
const input = `import {Avatar} from '@astryxdesign/core';
|
|
121
|
-
type TaskPriority = 'urgent' | 'high' | 'medium' | 'low' | 'none';`;
|
|
122
|
-
const output = await applyTransform(input);
|
|
123
|
-
expect(output).toContain(`'medium'`);
|
|
124
|
-
expect(output).not.toContain(`'lg'`);
|
|
77
|
+
expect(output).toContain("size='md'");
|
|
125
78
|
});
|
|
126
79
|
|
|
127
|
-
it('
|
|
80
|
+
it('leaves numeric and dynamic sizes untouched', async () => {
|
|
128
81
|
const input = `import {Avatar} from '@astryxdesign/core';
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
expect(
|
|
82
|
+
const named = 'small';
|
|
83
|
+
const a = <Avatar size={48} />;
|
|
84
|
+
const b = <Avatar size={named} />;`;
|
|
85
|
+
expect(await applyTransform(input)).toBe(input);
|
|
133
86
|
});
|
|
134
87
|
|
|
135
|
-
it('
|
|
136
|
-
// A `size: 'small'` object entry could belong to any component; renaming it
|
|
137
|
-
// blind would be unsafe, so it is left for manual migration.
|
|
88
|
+
it('leaves objects, types, arrays, and Storybook metadata untouched', async () => {
|
|
138
89
|
const input = `import {Avatar} from '@astryxdesign/core';
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
90
|
+
type Density = 'tiny' | 'xsmall' | 'small' | 'medium' | 'large';
|
|
91
|
+
const card = {size: 'small'};
|
|
92
|
+
const sizes = ['tiny', 'xsmall', 'small', 'medium', 'large'];
|
|
93
|
+
const meta = {argTypes: {size: {options: sizes}}};
|
|
94
|
+
const view = <Avatar size={card.size} />;`;
|
|
95
|
+
|
|
96
|
+
expect(await applyTransform(input)).toBe(input);
|
|
142
97
|
});
|
|
143
98
|
|
|
144
|
-
it('does not touch files
|
|
99
|
+
it('does not touch files without an Avatar import', async () => {
|
|
145
100
|
const input = `import {Badge} from '@astryxdesign/core';
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
const output = await applyTransform(input);
|
|
149
|
-
expect(output).toContain(`size="small"`);
|
|
150
|
-
expect(output).toContain(`'tiny' | 'xsmall'`);
|
|
101
|
+
const view = <Badge size="small" />;`;
|
|
102
|
+
expect(await applyTransform(input)).toBe(input);
|
|
151
103
|
});
|
|
152
104
|
|
|
153
|
-
it('
|
|
154
|
-
const input = `import {Avatar} from '@
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
105
|
+
it('ignores same-named components imported from other packages', async () => {
|
|
106
|
+
const input = `import {Avatar} from '@other/core';
|
|
107
|
+
const view = <Avatar size="small" />;`;
|
|
108
|
+
expect(await applyTransform(input)).toBe(input);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('ignores a local component that shadows an imported alias', async () => {
|
|
112
|
+
const output =
|
|
113
|
+
await applyTransform(`import {Avatar as Face} from '@xds/core';
|
|
114
|
+
const migrated = <Face size="medium" />;
|
|
115
|
+
function Local(Face) { return <Face size="large" />; }`);
|
|
116
|
+
|
|
117
|
+
expect(output).toContain("size='lg'");
|
|
118
|
+
expect(output).toContain('size="large"');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('leaves unrelated props on Avatar untouched', async () => {
|
|
122
|
+
const output =
|
|
123
|
+
await applyTransform(`import {Avatar} from '@astryxdesign/core';
|
|
124
|
+
const view = <Avatar size="small" label="small" />;`);
|
|
125
|
+
|
|
126
|
+
expect(output).toContain("size='md'");
|
|
127
|
+
expect(output).toContain('label="small"');
|
|
160
128
|
});
|
|
161
129
|
});
|