modern-cmdk 1.0.0

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 (32) hide show
  1. package/LICENSE +21 -0
  2. package/dist/codemod/cli.d.mts +1 -0
  3. package/dist/codemod/cli.mjs +89836 -0
  4. package/dist/codemod/cli.mjs.map +1 -0
  5. package/dist/codemod/transforms/data-attrs.d.mts +11 -0
  6. package/dist/codemod/transforms/data-attrs.d.mts.map +1 -0
  7. package/dist/codemod/transforms/data-attrs.mjs +68 -0
  8. package/dist/codemod/transforms/data-attrs.mjs.map +1 -0
  9. package/dist/codemod/transforms/forward-ref.d.mts +11 -0
  10. package/dist/codemod/transforms/forward-ref.d.mts.map +1 -0
  11. package/dist/codemod/transforms/forward-ref.mjs +53 -0
  12. package/dist/codemod/transforms/forward-ref.mjs.map +1 -0
  13. package/dist/codemod/transforms/import-rewrite.d.mts +11 -0
  14. package/dist/codemod/transforms/import-rewrite.d.mts.map +1 -0
  15. package/dist/codemod/transforms/import-rewrite.mjs +45 -0
  16. package/dist/codemod/transforms/import-rewrite.mjs.map +1 -0
  17. package/dist/codemod/transforms/should-filter.d.mts +10 -0
  18. package/dist/codemod/transforms/should-filter.d.mts.map +1 -0
  19. package/dist/codemod/transforms/should-filter.mjs +21 -0
  20. package/dist/codemod/transforms/should-filter.mjs.map +1 -0
  21. package/dist/core/index.d.mts +2 -0
  22. package/dist/core/index.mjs +2 -0
  23. package/dist/core-Bq0eDvlc.mjs +1217 -0
  24. package/dist/core-Bq0eDvlc.mjs.map +1 -0
  25. package/dist/index-Ctz7l29k.d.mts +562 -0
  26. package/dist/index-Ctz7l29k.d.mts.map +1 -0
  27. package/dist/react/index.d.mts +358 -0
  28. package/dist/react/index.d.mts.map +1 -0
  29. package/dist/react/index.mjs +905 -0
  30. package/dist/react/index.mjs.map +1 -0
  31. package/package.json +71 -0
  32. package/src/react/styles.css +609 -0
@@ -0,0 +1,11 @@
1
+ import { API, FileInfo } from "jscodeshift";
2
+
3
+ //#region src/codemod/transforms/data-attrs.d.ts
4
+ /**
5
+ * jscodeshift transform — renames cmdk data attributes in JSX and
6
+ * CSS selectors within string/template literals.
7
+ */
8
+ declare function transform(fileInfo: FileInfo, api: API): string;
9
+ //#endregion
10
+ export { transform as default };
11
+ //# sourceMappingURL=data-attrs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-attrs.d.mts","names":[],"sources":["../../../src/codemod/transforms/data-attrs.ts"],"mappings":";;;;;AAKmC;;iBA0CX,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA"}
@@ -0,0 +1,68 @@
1
+ //#region src/codemod/transforms/data-attrs.ts
2
+ /** Mapping from old bare attribute names to new data-attribute names */
3
+ const ATTR_MAP = new Map([
4
+ ["cmdk-root", "data-command"],
5
+ ["cmdk-input", "data-command-input"],
6
+ ["cmdk-list", "data-command-list"],
7
+ ["cmdk-item", "data-command-item"],
8
+ ["cmdk-group", "data-command-group"],
9
+ ["cmdk-separator", "data-command-separator"],
10
+ ["cmdk-empty", "data-command-empty"],
11
+ ["cmdk-loading", "data-command-loading"]
12
+ ]);
13
+ /** CSS custom property renames */
14
+ const CSS_VAR_MAP = new Map([["--cmdk-list-height", "--command-list-height"]]);
15
+ /**
16
+ * Replace all cmdk attribute selectors (bracketed) and CSS vars in a string.
17
+ * Uses ES2026 Set.union to combine both maps into a single pass.
18
+ */
19
+ function replaceInString(input) {
20
+ let result = input;
21
+ ATTR_MAP.entries().forEach(([oldAttr, newAttr]) => {
22
+ result = result.replaceAll(`[${oldAttr}]`, `[${newAttr}]`);
23
+ });
24
+ CSS_VAR_MAP.entries().forEach(([oldVar, newVar]) => {
25
+ result = result.replaceAll(oldVar, newVar);
26
+ });
27
+ return result;
28
+ }
29
+ /**
30
+ * jscodeshift transform — renames cmdk data attributes in JSX and
31
+ * CSS selectors within string/template literals.
32
+ */
33
+ function transform(fileInfo, api) {
34
+ if (!fileInfo.source.includes("cmdk")) return fileInfo.source;
35
+ const j = api.jscodeshift;
36
+ const root = j(fileInfo.source);
37
+ let hasChanges = false;
38
+ ATTR_MAP.entries().forEach(([oldAttr, newAttr]) => {
39
+ root.find(j.JSXAttribute, { name: { name: oldAttr } }).forEach((path) => {
40
+ path.node.name = j.jsxIdentifier(newAttr);
41
+ hasChanges = true;
42
+ });
43
+ });
44
+ root.find(j.StringLiteral).forEach((path) => {
45
+ const original = path.node.value;
46
+ const replaced = replaceInString(original);
47
+ if (replaced !== original) {
48
+ path.node.value = replaced;
49
+ hasChanges = true;
50
+ }
51
+ });
52
+ root.find(j.TemplateLiteral).forEach((path) => {
53
+ for (const quasi of path.node.quasis) {
54
+ const original = quasi.value.raw;
55
+ const replaced = replaceInString(original);
56
+ if (replaced !== original) {
57
+ quasi.value.raw = replaced;
58
+ quasi.value.cooked = replaced;
59
+ hasChanges = true;
60
+ }
61
+ }
62
+ });
63
+ return hasChanges ? root.toSource() : fileInfo.source;
64
+ }
65
+ //#endregion
66
+ export { transform as default };
67
+
68
+ //# sourceMappingURL=data-attrs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-attrs.mjs","names":[],"sources":["../../../src/codemod/transforms/data-attrs.ts"],"sourcesContent":["// modern-cmdk/codemod — Transform: data-attrs\n// Renames cmdk data attributes to data-command-* equivalents.\n// Handles JSX attributes, CSS selectors in string/template literals,\n// and querySelector-style calls.\n\nimport type { API, FileInfo } from 'jscodeshift';\n\n/** Mapping from old bare attribute names to new data-attribute names */\nconst ATTR_MAP: Map<string, string> = new Map<string, string>([\n ['cmdk-root', 'data-command'],\n ['cmdk-input', 'data-command-input'],\n ['cmdk-list', 'data-command-list'],\n ['cmdk-item', 'data-command-item'],\n ['cmdk-group', 'data-command-group'],\n ['cmdk-separator', 'data-command-separator'],\n ['cmdk-empty', 'data-command-empty'],\n ['cmdk-loading', 'data-command-loading'],\n]);\n\n/** CSS custom property renames */\nconst CSS_VAR_MAP: Map<string, string> = new Map<string, string>([\n ['--cmdk-list-height', '--command-list-height'],\n]);\n\n/**\n * Replace all cmdk attribute selectors (bracketed) and CSS vars in a string.\n * Uses ES2026 Set.union to combine both maps into a single pass.\n */\nfunction replaceInString(input: string): string {\n let result = input;\n\n // ES2026 Iterator Helper: .forEach on map entries\n ATTR_MAP.entries().forEach(([oldAttr, newAttr]) => {\n result = result.replaceAll(`[${oldAttr}]`, `[${newAttr}]`);\n });\n\n CSS_VAR_MAP.entries().forEach(([oldVar, newVar]) => {\n result = result.replaceAll(oldVar, newVar);\n });\n\n return result;\n}\n\n/**\n * jscodeshift transform — renames cmdk data attributes in JSX and\n * CSS selectors within string/template literals.\n */\nexport default function transform(fileInfo: FileInfo, api: API): string {\n // Quick bail — skip files with no cmdk references at all\n if (!fileInfo.source.includes('cmdk')) {\n return fileInfo.source;\n }\n\n const j = api.jscodeshift;\n const root = j(fileInfo.source);\n let hasChanges = false;\n\n // 1. Rename JSX attributes: <div cmdk-root=\"\" /> -> <div data-command=\"\" />\n // ES2026 Iterator Helper: .forEach on map entries\n ATTR_MAP.entries().forEach(([oldAttr, newAttr]) => {\n root\n .find(j.JSXAttribute, {\n name: { name: oldAttr },\n })\n .forEach((path) => {\n path.node.name = j.jsxIdentifier(newAttr);\n hasChanges = true;\n });\n });\n\n // 2. Replace in string literals (e.g. querySelector('[cmdk-item]'))\n root.find(j.StringLiteral).forEach((path) => {\n const original = path.node.value;\n const replaced = replaceInString(original);\n if (replaced !== original) {\n path.node.value = replaced;\n hasChanges = true;\n }\n });\n\n // 3. Replace in template literals\n root.find(j.TemplateLiteral).forEach((path) => {\n for (const quasi of path.node.quasis) {\n const original = quasi.value.raw;\n const replaced = replaceInString(original);\n if (replaced !== original) {\n quasi.value.raw = replaced;\n quasi.value.cooked = replaced;\n hasChanges = true;\n }\n }\n });\n\n return hasChanges ? root.toSource() : fileInfo.source;\n}\n"],"mappings":";;AAQA,MAAM,WAAgC,IAAI,IAAoB;CAC5D,CAAC,aAAa,eAAe;CAC7B,CAAC,cAAc,qBAAqB;CACpC,CAAC,aAAa,oBAAoB;CAClC,CAAC,aAAa,oBAAoB;CAClC,CAAC,cAAc,qBAAqB;CACpC,CAAC,kBAAkB,yBAAyB;CAC5C,CAAC,cAAc,qBAAqB;CACpC,CAAC,gBAAgB,uBAAuB;CACzC,CAAC;;AAGF,MAAM,cAAmC,IAAI,IAAoB,CAC/D,CAAC,sBAAsB,wBAAwB,CAChD,CAAC;;;;;AAMF,SAAS,gBAAgB,OAAuB;CAC9C,IAAI,SAAS;AAGb,UAAS,SAAS,CAAC,SAAS,CAAC,SAAS,aAAa;AACjD,WAAS,OAAO,WAAW,IAAI,QAAQ,IAAI,IAAI,QAAQ,GAAG;GAC1D;AAEF,aAAY,SAAS,CAAC,SAAS,CAAC,QAAQ,YAAY;AAClD,WAAS,OAAO,WAAW,QAAQ,OAAO;GAC1C;AAEF,QAAO;;;;;;AAOT,SAAwB,UAAU,UAAoB,KAAkB;AAEtE,KAAI,CAAC,SAAS,OAAO,SAAS,OAAO,CACnC,QAAO,SAAS;CAGlB,MAAM,IAAI,IAAI;CACd,MAAM,OAAO,EAAE,SAAS,OAAO;CAC/B,IAAI,aAAa;AAIjB,UAAS,SAAS,CAAC,SAAS,CAAC,SAAS,aAAa;AACjD,OACG,KAAK,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,SAAS,EACxB,CAAC,CACD,SAAS,SAAS;AACjB,QAAK,KAAK,OAAO,EAAE,cAAc,QAAQ;AACzC,gBAAa;IACb;GACJ;AAGF,MAAK,KAAK,EAAE,cAAc,CAAC,SAAS,SAAS;EAC3C,MAAM,WAAW,KAAK,KAAK;EAC3B,MAAM,WAAW,gBAAgB,SAAS;AAC1C,MAAI,aAAa,UAAU;AACzB,QAAK,KAAK,QAAQ;AAClB,gBAAa;;GAEf;AAGF,MAAK,KAAK,EAAE,gBAAgB,CAAC,SAAS,SAAS;AAC7C,OAAK,MAAM,SAAS,KAAK,KAAK,QAAQ;GACpC,MAAM,WAAW,MAAM,MAAM;GAC7B,MAAM,WAAW,gBAAgB,SAAS;AAC1C,OAAI,aAAa,UAAU;AACzB,UAAM,MAAM,MAAM;AAClB,UAAM,MAAM,SAAS;AACrB,iBAAa;;;GAGjB;AAEF,QAAO,aAAa,KAAK,UAAU,GAAG,SAAS"}
@@ -0,0 +1,11 @@
1
+ import { API, FileInfo } from "jscodeshift";
2
+
3
+ //#region src/codemod/transforms/forward-ref.d.ts
4
+ /**
5
+ * jscodeshift transform — removes forwardRef wrappers and merges the
6
+ * ref parameter into the props object as a regular prop.
7
+ */
8
+ declare function transform(fileInfo: FileInfo, api: API): string;
9
+ //#endregion
10
+ export { transform as default };
11
+ //# sourceMappingURL=forward-ref.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forward-ref.d.mts","names":[],"sources":["../../../src/codemod/transforms/forward-ref.ts"],"mappings":";;;;;AAcmC;;iBAMX,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA"}
@@ -0,0 +1,53 @@
1
+ //#region src/codemod/transforms/forward-ref.ts
2
+ /**
3
+ * jscodeshift transform — removes forwardRef wrappers and merges the
4
+ * ref parameter into the props object as a regular prop.
5
+ */
6
+ function transform(fileInfo, api) {
7
+ if (!fileInfo.source.includes("forwardRef")) return fileInfo.source;
8
+ const j = api.jscodeshift;
9
+ const root = j(fileInfo.source);
10
+ let hasChanges = false;
11
+ root.find(j.CallExpression).filter((path) => {
12
+ const callee = path.node.callee;
13
+ if (callee.type === "MemberExpression" && callee.object.type === "Identifier" && callee.object.name === "React" && callee.property.type === "Identifier" && callee.property.name === "forwardRef") return true;
14
+ if (callee.type === "Identifier" && callee.name === "forwardRef") return true;
15
+ return false;
16
+ }).forEach((path) => {
17
+ const args = path.node.arguments;
18
+ if (args.length === 0) return;
19
+ const renderFn = args[0];
20
+ if (!renderFn) return;
21
+ if (renderFn.type !== "ArrowFunctionExpression" && renderFn.type !== "FunctionExpression") return;
22
+ const params = renderFn.params;
23
+ if (params.length < 2) return;
24
+ const propsParam = params[0];
25
+ const refParam = params[1];
26
+ if (!propsParam || !refParam) return;
27
+ const refName = refParam.type === "Identifier" ? refParam.name : "ref";
28
+ const refProperty = j.objectProperty(j.identifier(refName), j.identifier(refName));
29
+ refProperty.shorthand = true;
30
+ if (propsParam.type === "ObjectPattern") propsParam.properties.unshift(refProperty);
31
+ else if (propsParam.type === "Identifier") {
32
+ const restElement = j.restElement(j.identifier(propsParam.name));
33
+ const newParam = j.objectPattern([refProperty, restElement]);
34
+ if ("typeAnnotation" in propsParam && propsParam.typeAnnotation) newParam.typeAnnotation = propsParam.typeAnnotation;
35
+ renderFn.params[0] = newParam;
36
+ }
37
+ renderFn.params = [renderFn.params[0]];
38
+ j(path).replaceWith(renderFn);
39
+ hasChanges = true;
40
+ });
41
+ if (hasChanges) {
42
+ if (root.find(j.Identifier, { name: "forwardRef" }).filter((path) => path.parent.node.type !== "ImportSpecifier").length === 0) root.find(j.ImportSpecifier, { imported: { name: "forwardRef" } }).forEach((path) => {
43
+ const importDecl = path.parent.node;
44
+ if (importDecl.specifiers && importDecl.specifiers.length === 1) j(path.parent).remove();
45
+ else j(path).remove();
46
+ });
47
+ }
48
+ return hasChanges ? root.toSource() : fileInfo.source;
49
+ }
50
+ //#endregion
51
+ export { transform as default };
52
+
53
+ //# sourceMappingURL=forward-ref.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forward-ref.mjs","names":[],"sources":["../../../src/codemod/transforms/forward-ref.ts"],"sourcesContent":["// modern-cmdk/codemod — Transform: forward-ref\n// Removes React.forwardRef() wrappers and adds `ref` as a regular prop.\n// React 19 no longer needs forwardRef — ref is a normal prop.\n//\n// Before:\n// const MyComponent = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n// return <Command.Root ref={ref} {...props} />;\n// });\n//\n// After:\n// const MyComponent = ({ ref, ...props }: Props & { ref?: React.Ref<HTMLDivElement> }) => {\n// return <Command.Root ref={ref} {...props} />;\n// };\n\nimport type { API, FileInfo } from 'jscodeshift';\n\n/**\n * jscodeshift transform — removes forwardRef wrappers and merges the\n * ref parameter into the props object as a regular prop.\n */\nexport default function transform(fileInfo: FileInfo, api: API): string {\n // Quick bail — skip files that don't use forwardRef\n if (!fileInfo.source.includes('forwardRef')) {\n return fileInfo.source;\n }\n\n const j = api.jscodeshift;\n const root = j(fileInfo.source);\n let hasChanges = false;\n\n // Find all forwardRef(...) call expressions\n root\n .find(j.CallExpression)\n .filter((path) => {\n const callee = path.node.callee;\n\n // React.forwardRef(...)\n if (\n callee.type === 'MemberExpression' &&\n callee.object.type === 'Identifier' &&\n callee.object.name === 'React' &&\n callee.property.type === 'Identifier' &&\n callee.property.name === 'forwardRef'\n ) {\n return true;\n }\n\n // forwardRef(...)\n if (callee.type === 'Identifier' && callee.name === 'forwardRef') {\n return true;\n }\n\n return false;\n })\n .forEach((path) => {\n const args = path.node.arguments;\n if (args.length === 0) return;\n\n const renderFn = args[0];\n if (!renderFn) return;\n\n // Only handle arrow functions and function expressions\n if (renderFn.type !== 'ArrowFunctionExpression' && renderFn.type !== 'FunctionExpression') {\n return;\n }\n\n const params = renderFn.params;\n if (params.length < 2) return;\n\n const propsParam = params[0];\n const refParam = params[1];\n if (!propsParam || !refParam) return;\n\n // Determine ref parameter name\n const refName = refParam.type === 'Identifier' ? refParam.name : 'ref';\n\n // Build a shorthand property for ref\n const refProperty = j.objectProperty(j.identifier(refName), j.identifier(refName));\n refProperty.shorthand = true;\n\n if (propsParam.type === 'ObjectPattern') {\n // Props already destructured: ({ foo, bar }, ref) => ...\n // Prepend ref into the destructured object\n propsParam.properties.unshift(refProperty);\n } else if (propsParam.type === 'Identifier') {\n // Props as single identifier: (props, ref) => ...\n // Convert to: ({ ref, ...props }) => ...\n const restElement = j.restElement(j.identifier(propsParam.name));\n const newParam = j.objectPattern([refProperty, restElement]);\n\n // Preserve type annotation if present\n if ('typeAnnotation' in propsParam && propsParam.typeAnnotation) {\n (newParam as unknown as Record<string, unknown>).typeAnnotation =\n propsParam.typeAnnotation;\n }\n\n renderFn.params[0] = newParam;\n }\n\n // Remove the ref parameter — now merged into props\n renderFn.params = [renderFn.params[0] as (typeof renderFn.params)[0]];\n\n // Replace the forwardRef(...) call with the unwrapped render function\n j(path).replaceWith(renderFn);\n hasChanges = true;\n });\n\n // Clean up unused forwardRef imports\n if (hasChanges) {\n const forwardRefUsages = root\n .find(j.Identifier, { name: 'forwardRef' })\n .filter((path) => path.parent.node.type !== 'ImportSpecifier');\n\n if (forwardRefUsages.length === 0) {\n root\n .find(j.ImportSpecifier, {\n imported: { name: 'forwardRef' },\n })\n .forEach((path) => {\n const importDecl = path.parent.node;\n if (importDecl.specifiers && importDecl.specifiers.length === 1) {\n // Only specifier — remove the entire import declaration\n j(path.parent).remove();\n } else {\n // Multiple specifiers — remove just this one\n j(path).remove();\n }\n });\n }\n }\n\n return hasChanges ? root.toSource() : fileInfo.source;\n}\n"],"mappings":";;;;;AAoBA,SAAwB,UAAU,UAAoB,KAAkB;AAEtE,KAAI,CAAC,SAAS,OAAO,SAAS,aAAa,CACzC,QAAO,SAAS;CAGlB,MAAM,IAAI,IAAI;CACd,MAAM,OAAO,EAAE,SAAS,OAAO;CAC/B,IAAI,aAAa;AAGjB,MACG,KAAK,EAAE,eAAe,CACtB,QAAQ,SAAS;EAChB,MAAM,SAAS,KAAK,KAAK;AAGzB,MACE,OAAO,SAAS,sBAChB,OAAO,OAAO,SAAS,gBACvB,OAAO,OAAO,SAAS,WACvB,OAAO,SAAS,SAAS,gBACzB,OAAO,SAAS,SAAS,aAEzB,QAAO;AAIT,MAAI,OAAO,SAAS,gBAAgB,OAAO,SAAS,aAClD,QAAO;AAGT,SAAO;GACP,CACD,SAAS,SAAS;EACjB,MAAM,OAAO,KAAK,KAAK;AACvB,MAAI,KAAK,WAAW,EAAG;EAEvB,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SAAU;AAGf,MAAI,SAAS,SAAS,6BAA6B,SAAS,SAAS,qBACnE;EAGF,MAAM,SAAS,SAAS;AACxB,MAAI,OAAO,SAAS,EAAG;EAEvB,MAAM,aAAa,OAAO;EAC1B,MAAM,WAAW,OAAO;AACxB,MAAI,CAAC,cAAc,CAAC,SAAU;EAG9B,MAAM,UAAU,SAAS,SAAS,eAAe,SAAS,OAAO;EAGjE,MAAM,cAAc,EAAE,eAAe,EAAE,WAAW,QAAQ,EAAE,EAAE,WAAW,QAAQ,CAAC;AAClF,cAAY,YAAY;AAExB,MAAI,WAAW,SAAS,gBAGtB,YAAW,WAAW,QAAQ,YAAY;WACjC,WAAW,SAAS,cAAc;GAG3C,MAAM,cAAc,EAAE,YAAY,EAAE,WAAW,WAAW,KAAK,CAAC;GAChE,MAAM,WAAW,EAAE,cAAc,CAAC,aAAa,YAAY,CAAC;AAG5D,OAAI,oBAAoB,cAAc,WAAW,eAC9C,UAAgD,iBAC/C,WAAW;AAGf,YAAS,OAAO,KAAK;;AAIvB,WAAS,SAAS,CAAC,SAAS,OAAO,GAAkC;AAGrE,IAAE,KAAK,CAAC,YAAY,SAAS;AAC7B,eAAa;GACb;AAGJ,KAAI;MACuB,KACtB,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC,CAC1C,QAAQ,SAAS,KAAK,OAAO,KAAK,SAAS,kBAAkB,CAE3C,WAAW,EAC9B,MACG,KAAK,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,cAAc,EACjC,CAAC,CACD,SAAS,SAAS;GACjB,MAAM,aAAa,KAAK,OAAO;AAC/B,OAAI,WAAW,cAAc,WAAW,WAAW,WAAW,EAE5D,GAAE,KAAK,OAAO,CAAC,QAAQ;OAGvB,GAAE,KAAK,CAAC,QAAQ;IAElB;;AAIR,QAAO,aAAa,KAAK,UAAU,GAAG,SAAS"}
@@ -0,0 +1,11 @@
1
+ import { API, FileInfo } from "jscodeshift";
2
+
3
+ //#region src/codemod/transforms/import-rewrite.d.ts
4
+ /**
5
+ * jscodeshift transform — rewrites all import/require/re-export paths
6
+ * from `cmdk` to `modern-cmdk/react`.
7
+ */
8
+ declare function transform(fileInfo: FileInfo, api: API): string;
9
+ //#endregion
10
+ export { transform as default };
11
+ //# sourceMappingURL=import-rewrite.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-rewrite.d.mts","names":[],"sources":["../../../src/codemod/transforms/import-rewrite.ts"],"mappings":";;;;;AAImC;;iBASX,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA"}
@@ -0,0 +1,45 @@
1
+ //#region src/codemod/transforms/import-rewrite.ts
2
+ const OLD_PACKAGE = "cmdk";
3
+ const NEW_PACKAGE = "modern-cmdk/react";
4
+ /**
5
+ * jscodeshift transform — rewrites all import/require/re-export paths
6
+ * from `cmdk` to `modern-cmdk/react`.
7
+ */
8
+ function transform(fileInfo, api) {
9
+ const j = api.jscodeshift;
10
+ const root = j(fileInfo.source);
11
+ let hasChanges = false;
12
+ root.find(j.ImportDeclaration, { source: { value: OLD_PACKAGE } }).forEach((path) => {
13
+ path.node.source.value = NEW_PACKAGE;
14
+ hasChanges = true;
15
+ });
16
+ root.find(j.ExportNamedDeclaration, { source: { value: OLD_PACKAGE } }).forEach((path) => {
17
+ if (path.node.source) {
18
+ path.node.source.value = NEW_PACKAGE;
19
+ hasChanges = true;
20
+ }
21
+ });
22
+ root.find(j.ExportAllDeclaration, { source: { value: OLD_PACKAGE } }).forEach((path) => {
23
+ path.node.source.value = NEW_PACKAGE;
24
+ hasChanges = true;
25
+ });
26
+ root.find(j.CallExpression, { callee: { type: "Import" } }).forEach((path) => {
27
+ const arg = path.node.arguments[0];
28
+ if (arg && arg.type === "StringLiteral" && arg.value === OLD_PACKAGE) {
29
+ arg.value = NEW_PACKAGE;
30
+ hasChanges = true;
31
+ }
32
+ });
33
+ root.find(j.CallExpression, { callee: { name: "require" } }).forEach((path) => {
34
+ const arg = path.node.arguments[0];
35
+ if (arg && arg.type === "StringLiteral" && arg.value === OLD_PACKAGE) {
36
+ arg.value = NEW_PACKAGE;
37
+ hasChanges = true;
38
+ }
39
+ });
40
+ return hasChanges ? root.toSource() : fileInfo.source;
41
+ }
42
+ //#endregion
43
+ export { transform as default };
44
+
45
+ //# sourceMappingURL=import-rewrite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-rewrite.mjs","names":[],"sources":["../../../src/codemod/transforms/import-rewrite.ts"],"sourcesContent":["// modern-cmdk — Transform: import-rewrite\n// Rewrites imports from 'cmdk' to 'modern-cmdk/react'.\n// Handles named imports, default imports, dynamic imports, require(), and re-exports.\n\nimport type { API, FileInfo } from 'jscodeshift';\n\nconst OLD_PACKAGE = 'cmdk';\nconst NEW_PACKAGE = 'modern-cmdk/react';\n\n/**\n * jscodeshift transform — rewrites all import/require/re-export paths\n * from `cmdk` to `modern-cmdk/react`.\n */\nexport default function transform(fileInfo: FileInfo, api: API): string {\n const j = api.jscodeshift;\n const root = j(fileInfo.source);\n let hasChanges = false;\n\n // Rewrite import declarations:\n // import { Command } from 'cmdk'\n // import Command from 'cmdk'\n // import * as Cmdk from 'cmdk'\n root\n .find(j.ImportDeclaration, {\n source: { value: OLD_PACKAGE },\n })\n .forEach((path) => {\n path.node.source.value = NEW_PACKAGE;\n hasChanges = true;\n });\n\n // Rewrite re-exports:\n // export { Command } from 'cmdk'\n // export * from 'cmdk'\n root\n .find(j.ExportNamedDeclaration, {\n source: { value: OLD_PACKAGE },\n })\n .forEach((path) => {\n if (path.node.source) {\n path.node.source.value = NEW_PACKAGE;\n hasChanges = true;\n }\n });\n\n root\n .find(j.ExportAllDeclaration, {\n source: { value: OLD_PACKAGE },\n })\n .forEach((path) => {\n path.node.source.value = NEW_PACKAGE;\n hasChanges = true;\n });\n\n // Rewrite dynamic imports: import('cmdk')\n root\n .find(j.CallExpression, {\n callee: { type: 'Import' },\n })\n .forEach((path) => {\n const arg = path.node.arguments[0];\n if (arg && arg.type === 'StringLiteral' && arg.value === OLD_PACKAGE) {\n arg.value = NEW_PACKAGE;\n hasChanges = true;\n }\n });\n\n // Rewrite require('cmdk')\n root\n .find(j.CallExpression, {\n callee: { name: 'require' },\n })\n .forEach((path) => {\n const arg = path.node.arguments[0];\n if (arg && arg.type === 'StringLiteral' && arg.value === OLD_PACKAGE) {\n arg.value = NEW_PACKAGE;\n hasChanges = true;\n }\n });\n\n return hasChanges ? root.toSource() : fileInfo.source;\n}\n"],"mappings":";AAMA,MAAM,cAAc;AACpB,MAAM,cAAc;;;;;AAMpB,SAAwB,UAAU,UAAoB,KAAkB;CACtE,MAAM,IAAI,IAAI;CACd,MAAM,OAAO,EAAE,SAAS,OAAO;CAC/B,IAAI,aAAa;AAMjB,MACG,KAAK,EAAE,mBAAmB,EACzB,QAAQ,EAAE,OAAO,aAAa,EAC/B,CAAC,CACD,SAAS,SAAS;AACjB,OAAK,KAAK,OAAO,QAAQ;AACzB,eAAa;GACb;AAKJ,MACG,KAAK,EAAE,wBAAwB,EAC9B,QAAQ,EAAE,OAAO,aAAa,EAC/B,CAAC,CACD,SAAS,SAAS;AACjB,MAAI,KAAK,KAAK,QAAQ;AACpB,QAAK,KAAK,OAAO,QAAQ;AACzB,gBAAa;;GAEf;AAEJ,MACG,KAAK,EAAE,sBAAsB,EAC5B,QAAQ,EAAE,OAAO,aAAa,EAC/B,CAAC,CACD,SAAS,SAAS;AACjB,OAAK,KAAK,OAAO,QAAQ;AACzB,eAAa;GACb;AAGJ,MACG,KAAK,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,UAAU,EAC3B,CAAC,CACD,SAAS,SAAS;EACjB,MAAM,MAAM,KAAK,KAAK,UAAU;AAChC,MAAI,OAAO,IAAI,SAAS,mBAAmB,IAAI,UAAU,aAAa;AACpE,OAAI,QAAQ;AACZ,gBAAa;;GAEf;AAGJ,MACG,KAAK,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,WAAW,EAC5B,CAAC,CACD,SAAS,SAAS;EACjB,MAAM,MAAM,KAAK,KAAK,UAAU;AAChC,MAAI,OAAO,IAAI,SAAS,mBAAmB,IAAI,UAAU,aAAa;AACpE,OAAI,QAAQ;AACZ,gBAAa;;GAEf;AAEJ,QAAO,aAAa,KAAK,UAAU,GAAG,SAAS"}
@@ -0,0 +1,10 @@
1
+ import { API, FileInfo } from "jscodeshift";
2
+
3
+ //#region src/codemod/transforms/should-filter.d.ts
4
+ /**
5
+ * jscodeshift transform — migrates shouldFilter prop to filter.
6
+ */
7
+ declare function transform(fileInfo: FileInfo, api: API): string;
8
+ //#endregion
9
+ export { transform as default };
10
+ //# sourceMappingURL=should-filter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"should-filter.d.mts","names":[],"sources":["../../../src/codemod/transforms/should-filter.ts"],"mappings":";;;;;AAMmC;iBAKX,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,GAAA,EAAK,GAAA"}
@@ -0,0 +1,21 @@
1
+ //#region src/codemod/transforms/should-filter.ts
2
+ /**
3
+ * jscodeshift transform — migrates shouldFilter prop to filter.
4
+ */
5
+ function transform(fileInfo, api) {
6
+ if (!fileInfo.source.includes("shouldFilter")) return fileInfo.source;
7
+ const j = api.jscodeshift;
8
+ const root = j(fileInfo.source);
9
+ let hasChanges = false;
10
+ root.find(j.JSXAttribute, { name: { name: "shouldFilter" } }).forEach((path) => {
11
+ const value = path.node.value;
12
+ if (value && value.type === "JSXExpressionContainer" && value.expression.type === "BooleanLiteral" && value.expression.value === true || value === null) j(path).remove();
13
+ else path.node.name = j.jsxIdentifier("filter");
14
+ hasChanges = true;
15
+ });
16
+ return hasChanges ? root.toSource() : fileInfo.source;
17
+ }
18
+ //#endregion
19
+ export { transform as default };
20
+
21
+ //# sourceMappingURL=should-filter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"should-filter.mjs","names":[],"sources":["../../../src/codemod/transforms/should-filter.ts"],"sourcesContent":["// modern-cmdk/codemod — Transform: should-filter\n// Renames the `shouldFilter` JSX prop to `filter` on Command components.\n// shouldFilter={false} -> filter={false}\n// shouldFilter={true} -> (removed — filter is true by default)\n// shouldFilter -> (removed — bare attr is truthy, which is the default)\n\nimport type { API, FileInfo } from 'jscodeshift';\n\n/**\n * jscodeshift transform — migrates shouldFilter prop to filter.\n */\nexport default function transform(fileInfo: FileInfo, api: API): string {\n // Quick bail — skip files without shouldFilter\n if (!fileInfo.source.includes('shouldFilter')) {\n return fileInfo.source;\n }\n\n const j = api.jscodeshift;\n const root = j(fileInfo.source);\n let hasChanges = false;\n\n // Find all JSX attributes named \"shouldFilter\"\n root\n .find(j.JSXAttribute, {\n name: { name: 'shouldFilter' },\n })\n .forEach((path) => {\n const value = path.node.value;\n\n // Determine if the value is explicitly `true`\n const isTrueValue =\n // shouldFilter={true}\n (value &&\n value.type === 'JSXExpressionContainer' &&\n value.expression.type === 'BooleanLiteral' &&\n value.expression.value === true) ||\n // shouldFilter (bare attribute — implicitly true)\n value === null;\n\n if (isTrueValue) {\n // Remove the attribute entirely — filter defaults to true\n j(path).remove();\n } else {\n // Rename shouldFilter to filter (e.g. shouldFilter={false})\n path.node.name = j.jsxIdentifier('filter');\n }\n\n hasChanges = true;\n });\n\n return hasChanges ? root.toSource() : fileInfo.source;\n}\n"],"mappings":";;;;AAWA,SAAwB,UAAU,UAAoB,KAAkB;AAEtE,KAAI,CAAC,SAAS,OAAO,SAAS,eAAe,CAC3C,QAAO,SAAS;CAGlB,MAAM,IAAI,IAAI;CACd,MAAM,OAAO,EAAE,SAAS,OAAO;CAC/B,IAAI,aAAa;AAGjB,MACG,KAAK,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,gBAAgB,EAC/B,CAAC,CACD,SAAS,SAAS;EACjB,MAAM,QAAQ,KAAK,KAAK;AAYxB,MAPG,SACC,MAAM,SAAS,4BACf,MAAM,WAAW,SAAS,oBAC1B,MAAM,WAAW,UAAU,QAE7B,UAAU,KAIV,GAAE,KAAK,CAAC,QAAQ;MAGhB,MAAK,KAAK,OAAO,EAAE,cAAc,SAAS;AAG5C,eAAa;GACb;AAEJ,QAAO,aAAa,KAAK,UAAU,GAAG,SAAS"}
@@ -0,0 +1,2 @@
1
+ import { A as DEFAULT_FRECENCY_DECAY, B as groupId, C as computeFrecencyBonus, D as CommandItem, E as CommandGroup, F as FrecencyRecord, H as ScorerFn, I as FrecencyStorage, L as GroupId, M as FrecencyData, N as FrecencyDecayConfig, O as CommandMachineOptions, P as FrecencyOptions, R as ItemId, S as FrecencyEngine, T as CommandEvent, U as SearchEngine, V as itemId, W as SearchResult, _ as matchesShortcut, a as TelemetryMiddleware, b as parseShortcut, c as batchScoreItems, d as CommandMachine, f as createCommandMachine, g as findMatchingShortcut, h as detectConflicts, i as CommandTelemetryHooks, j as DEFAULT_MACHINE_OPTIONS, k as CommandState, l as scoreItemAsync, m as KeyboardShortcutRegistry, n as createScheduler, o as createTelemetryMiddleware, p as CommandRegistry, r as TypedEmitter, s as createSearchEngine, t as Scheduler, u as scoreItem, v as ParsedShortcut, w as IdbFrecencyStorage, x as MemoryFrecencyStorage, y as formatShortcut, z as createInitialState } from "../index-Ctz7l29k.mjs";
2
+ export { CommandEvent, CommandGroup, CommandItem, CommandMachine, CommandMachineOptions, CommandRegistry, CommandState, CommandTelemetryHooks, DEFAULT_FRECENCY_DECAY, DEFAULT_MACHINE_OPTIONS, FrecencyData, FrecencyDecayConfig, FrecencyEngine, FrecencyOptions, FrecencyRecord, FrecencyStorage, GroupId, IdbFrecencyStorage, ItemId, KeyboardShortcutRegistry, MemoryFrecencyStorage, ParsedShortcut, Scheduler, ScorerFn, SearchEngine, SearchResult, TelemetryMiddleware, TypedEmitter, batchScoreItems, computeFrecencyBonus, createCommandMachine, createInitialState, createScheduler, createSearchEngine, createTelemetryMiddleware, detectConflicts, findMatchingShortcut, formatShortcut, groupId, itemId, matchesShortcut, parseShortcut, scoreItem, scoreItemAsync };
@@ -0,0 +1,2 @@
1
+ import { C as itemId, S as groupId, _ as computeFrecencyBonus, a as createScheduler, b as DEFAULT_MACHINE_OPTIONS, c as scoreItem, d as formatShortcut, f as parseShortcut, g as FrecencyEngine, h as matchesShortcut, i as createCommandMachine, l as CommandRegistry, m as findMatchingShortcut, n as batchScoreItems, o as TypedEmitter, p as detectConflicts, r as scoreItemAsync, s as createSearchEngine, t as createTelemetryMiddleware, u as KeyboardShortcutRegistry, v as MemoryFrecencyStorage, w as IdbFrecencyStorage, x as createInitialState, y as DEFAULT_FRECENCY_DECAY } from "../core-Bq0eDvlc.mjs";
2
+ export { CommandRegistry, DEFAULT_FRECENCY_DECAY, DEFAULT_MACHINE_OPTIONS, FrecencyEngine, IdbFrecencyStorage, KeyboardShortcutRegistry, MemoryFrecencyStorage, TypedEmitter, batchScoreItems, computeFrecencyBonus, createCommandMachine, createInitialState, createScheduler, createSearchEngine, createTelemetryMiddleware, detectConflicts, findMatchingShortcut, formatShortcut, groupId, itemId, matchesShortcut, parseShortcut, scoreItem, scoreItemAsync };