@kaizen/components 0.0.0-canary-guidance-block-codemod-test-20250317042741 → 0.0.0-canary-gb-codemod-test-2-20250318002322

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/bin/codemod.sh CHANGED
@@ -35,6 +35,7 @@ if npx tsx@latest $CODEMOD_PATH $TARGET_DIR; then
35
35
  echo "Run linting and prettier to correct issues with re-writes"
36
36
  else
37
37
  echo "Codemod '$codemodFileName' could not be run in '$TARGET_DIR'"
38
+ echo "Check if '$CODEMOD_PATH' exists and is in the current version of the @kaizen/components"
38
39
  exit 1
39
40
  fi
40
41
 
@@ -109,6 +109,12 @@ Released in `1.73.1`
109
109
 
110
110
  Migrates V1 `Button` and `IconButton` component to next `Button` or `LinkButton`.
111
111
 
112
+ ### `migrateGuidanceBlockActionsToActionsSlot`
113
+
114
+ Migrates GuidanceBlock `actions` props into `actionsSlot` with `Button` or `LinkButton` component.
115
+
116
+ Released in `1.74.0`
117
+
112
118
  #### Props
113
119
 
114
120
  - `label` becomes `children`
@@ -1,10 +1,10 @@
1
1
  import { transformComponentsInDir } from '../utils'
2
- import { migrateGuidanceBlockToButtonNext } from './migrateGuidanceBlockToButtonNext'
2
+ import { migrateGuidanceBlockActionsToActionsSlot } from './migrateGuidanceBlockActionsToActionsSlot'
3
3
 
4
4
  const run = (): void => {
5
5
  console.log('It is recommended that the `upgradeIconV1` codemod be run prior to this')
6
6
  console.log('---')
7
- console.log('~(-_- ~) Running V1 Buttons upgrade (~ -_-)~')
7
+ console.log('~(-_- ~) Running migrateGuidanceBlockActionsToActionsSlot upgrade (~ -_-)~')
8
8
 
9
9
  const targetDir = process.argv[2]
10
10
  if (!targetDir) {
@@ -12,7 +12,7 @@ const run = (): void => {
12
12
  }
13
13
 
14
14
  transformComponentsInDir(targetDir, ['GuidanceBlock'], (tagNames) => [
15
- migrateGuidanceBlockToButtonNext(tagNames),
15
+ migrateGuidanceBlockActionsToActionsSlot(tagNames),
16
16
  ])
17
17
  }
18
18
 
@@ -5,13 +5,13 @@ import {
5
5
  transformSource,
6
6
  type TransformSourceArgs,
7
7
  } from '../utils'
8
- import { migrateGuidanceBlockToButtonNext } from './migrateGuidanceBlockToButtonNext'
8
+ import { migrateGuidanceBlockActionsToActionsSlot } from './migrateGuidanceBlockActionsToActionsSlot'
9
9
 
10
10
  const transformGuidanceBlock = (sourceFile: TransformSourceArgs['sourceFile']): string => {
11
11
  const kaioTagNamesMap = getKaioTagNamesMapByComponentName(sourceFile, ['GuidanceBlock'])
12
12
  return transformSource({
13
13
  sourceFile,
14
- transformers: [migrateGuidanceBlockToButtonNext(kaioTagNamesMap!)],
14
+ transformers: [migrateGuidanceBlockActionsToActionsSlot(kaioTagNamesMap!)],
15
15
  })
16
16
  }
17
17
 
@@ -6,12 +6,12 @@ import {
6
6
  type TagImportAttributesMap,
7
7
  type UpdateKaioImportsArgs,
8
8
  } from '../utils'
9
- import { transformActionsToButtonNext } from './transformActionsToActionsSlot'
9
+ import { transformActionsToActionsSlot } from './transformActionsToActionsSlot'
10
10
 
11
11
  const BUTTON_IMPORT_DESTINATION = '@kaizen/components/next'
12
12
  const LINKBUTTON_IMPORT_DESTINATION = '@kaizen/components'
13
13
 
14
- export const migrateGuidanceBlockToButtonNext =
14
+ export const migrateGuidanceBlockActionsToActionsSlot =
15
15
  (tagsMap: TagImportAttributesMap): ts.TransformerFactory<ts.SourceFile> =>
16
16
  (context) =>
17
17
  (rootNode) => {
@@ -51,7 +51,7 @@ export const migrateGuidanceBlockToButtonNext =
51
51
  const propValue = prop.initializer as ts.JsxExpression
52
52
 
53
53
  if (propName === 'actions') {
54
- const transformedActions = transformActionsToButtonNext(
54
+ const transformedActions = transformActionsToActionsSlot(
55
55
  propValue.getChildren()[1] as ts.ObjectLiteralExpression,
56
56
  )
57
57
 
@@ -1,7 +1,7 @@
1
1
  import ts from 'typescript'
2
2
  import { parseJsx } from '../__tests__/utils'
3
3
  import { printAst } from '../utils'
4
- import { transformActionsToButtonNext } from './transformActionsToActionsSlot'
4
+ import { transformActionsToActionsSlot } from './transformActionsToActionsSlot'
5
5
 
6
6
  export const mockedTransformer =
7
7
  (kaioComponentName: string) =>
@@ -17,7 +17,7 @@ export const mockedTransformer =
17
17
  const propValue = prop.initializer as ts.JsxExpression
18
18
 
19
19
  if (propName === 'actions') {
20
- const transformedActions = transformActionsToButtonNext(
20
+ const transformedActions = transformActionsToActionsSlot(
21
21
  propValue.getChildren()[1] as ts.ObjectLiteralExpression,
22
22
  )
23
23
 
@@ -51,7 +51,7 @@ const transformInput = (
51
51
  return printAst(transformedSource)
52
52
  }
53
53
 
54
- describe('transformActionsToButtonNext()', () => {
54
+ describe('transformActionsToActionsSlot()', () => {
55
55
  it('transforms button-like and link-like actions prop into a Button and LinkButton', () => {
56
56
  const inputAst = parseJsx(`
57
57
  <GuidanceBlock
@@ -11,7 +11,7 @@ type GuidanceBlockTransformedActions = {
11
11
  * expects that the node passed in will be an ObjectLiteralExpression, ie:
12
12
  * `{primary: {...buttonV1Props}, secondary: {...buttonV1Props}}`
13
13
  */
14
- export const transformActionsToButtonNext = (
14
+ export const transformActionsToActionsSlot = (
15
15
  node: ts.ObjectLiteralExpression,
16
16
  ): GuidanceBlockTransformedActions | undefined => {
17
17
  if (ts.isObjectLiteralExpression(node)) {
@@ -114,16 +114,55 @@ describe('transformV1ButtonPropsToButtonOrLinkButton()', () => {
114
114
  onClick: () => console.log("hello world")
115
115
  size: 'small',
116
116
  classNameOverride: styles.buttonClass,
117
- badge: { text: 'New' }
117
+ badge: { text: 'New' },
118
118
  'data-random-attribute': 'some-id',
119
+ "aria-label": "some label",
119
120
  form: 'form-id',
120
121
  }}/>`)
121
122
 
122
123
  const outputAst = parseJsx(
123
- `<DummyComponent primaryAction={<Button onPress={() => console.log("hello world")} size="medium" className={styles.buttonClass} badge={{ text: 'New' }} data-random-attribute='some-id' form='form-id' variant="secondary">Learn more</Button>}}
124
+ `<DummyComponent primaryAction={<Button onPress={() => console.log("hello world")} size="medium" className={styles.buttonClass} badge={{ text: 'New' }} data-random-attribute='some-id' aria-label="some label" form='form-id' variant="secondary">Learn more</Button>}}
124
125
  />`,
125
126
  )
126
127
 
127
128
  expect(transformInput(inputAst)).toBe(printAst(outputAst))
128
129
  })
130
+
131
+ it('transforms shorthand properties as expressions', () => {
132
+ const inputAst = parseJsx(`<DummyComponent primaryAction={{
133
+ label,
134
+ onClick: () => console.log("hello world")
135
+ size: 'small',
136
+ classNameOverride: styles.buttonClass,
137
+ badge: { text: 'New' },
138
+ 'data-random-attribute': 'some-id',
139
+ "aria-label": "some label",
140
+ form: 'form-id',
141
+ }}/>`)
142
+
143
+ const outputAst = parseJsx(
144
+ `<DummyComponent primaryAction={<Button onPress={() => console.log("hello world")} size="medium" className={styles.buttonClass} badge={{ text: 'New' }} data-random-attribute='some-id' aria-label="some label" form='form-id' variant="secondary">{label}</Button>}}
145
+ />`,
146
+ )
147
+
148
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
149
+ })
150
+ it('transforms expressions correctly as children', () => {
151
+ const inputAst = parseJsx(`
152
+ <DummyComponent primaryAction={{
153
+ label: intl.formatMessage({ id: "label.id", defaultMessage: "Label", { variableVal }),
154
+ onClick: () => console.log("hello world")
155
+ size: 'small',
156
+ classNameOverride: styles.buttonClass,
157
+ badge: { text: 'New' },
158
+ 'data-random-attribute': 'some-id',
159
+ form: 'form-id',
160
+ }}/>`)
161
+
162
+ const outputAst = parseJsx(
163
+ `<DummyComponent primaryAction={<Button onPress={() => console.log("hello world")} size="medium" className={styles.buttonClass} badge={{ text: 'New' }} data-random-attribute='some-id' form='form-id' variant="secondary">{intl.formatMessage({ id: "label.id", defaultMessage: "Label", { variableVal })}</Button>}}
164
+ />`,
165
+ )
166
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
167
+ })
129
168
  })
@@ -108,6 +108,17 @@ export const transformV1ButtonPropsToButtonOrLinkButton = (
108
108
 
109
109
  if (propName) {
110
110
  if (propName === 'label') {
111
+ if (ts.isShorthandPropertyAssignment(currentProp)) {
112
+ childrenValue = ts.factory.createJsxExpression(
113
+ undefined,
114
+ ts.factory.createIdentifier(propName),
115
+ )
116
+ return acc
117
+ }
118
+ if (propValue && propValue?.kind !== ts.SyntaxKind.StringLiteral) {
119
+ childrenValue = ts.factory.createJsxExpression(undefined, propValue)
120
+ return acc
121
+ }
111
122
  childrenValue = propValue as ts.JsxAttributeValue
112
123
  return acc
113
124
  }
@@ -149,7 +160,7 @@ export const transformV1ButtonPropsToButtonOrLinkButton = (
149
160
  if (newProp === null) return acc
150
161
 
151
162
  if (newProp === undefined) {
152
- const sanitizedPropName = propName.replace(/'/g, '')
163
+ const sanitizedPropName = propName.replace(/'|"/g, '')
153
164
  const sanitizedPropValue: ts.JsxAttributeValue =
154
165
  propValue?.kind === ts.SyntaxKind.StringLiteral
155
166
  ? (propValue as ts.StringLiteral)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaizen/components",
3
- "version": "0.0.0-canary-guidance-block-codemod-test-20250317042741",
3
+ "version": "0.0.0-canary-gb-codemod-test-2-20250318002322",
4
4
  "description": "Kaizen component library",
5
5
  "author": "Geoffrey Chong <geoff.chong@cultureamp.com>",
6
6
  "homepage": "https://cultureamp.design",
@@ -185,8 +185,8 @@
185
185
  "svgo": "^3.3.2",
186
186
  "tslib": "^2.8.1",
187
187
  "tsx": "^4.19.2",
188
- "@kaizen/design-tokens": "10.8.7",
189
- "@kaizen/package-bundler": "2.0.4"
188
+ "@kaizen/package-bundler": "2.0.4",
189
+ "@kaizen/design-tokens": "10.8.7"
190
190
  },
191
191
  "devDependenciesComments": {
192
192
  "sass": "Prevent deprecation warnings introduced in 1.80 as we plan to move away from sass",