@kaizen/components 0.0.0-canary-button-codemod-canary-20250212054517 → 0.0.0-canary-stacking-context-fix-20250225001220

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.
Files changed (47) hide show
  1. package/bin/codemod.sh +0 -2
  2. package/codemods/README.md +0 -45
  3. package/codemods/utils/createProp.spec.ts +19 -75
  4. package/codemods/utils/createProp.ts +1 -8
  5. package/codemods/utils/getKaioTagName.ts +5 -13
  6. package/codemods/utils/index.ts +0 -1
  7. package/dist/cjs/Filter/FilterBar/subcomponents/FilterBarButton/FilterBarButton.cjs +1 -0
  8. package/dist/cjs/Filter/FilterMultiSelect/subcomponents/Trigger/FilterTriggerButton/FilterTriggerButton.cjs +1 -0
  9. package/dist/cjs/Filter/FilterMultiSelect/subcomponents/Trigger/RemovableFilterTrigger/RemovableFilterTrigger.cjs +1 -0
  10. package/dist/cjs/index.cjs +2 -0
  11. package/dist/esm/Filter/FilterBar/subcomponents/FilterBarButton/FilterBarButton.mjs +1 -0
  12. package/dist/esm/Filter/FilterMultiSelect/subcomponents/Trigger/FilterTriggerButton/FilterTriggerButton.mjs +1 -0
  13. package/dist/esm/Filter/FilterMultiSelect/subcomponents/Trigger/RemovableFilterTrigger/RemovableFilterTrigger.mjs +1 -0
  14. package/dist/esm/index.mjs +1 -0
  15. package/dist/styles.css +8647 -8640
  16. package/dist/types/Filter/FilterBar/subcomponents/FilterBarButton/FilterBarButton.d.ts +1 -1
  17. package/dist/types/Filter/FilterButton/index.d.ts +1 -0
  18. package/dist/types/Filter/FilterMultiSelect/types.d.ts +2 -1
  19. package/dist/types/RichTextEditor/utils/commands/fixtures/helpers.d.ts +0 -1
  20. package/dist/types/RichTextEditor/utils/commands/fixtures/index.d.ts +2 -0
  21. package/dist/types/RichTextEditor/utils/commands/fixtures/mockRangeForBoundingRect.d.ts +1 -0
  22. package/dist/types/__rc__/Icon/constants.d.ts +1 -1
  23. package/package.json +6 -1
  24. package/src/Filter/FilterButton/index.ts +1 -0
  25. package/src/Filter/FilterMultiSelect/types.ts +3 -1
  26. package/src/RichTextEditor/utils/commands/addMark.spec.ts +1 -5
  27. package/src/RichTextEditor/utils/commands/fixtures/helpers.ts +0 -31
  28. package/src/RichTextEditor/utils/commands/fixtures/index.ts +2 -0
  29. package/src/RichTextEditor/utils/commands/fixtures/mockRangeForBoundingRect.ts +32 -0
  30. package/src/TitleBlockZen/TitleBlockZen.module.scss +1 -6
  31. package/src/__rc__/Button/_docs/Button--usage-guidelines.mdx +170 -1
  32. package/src/__rc__/Button/_docs/Button.docs.stories.tsx +264 -9
  33. package/src/__rc__/Button/_docs/assets/button_anatomy.png +0 -0
  34. package/src/__rc__/Button/_docs/assets/button_icon_only_spec.png +0 -0
  35. package/src/__rc__/Button/_docs/assets/button_icon_spec.png +0 -0
  36. package/src/__rc__/Button/_docs/assets/button_spec.png +0 -0
  37. package/src/__rc__/Icon/constants.ts +1 -0
  38. package/src/__rc__/Tabs/subcomponents/Tab/Tab.module.css +5 -2
  39. package/src/__rc__/Tabs/subcomponents/TabList/TabList.module.css +11 -4
  40. package/codemods/upgradeV1Buttons/index.ts +0 -19
  41. package/codemods/upgradeV1Buttons/transformV1ButtonAttributes.spec.ts +0 -202
  42. package/codemods/upgradeV1Buttons/transformV1ButtonAttributes.ts +0 -132
  43. package/codemods/upgradeV1Buttons/upgradeV1Buttons.spec.ts +0 -658
  44. package/codemods/upgradeV1Buttons/upgradeV1Buttons.ts +0 -93
  45. package/codemods/utils/createJsxElementWithChildren.spec.ts +0 -119
  46. package/codemods/utils/createJsxElementWithChildren.ts +0 -55
  47. package/src/__rc__/Button/_docs/Button--migration-guide.mdx +0 -58
package/bin/codemod.sh CHANGED
@@ -31,8 +31,6 @@ echo ""
31
31
 
32
32
  if npx tsx@latest $CODEMOD_PATH $TARGET_DIR; then
33
33
  echo "Codemod '$codemodFileName' completed successfully in directory '$transformDir'"
34
- echo "---"
35
- echo "Run linting and prettier to correct issues with re-writes"
36
34
  else
37
35
  echo "Codemod '$codemodFileName' could not be run in '$TARGET_DIR'"
38
36
  exit 1
@@ -103,51 +103,6 @@ Released in `1.60.0`
103
103
 
104
104
  Removes `Popover` component props `variant` and `customIcon`.
105
105
 
106
- ### `upgradeV1Buttons`
107
-
108
- Released in `TBC`
109
-
110
- Migrates `Button` and `IconButton` component to `Button` V3 or `LinkButton`.
111
-
112
- #### Props
113
-
114
- - `label` becomes `children`
115
- - eg. `<IconButton label="Hello" />` becomes `<Button>Hello</Button>`
116
- - `onClick` becomes `onPress`
117
- - Variants:
118
- - Default (undefined):
119
- - For `Button` becomes `variant="secondary"`
120
- - For `IconButton` becomes `variant="tertiary"`
121
- - `primary` becomes `variant="primary"`
122
- - `secondary` becomes `variant="tertiary"`
123
- - `destructive` will be removed (no longer available as a variant)
124
- - Sizes:
125
- - Default (undefined) becomes `large`
126
- - `small` becomes `medium`
127
- - `regular` becomes `large`
128
- - `reversed` becomes `isReversed`
129
- - `classNameOverride` becomes `className`
130
- - `data-automation-id` becomes `data-testid`
131
- - `disabled` becomes `isDisabled`
132
- - `newTabAndIUnderstandTheAccessibilityImplications` becomes `target="_blank"`
133
- - `rel="noopener noreferrer"` is also added
134
- - `component` will not be removed by the codemod, but will throw a TypeScript error as the prop itself no longer exists
135
- - For `IconButton` only:
136
- - `hasHiddenLabel` will be added
137
-
138
- #### Component transformation
139
-
140
- - `Button`/`IconButton` without the `href` or `component` prop will become `Button` V3
141
- - `Button`/`IconButton` with the `href` prop will become `LinkButton`
142
- - `Button`/`IconButton` with the `component` prop will become `LinkButton`
143
-
144
- #### Imports
145
-
146
- All imports of V1 Buttons will now point to either:
147
-
148
- - `@kaizen/components/v3/actions` for `Button`
149
- - `@kaizen/components` for `LinkButton`
150
-
151
106
  ### `upgradeIconV1`
152
107
 
153
108
  Released in `1.67.0`; last updated in `1.68.1`
@@ -1,88 +1,32 @@
1
1
  import ts from 'typescript'
2
2
  import { parseJsx } from '../__tests__/utils/parseJsx'
3
- import { createProp, createStyleProp } from './createProp'
3
+ import { createStyleProp } from './createProp'
4
4
  import { printAst } from './printAst'
5
5
  import { transformSource, type TransformSourceArgs } from './transformSource'
6
6
  import { updateJsxElementWithNewProps } from './updateJsxElementWithNewProps'
7
7
 
8
- export const mockTransformer: ts.TransformerFactory<ts.SourceFile> = (context) => (rootNode) => {
8
+ export const mockedTransformer: ts.TransformerFactory<ts.SourceFile> = (context) => (rootNode) => {
9
9
  const visit = (node: ts.Node): ts.Node => {
10
10
  if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
11
- const newAttributes = node.attributes.properties.map((attr) => {
12
- if (ts.isJsxAttribute(attr)) {
13
- return createProp(`${attr.name.getText()}New`, attr.initializer)
14
- }
15
- return attr
16
- })
17
- return updateJsxElementWithNewProps(node, newAttributes)
18
- }
19
- return ts.visitEachChild(node, visit, context)
20
- }
21
- return ts.visitNode(rootNode, visit) as ts.SourceFile
22
- }
23
-
24
- const testCreateProp = (sourceFile: TransformSourceArgs['sourceFile']): string =>
25
- transformSource({
26
- sourceFile,
27
- transformers: [mockTransformer],
28
- })
29
-
30
- describe('createProp()', () => {
31
- it('creates a prop with the pre-existing value', () => {
32
- const inputAst = parseJsx('<Pancakes isBoolean={false} />')
33
- const outputAst = parseJsx('<Pancakes isBooleanNew={false} />')
34
- expect(testCreateProp(inputAst)).toEqual(printAst(outputAst))
35
- })
11
+ if (node.tagName.getText() === 'Pancakes') {
12
+ const newAttributes = node.attributes.properties.map((attr) => {
13
+ if (ts.isJsxAttribute(attr)) {
14
+ if (attr.name.getText() === 'replaceWithExistingValue') {
15
+ return createStyleProp({ width: attr.initializer! })
16
+ }
36
17
 
37
- it('creates a prop and transforms true to undefined', () => {
38
- const inputAst = parseJsx(`
39
- export const TestComponent = () => (
40
- <>
41
- <Pancakes isBoolean />
42
- <Pancakes isBoolean={false} />
43
- <Pancakes stringProp="Hello" />
44
- <Pancakes stringVarProp={stringVar} />
45
- <Pancakes numberProp={3} />
46
- <Pancakes objProp={{ key: 'value' }} />
47
- </>
48
- )
49
- `)
50
- const outputAst = parseJsx(`
51
- export const TestComponent = () => (
52
- <>
53
- <Pancakes isBooleanNew />
54
- <Pancakes isBooleanNew={false} />
55
- <Pancakes stringPropNew="Hello" />
56
- <Pancakes stringVarPropNew={stringVar} />
57
- <Pancakes numberPropNew={3} />
58
- <Pancakes objPropNew={{ key: 'value' }} />
59
- </>
60
- )
61
- `)
62
- expect(testCreateProp(inputAst)).toEqual(printAst(outputAst))
63
- })
64
- })
65
-
66
- export const styleTransformer: ts.TransformerFactory<ts.SourceFile> = (context) => (rootNode) => {
67
- const visit = (node: ts.Node): ts.Node => {
68
- if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
69
- const newAttributes = node.attributes.properties.map((attr) => {
70
- if (ts.isJsxAttribute(attr)) {
71
- if (attr.name.getText() === 'replaceWithExistingValue') {
72
- return createStyleProp({ width: attr.initializer! })
73
- }
74
-
75
- if (attr.name.getText() === 'replaceWithStringValue') {
76
- return createStyleProp({ width: '100px' })
77
- }
18
+ if (attr.name.getText() === 'replaceWithStringValue') {
19
+ return createStyleProp({ width: '100px' })
20
+ }
78
21
 
79
- if (attr.name.getText() === 'replaceWithNumberValue') {
80
- return createStyleProp({ width: 100 })
22
+ if (attr.name.getText() === 'replaceWithNumberValue') {
23
+ return createStyleProp({ width: 100 })
24
+ }
81
25
  }
82
- }
83
- return attr
84
- })
85
- return updateJsxElementWithNewProps(node, newAttributes)
26
+ return attr
27
+ })
28
+ return updateJsxElementWithNewProps(node, newAttributes)
29
+ }
86
30
  }
87
31
  return ts.visitEachChild(node, visit, context)
88
32
  }
@@ -92,7 +36,7 @@ export const styleTransformer: ts.TransformerFactory<ts.SourceFile> = (context)
92
36
  const testCreateStyleProp = (sourceFile: TransformSourceArgs['sourceFile']): string =>
93
37
  transformSource({
94
38
  sourceFile,
95
- transformers: [styleTransformer],
39
+ transformers: [mockedTransformer],
96
40
  })
97
41
 
98
42
  describe('createStyleProp()', () => {
@@ -3,14 +3,7 @@ import ts from 'typescript'
3
3
  export const createProp = (
4
4
  name: string,
5
5
  value?: ts.JsxAttributeValue | undefined,
6
- ): ts.JsxAttribute => {
7
- // Transforms `propName={true}` to `propName`
8
- if (value && ts.isJsxExpression(value) && value.expression?.kind === ts.SyntaxKind.TrueKeyword) {
9
- return ts.factory.createJsxAttribute(ts.factory.createIdentifier(name), undefined)
10
- }
11
-
12
- return ts.factory.createJsxAttribute(ts.factory.createIdentifier(name), value)
13
- }
6
+ ): ts.JsxAttribute => ts.factory.createJsxAttribute(ts.factory.createIdentifier(name), value)
14
7
 
15
8
  export const createStringProp = (name: string, value: string): ts.JsxAttribute =>
16
9
  createProp(name, ts.factory.createStringLiteral(value))
@@ -5,17 +5,10 @@ type ImportModuleNamedImports = {
5
5
  namedImports: ts.NodeArray<ts.ImportSpecifier>
6
6
  }
7
7
 
8
- const getKaioNamedImports = (
9
- visitedNode: ts.Node,
10
- importSource?: string,
11
- ): ImportModuleNamedImports | undefined => {
8
+ const getKaioNamedImports = (visitedNode: ts.Node): ImportModuleNamedImports | undefined => {
12
9
  if (ts.isImportDeclaration(visitedNode)) {
13
10
  const moduleSpecifier = (visitedNode.moduleSpecifier as ts.StringLiteral).text
14
- const hasMatch = importSource
15
- ? moduleSpecifier === importSource
16
- : moduleSpecifier.includes('@kaizen/components')
17
-
18
- if (hasMatch) {
11
+ if (moduleSpecifier.includes('@kaizen/components')) {
19
12
  const namedBindings = visitedNode.importClause?.namedBindings
20
13
  if (namedBindings && ts.isNamedImports(namedBindings)) {
21
14
  return {
@@ -49,13 +42,12 @@ const getNamesFromSpecifier = (importSpecifier: ts.ImportSpecifier): ImportSpeci
49
42
  */
50
43
  export const getKaioTagName = (
51
44
  node: ts.Node,
52
- componentName: string,
53
- importSource?: string,
45
+ importSpecifierTarget: string,
54
46
  ): string | undefined => {
55
47
  let alias: string | undefined
56
48
 
57
49
  const visitNode = (visitedNode: ts.Node): string | undefined => {
58
- const kaioNamedImports = getKaioNamedImports(visitedNode, importSource)
50
+ const kaioNamedImports = getKaioNamedImports(visitedNode)
59
51
 
60
52
  if (!kaioNamedImports) {
61
53
  return ts.forEachChild(visitedNode, visitNode)
@@ -64,7 +56,7 @@ export const getKaioTagName = (
64
56
  kaioNamedImports.namedImports.find((importSpecifier) => {
65
57
  const { tagName, originalName } = getNamesFromSpecifier(importSpecifier)
66
58
 
67
- if (originalName === componentName) {
59
+ if (originalName === importSpecifierTarget) {
68
60
  alias = tagName
69
61
  return true
70
62
  }
@@ -1,4 +1,3 @@
1
- export * from './createJsxElementWithChildren'
2
1
  export * from './createProp'
3
2
  export * from './getPropValueText'
4
3
  export * from './getKaioTagName'
@@ -4,6 +4,7 @@ var tslib = require('tslib');
4
4
  var React = require('react');
5
5
  var classnames = require('classnames');
6
6
  var FilterBarContext = require('../../context/FilterBarContext.cjs');
7
+ require('../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.cjs');
7
8
  var FilterButton = require('../../../FilterButton/FilterButton/FilterButton.cjs');
8
9
  var FilterButtonRemovable = require('../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs');
9
10
  var isRefObject = require('../../../../utils/isRefObject.cjs');
@@ -2,6 +2,7 @@
2
2
 
3
3
  var tslib = require('tslib');
4
4
  var React = require('react');
5
+ require('../../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.cjs');
5
6
  var FilterButton = require('../../../../FilterButton/FilterButton/FilterButton.cjs');
6
7
  require('../../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs');
7
8
  var MenuTriggerProvider = require('../../../context/MenuTriggerProvider/MenuTriggerProvider.cjs');
@@ -3,6 +3,7 @@
3
3
  var tslib = require('tslib');
4
4
  var React = require('react');
5
5
  var classnames = require('classnames');
6
+ require('../../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.cjs');
6
7
  require('../../../../FilterButton/FilterButton/FilterButton.cjs');
7
8
  var FilterButtonRemovable = require('../../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs');
8
9
  var MenuTriggerProvider = require('../../../context/MenuTriggerProvider/MenuTriggerProvider.cjs');
@@ -47,6 +47,7 @@ var Filter = require('./Filter/Filter/Filter.cjs');
47
47
  var FilterContents = require('./Filter/Filter/subcomponents/FilterContents/FilterContents.cjs');
48
48
  var FilterBar = require('./Filter/FilterBar/FilterBar.cjs');
49
49
  var FilterBarContext = require('./Filter/FilterBar/context/FilterBarContext.cjs');
50
+ var FilterButtonBase = require('./Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.cjs');
50
51
  var FilterButton = require('./Filter/FilterButton/FilterButton/FilterButton.cjs');
51
52
  var FilterButtonRemovable = require('./Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs');
52
53
  var FilterDatePicker = require('./Filter/FilterDatePicker/FilterDatePicker.cjs');
@@ -488,6 +489,7 @@ exports.FilterContents = FilterContents.FilterContents;
488
489
  exports.FilterBar = FilterBar.FilterBar;
489
490
  exports.FilterBarProvider = FilterBarContext.FilterBarProvider;
490
491
  exports.useFilterBarContext = FilterBarContext.useFilterBarContext;
492
+ exports.FilterButtonBase = FilterButtonBase.FilterButtonBase;
491
493
  exports.FilterButton = FilterButton.FilterButton;
492
494
  exports.FilterButtonRemovable = FilterButtonRemovable.FilterButtonRemovable;
493
495
  exports.FilterDatePicker = FilterDatePicker.FilterDatePicker;
@@ -2,6 +2,7 @@ import { __rest, __assign } from 'tslib';
2
2
  import React, { forwardRef, useEffect } from 'react';
3
3
  import classnames from 'classnames';
4
4
  import { useFilterBarContext } from '../../context/FilterBarContext.mjs';
5
+ import '../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.mjs';
5
6
  import { FilterButton } from '../../../FilterButton/FilterButton/FilterButton.mjs';
6
7
  import { FilterButtonRemovable } from '../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs';
7
8
  import { isRefObject } from '../../../../utils/isRefObject.mjs';
@@ -1,5 +1,6 @@
1
1
  import { __assign } from 'tslib';
2
2
  import React, { useRef } from 'react';
3
+ import '../../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.mjs';
3
4
  import { FilterButton } from '../../../../FilterButton/FilterButton/FilterButton.mjs';
4
5
  import '../../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs';
5
6
  import { useMenuTriggerContext } from '../../../context/MenuTriggerProvider/MenuTriggerProvider.mjs';
@@ -1,6 +1,7 @@
1
1
  import { __assign } from 'tslib';
2
2
  import React, { useRef } from 'react';
3
3
  import classnames from 'classnames';
4
+ import '../../../../FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.mjs';
4
5
  import '../../../../FilterButton/FilterButton/FilterButton.mjs';
5
6
  import { FilterButtonRemovable } from '../../../../FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs';
6
7
  import { useMenuTriggerContext } from '../../../context/MenuTriggerProvider/MenuTriggerProvider.mjs';
@@ -45,6 +45,7 @@ export { Filter } from './Filter/Filter/Filter.mjs';
45
45
  export { FilterContents } from './Filter/Filter/subcomponents/FilterContents/FilterContents.mjs';
46
46
  export { FilterBar } from './Filter/FilterBar/FilterBar.mjs';
47
47
  export { FilterBarProvider, useFilterBarContext } from './Filter/FilterBar/context/FilterBarContext.mjs';
48
+ export { FilterButtonBase } from './Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.mjs';
48
49
  export { FilterButton } from './Filter/FilterButton/FilterButton/FilterButton.mjs';
49
50
  export { FilterButtonRemovable } from './Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs';
50
51
  export { FilterDatePicker } from './Filter/FilterDatePicker/FilterDatePicker.mjs';