assistant-ui 0.0.112 → 0.0.114

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 (91) hide show
  1. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
  2. package/dist/codemods/v0-12/assistant-api-to-aui.js +87 -62
  3. package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
  4. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
  5. package/dist/codemods/v0-12/primitive-if-to-aui-if.js +31 -45
  6. package/dist/codemods/v0-12/primitive-if-to-aui-if.js.map +1 -1
  7. package/dist/commands/add.d.ts +1 -1
  8. package/dist/commands/add.d.ts.map +1 -1
  9. package/dist/commands/add.js +4 -2
  10. package/dist/commands/add.js.map +1 -1
  11. package/dist/commands/create.d.ts.map +1 -1
  12. package/dist/commands/create.js +33 -10
  13. package/dist/commands/create.js.map +1 -1
  14. package/dist/commands/info.d.ts.map +1 -1
  15. package/dist/commands/info.js +2 -1
  16. package/dist/commands/info.js.map +1 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +4 -2
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/mcp.d.ts.map +1 -1
  21. package/dist/commands/mcp.js +52 -40
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/commands/update.js +6 -7
  24. package/dist/commands/update.js.map +1 -1
  25. package/dist/commands/upgrade.d.ts.map +1 -1
  26. package/dist/commands/upgrade.js +5 -2
  27. package/dist/commands/upgrade.js.map +1 -1
  28. package/dist/index.js +2 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/agent-skill.d.ts +1 -1
  31. package/dist/lib/agent-skill.d.ts.map +1 -1
  32. package/dist/lib/agent-skill.js.map +1 -1
  33. package/dist/lib/create-project.d.ts +11 -3
  34. package/dist/lib/create-project.d.ts.map +1 -1
  35. package/dist/lib/create-project.js +127 -43
  36. package/dist/lib/create-project.js.map +1 -1
  37. package/dist/lib/handle-cli-error.d.ts +5 -0
  38. package/dist/lib/handle-cli-error.d.ts.map +1 -0
  39. package/dist/lib/handle-cli-error.js +17 -0
  40. package/dist/lib/handle-cli-error.js.map +1 -0
  41. package/dist/lib/install-ai-sdk-lib.js +8 -1
  42. package/dist/lib/install-ai-sdk-lib.js.map +1 -1
  43. package/dist/lib/install-edge-lib.js +4 -8
  44. package/dist/lib/install-edge-lib.js.map +1 -1
  45. package/dist/lib/run-spawn.d.ts +16 -2
  46. package/dist/lib/run-spawn.d.ts.map +1 -1
  47. package/dist/lib/run-spawn.js +87 -9
  48. package/dist/lib/run-spawn.js.map +1 -1
  49. package/dist/lib/transform.d.ts +1 -1
  50. package/dist/lib/transform.d.ts.map +1 -1
  51. package/dist/lib/transform.js +12 -25
  52. package/dist/lib/transform.js.map +1 -1
  53. package/dist/lib/upgrade.js +20 -16
  54. package/dist/lib/upgrade.js.map +1 -1
  55. package/dist/lib/utils/file-scanner.d.ts +9 -1
  56. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  57. package/dist/lib/utils/file-scanner.js +22 -20
  58. package/dist/lib/utils/file-scanner.js.map +1 -1
  59. package/dist/lib/utils/package-installer.js +1 -1
  60. package/dist/lib/utils/package-manager.d.ts +3 -1
  61. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  62. package/dist/lib/utils/package-manager.js +22 -10
  63. package/dist/lib/utils/package-manager.js.map +1 -1
  64. package/package.json +7 -7
  65. package/plugin/skills/assistant-ui/SKILL.md +4 -4
  66. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +370 -0
  67. package/src/codemods/v0-12/__tests__/primitive-if-to-aui-if.test.ts +100 -0
  68. package/src/codemods/v0-12/assistant-api-to-aui.ts +227 -134
  69. package/src/codemods/v0-12/primitive-if-to-aui-if.ts +44 -72
  70. package/src/commands/add.ts +5 -5
  71. package/src/commands/create.ts +41 -7
  72. package/src/commands/info.ts +1 -0
  73. package/src/commands/init.ts +4 -6
  74. package/src/commands/mcp.ts +57 -41
  75. package/src/commands/update.ts +6 -8
  76. package/src/commands/upgrade.ts +5 -2
  77. package/src/index.ts +2 -7
  78. package/src/lib/agent-skill.ts +2 -1
  79. package/src/lib/create-project.test.ts +175 -0
  80. package/src/lib/create-project.ts +189 -59
  81. package/src/lib/handle-cli-error.test.ts +67 -0
  82. package/src/lib/handle-cli-error.ts +17 -0
  83. package/src/lib/install-ai-sdk-lib.ts +13 -1
  84. package/src/lib/install-edge-lib.ts +7 -8
  85. package/src/lib/run-spawn.test.ts +148 -0
  86. package/src/lib/run-spawn.ts +121 -11
  87. package/src/lib/transform.test.ts +87 -0
  88. package/src/lib/transform.ts +21 -37
  89. package/src/lib/upgrade.ts +23 -19
  90. package/src/lib/utils/file-scanner.ts +26 -20
  91. package/src/lib/utils/package-manager.ts +29 -12
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-api-to-aui.d.ts","names":[],"sources":["../../../src/codemods/v0-12/assistant-api-to-aui.ts"],"mappings":";cAsFM,2BAAwB,yCAAA,UAAA,oCAAA,KAAA"}
1
+ {"version":3,"file":"assistant-api-to-aui.d.ts","names":[],"sources":["../../../src/codemods/v0-12/assistant-api-to-aui.ts"],"mappings":";cAwBM,2BAAwB,yCAAA,UAAA,oCAAA,KAAA"}
@@ -12,33 +12,7 @@ const componentRenamingMap = {
12
12
  const isUseAuiCall = (j, node) => {
13
13
  return node && j.CallExpression.check(node) && j.Identifier.check(node.callee) && (node.callee.name === "useAui" || node.callee.name === "useAssistantApi");
14
14
  };
15
- const scopeHasDirectApiDeclaration = (j, scopeNode) => {
16
- let body = null;
17
- if (j.FunctionDeclaration.check(scopeNode) || j.FunctionExpression.check(scopeNode)) body = scopeNode.body?.body;
18
- else if (j.ArrowFunctionExpression.check(scopeNode)) {
19
- if (j.BlockStatement.check(scopeNode.body)) body = scopeNode.body.body;
20
- } else if (j.BlockStatement.check(scopeNode)) body = scopeNode.body;
21
- if (!Array.isArray(body)) return false;
22
- for (const statement of body) if (j.VariableDeclaration.check(statement)) {
23
- for (const declarator of statement.declarations) if (j.Identifier.check(declarator.id) && declarator.id.name === "api") {
24
- if (!isUseAuiCall(j, declarator.init)) return true;
25
- }
26
- }
27
- return false;
28
- };
29
- const isInsideShadowingScope = (j, identifierPath) => {
30
- let currentPath = identifierPath.parent;
31
- while (currentPath) {
32
- const node = currentPath.value;
33
- if (j.FunctionDeclaration.check(node) || j.FunctionExpression.check(node) || j.ArrowFunctionExpression.check(node) || j.BlockStatement.check(node)) {
34
- if (scopeHasDirectApiDeclaration(j, node)) return true;
35
- }
36
- currentPath = currentPath.parent;
37
- }
38
- return false;
39
- };
40
15
  const migrateAssistantApiToAui = createTransformer(({ j, root, markAsChanged }) => {
41
- let hasApiFromUseAui = false;
42
16
  root.find(j.ImportDeclaration).forEach((path) => {
43
17
  const source = path.value.source.value;
44
18
  if (typeof source === "string" && source.startsWith("@assistant-ui/")) path.value.specifiers?.forEach((specifier) => {
@@ -59,48 +33,99 @@ const migrateAssistantApiToAui = createTransformer(({ j, root, markAsChanged })
59
33
  }
60
34
  });
61
35
  });
36
+ const renamedDeclaratorIds = /* @__PURE__ */ new Set();
62
37
  root.find(j.VariableDeclarator).forEach((path) => {
63
- const init = path.value.init;
64
- if (isUseAuiCall(j, init)) {
65
- if (j.Identifier.check(path.value.id)) {
66
- if (path.value.id.name === "api") {
67
- path.value.id.name = "aui";
68
- hasApiFromUseAui = true;
69
- markAsChanged();
70
- }
71
- }
72
- }
38
+ if (isUseAuiCall(j, path.value.init) && j.Identifier.check(path.value.id) && path.value.id.name === "api") renamedDeclaratorIds.add(path.value.id);
73
39
  });
74
- if (hasApiFromUseAui) {
75
- root.find(j.Identifier).forEach((path) => {
76
- if (path.value.name === "api") {
77
- if (j.ImportSpecifier.check(path.parent.value)) return;
78
- if (j.VariableDeclarator.check(path.parent.value)) {
79
- if (path.parent.value.id === path.value) return;
80
- }
81
- if (j.Property.check(path.parent.value)) {
82
- const prop = path.parent.value;
83
- if (prop.key === path.value && !prop.shorthand && !prop.computed) return;
84
- }
85
- if (j.ObjectProperty.check(path.parent.value)) {
86
- const prop = path.parent.value;
87
- if (prop.key === path.value && !prop.shorthand && !prop.computed) return;
40
+ if (renamedDeclaratorIds.size > 0) {
41
+ const patternBindsApi = (id) => {
42
+ if (id && (id.type === "TSParameterProperty" || j.TSParameterProperty?.check?.(id))) return patternBindsApi(id.parameter);
43
+ if (j.Identifier.check(id)) return id.name === "api";
44
+ if (j.ObjectPattern.check(id)) return id.properties.some((prop) => patternBindsApi(prop.value ?? prop.argument ?? prop));
45
+ if (j.ArrayPattern.check(id)) return id.elements.some((el) => el && patternBindsApi(el));
46
+ if (j.AssignmentPattern.check(id)) return patternBindsApi(id.left);
47
+ if (j.RestElement.check(id)) return patternBindsApi(id.argument);
48
+ return false;
49
+ };
50
+ const declaredApi = (statement) => {
51
+ if (!statement) return void 0;
52
+ if (j.ExportNamedDeclaration.check(statement) || j.ExportDefaultDeclaration.check(statement)) return declaredApi(statement.declaration);
53
+ if (j.VariableDeclaration.check(statement)) {
54
+ for (const declarator of statement.declarations) {
55
+ if (j.Identifier.check(declarator.id) && declarator.id.name === "api") return declarator.id;
56
+ if (patternBindsApi(declarator.id)) return "foreign";
88
57
  }
89
- if (j.MemberExpression.check(path.parent.value) && path.parent.value.property === path.value && !path.parent.value.computed) return;
90
- if (j.JSXAttribute.check(path.parent.value)) return;
91
- if (isInsideShadowingScope(j, path)) return;
92
- path.value.name = "aui";
93
- markAsChanged();
58
+ return;
94
59
  }
95
- });
96
- root.find(j.JSXIdentifier).forEach((path) => {
97
- if (path.value.name === "api") {
98
- if (!isInsideShadowingScope(j, path)) {
99
- path.value.name = "aui";
100
- markAsChanged();
101
- }
60
+ if (statement.type === "TSTypeAliasDeclaration" || statement.type === "TSInterfaceDeclaration" || statement.type === "TSDeclareFunction") return void 0;
61
+ if (statement.id && j.Identifier.check(statement.id) && statement.id.name === "api") return "foreign";
62
+ };
63
+ const scanStatements = (statements) => {
64
+ for (const statement of statements) {
65
+ const found = declaredApi(statement);
66
+ if (found !== void 0) return found;
67
+ }
68
+ };
69
+ const governingApiBinding = (path) => {
70
+ let current = path.parent;
71
+ while (current) {
72
+ const node = current.value;
73
+ if (Array.isArray(node.params) && node.params.some(patternBindsApi)) return "foreign";
74
+ if ((j.FunctionExpression.check(node) || j.ClassExpression.check(node)) && node.id?.name === "api") return "foreign";
75
+ if (j.CatchClause.check(node) && node.param && patternBindsApi(node.param)) return "foreign";
76
+ let found;
77
+ if (j.BlockStatement.check(node) || j.Program.check(node)) found = scanStatements(node.body);
78
+ else if (j.ForStatement.check(node)) found = declaredApi(node.init);
79
+ else if (j.ForOfStatement.check(node) || j.ForInStatement.check(node)) found = declaredApi(node.left);
80
+ else if (j.SwitchStatement.check(node)) found = scanStatements(node.cases.flatMap((c) => c.consequent));
81
+ else if (j.StaticBlock?.check?.(node)) found = scanStatements(node.body);
82
+ if (found !== void 0) return found;
83
+ current = current.parent;
84
+ }
85
+ };
86
+ const bindsToRenamedApi = (path) => {
87
+ const governing = governingApiBinding(path);
88
+ return governing !== "foreign" && renamedDeclaratorIds.has(governing);
89
+ };
90
+ const referencePaths = [];
91
+ root.find(j.Identifier, { name: "api" }).forEach((path) => {
92
+ const parent = path.parent.value;
93
+ if (j.ImportSpecifier.check(parent)) return;
94
+ if (parent.id === path.value) return;
95
+ if (j.TSTypeReference?.check?.(parent)) return;
96
+ if (j.TSQualifiedName?.check?.(parent)) return;
97
+ if (parent.key === path.value && !parent.computed && parent.value !== path.value) return;
98
+ if (j.MemberExpression.check(parent) && parent.property === path.value && !parent.computed) return;
99
+ if (j.JSXMemberExpression?.check?.(parent) && parent.property === path.value) return;
100
+ if (j.JSXNamespacedName?.check?.(parent)) return;
101
+ if ((j.JSXOpeningElement?.check?.(parent) || j.JSXClosingElement?.check?.(parent)) && parent.name === path.value) return;
102
+ if (j.JSXAttribute.check(parent)) return;
103
+ if (j.ExportSpecifier.check(parent)) {
104
+ const grandparent = path.parent.parent?.value;
105
+ if (j.ExportNamedDeclaration.check(grandparent) && grandparent.source != null) return;
106
+ if (grandparent?.exportKind === "type" || parent.exportKind === "type") return;
107
+ if (parent.exported === path.value && parent.local !== path.value) return;
102
108
  }
109
+ if (!bindsToRenamedApi(path)) return;
110
+ referencePaths.push(path);
103
111
  });
112
+ for (const path of referencePaths) {
113
+ const parent = path.parent.value;
114
+ if ((j.Property.check(parent) || j.ObjectProperty.check(parent)) && parent.shorthand && parent.value === path.value) {
115
+ parent.shorthand = false;
116
+ parent.key = j.identifier("api");
117
+ parent.value = j.identifier("aui");
118
+ } else if (j.ExportSpecifier.check(parent) && parent.local === path.value) path.parent.replace(j.exportSpecifier.from({
119
+ local: j.identifier("aui"),
120
+ exported: j.Identifier.check(parent.exported) ? j.identifier(parent.exported.name) : parent.exported
121
+ }));
122
+ else path.value.name = "aui";
123
+ markAsChanged();
124
+ }
125
+ for (const idNode of renamedDeclaratorIds) {
126
+ idNode.name = "aui";
127
+ markAsChanged();
128
+ }
104
129
  }
105
130
  Object.entries(hookRenamingMap).forEach(([oldName, newName]) => {
106
131
  root.find(j.Identifier).forEach((path) => {
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-api-to-aui.js","names":[],"sources":["../../../src/codemods/v0-12/assistant-api-to-aui.ts"],"sourcesContent":["import { createTransformer } from \"../utils/createTransformer\";\n\n// Map of old hook names to new hook names\nconst hookRenamingMap: Record<string, string> = {\n useAssistantApi: \"useAui\",\n useAssistantState: \"useAuiState\",\n useAssistantEvent: \"useAuiEvent\",\n};\n\n// Map of old component names to new component names\nconst componentRenamingMap: Record<string, string> = {\n AssistantIf: \"AuiIf\",\n AssistantProvider: \"AuiProvider\",\n};\n\nconst isUseAuiCall = (j: any, node: any): boolean => {\n return (\n node &&\n j.CallExpression.check(node) &&\n j.Identifier.check(node.callee) &&\n (node.callee.name === \"useAui\" || node.callee.name === \"useAssistantApi\")\n );\n};\n\n// Check if a scope node directly contains an 'api' variable declaration\nconst scopeHasDirectApiDeclaration = (j: any, scopeNode: any): boolean => {\n // Get the body of the scope\n let body = null;\n if (\n j.FunctionDeclaration.check(scopeNode) ||\n j.FunctionExpression.check(scopeNode)\n ) {\n body = scopeNode.body?.body;\n } else if (j.ArrowFunctionExpression.check(scopeNode)) {\n // Arrow functions might have block or expression body\n if (j.BlockStatement.check(scopeNode.body)) {\n body = scopeNode.body.body;\n }\n } else if (j.BlockStatement.check(scopeNode)) {\n body = scopeNode.body;\n }\n\n if (!Array.isArray(body)) return false;\n\n // Check only direct statements in this scope's body\n for (const statement of body) {\n if (j.VariableDeclaration.check(statement)) {\n for (const declarator of statement.declarations) {\n if (j.Identifier.check(declarator.id) && declarator.id.name === \"api\") {\n // Don't count it as shadowing if it's from useAui\n if (!isUseAuiCall(j, declarator.init)) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n};\n\n// Check if a path is inside a scope that shadows the api variable\nconst isInsideShadowingScope = (j: any, identifierPath: any): boolean => {\n let currentPath = identifierPath.parent;\n\n while (currentPath) {\n const node = currentPath.value;\n\n // Check if this is a scope-creating node (function, arrow function, block)\n if (\n j.FunctionDeclaration.check(node) ||\n j.FunctionExpression.check(node) ||\n j.ArrowFunctionExpression.check(node) ||\n j.BlockStatement.check(node)\n ) {\n if (scopeHasDirectApiDeclaration(j, node)) {\n return true;\n }\n }\n\n currentPath = currentPath.parent;\n }\n\n return false;\n};\n\nconst migrateAssistantApiToAui = createTransformer(\n ({ j, root, markAsChanged }) => {\n let hasApiFromUseAui = false;\n\n // 1. Update imports\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n\n // Only process imports from @assistant-ui packages\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n path.value.specifiers?.forEach((specifier: any) => {\n if (j.ImportSpecifier.check(specifier)) {\n const oldName = specifier.imported.name as string;\n\n // Rename hooks\n if (hookRenamingMap[oldName]) {\n const newName = hookRenamingMap[oldName];\n specifier.imported.name = newName;\n if (specifier.local && specifier.local.name === oldName) {\n specifier.local.name = newName;\n }\n markAsChanged();\n }\n\n // Rename components\n if (componentRenamingMap[oldName]) {\n const newName = componentRenamingMap[oldName];\n specifier.imported.name = newName;\n if (specifier.local && specifier.local.name === oldName) {\n specifier.local.name = newName;\n }\n markAsChanged();\n }\n }\n });\n }\n });\n\n // 2. Find and rename variable declarations from useAui (or useAssistantApi)\n root.find(j.VariableDeclarator).forEach((path: any) => {\n const init = path.value.init;\n\n // Check if this is a call to useAui or useAssistantApi\n if (isUseAuiCall(j, init)) {\n if (j.Identifier.check(path.value.id)) {\n const oldVarName = path.value.id.name;\n\n // Only rename if it's called 'api'\n if (oldVarName === \"api\") {\n path.value.id.name = \"aui\";\n hasApiFromUseAui = true;\n markAsChanged();\n }\n }\n }\n });\n\n // 3. Rename all references to 'api' if we found it from useAui\n if (hasApiFromUseAui) {\n root.find(j.Identifier).forEach((path: any) => {\n if (path.value.name === \"api\") {\n // Skip if this is part of an import\n if (j.ImportSpecifier.check(path.parent.value)) {\n return;\n }\n\n // Skip if this is a variable declarator id\n if (j.VariableDeclarator.check(path.parent.value)) {\n const declarator = path.parent.value;\n if (declarator.id === path.value) {\n return;\n }\n }\n\n // Skip if this is a property key in an object (e.g., { api: true })\n if (j.Property.check(path.parent.value)) {\n const prop = path.parent.value;\n if (prop.key === path.value && !prop.shorthand && !prop.computed) {\n return;\n }\n }\n\n if (j.ObjectProperty.check(path.parent.value)) {\n const prop = path.parent.value;\n if (prop.key === path.value && !prop.shorthand && !prop.computed) {\n return;\n }\n }\n\n // Skip if this is a property in a member expression (e.g., foo.api)\n if (\n j.MemberExpression.check(path.parent.value) &&\n path.parent.value.property === path.value &&\n !path.parent.value.computed\n ) {\n return;\n }\n\n // Skip if this is a JSX attribute name\n if (j.JSXAttribute.check(path.parent.value)) {\n return;\n }\n\n // Skip if this identifier is inside a scope that shadows the api variable\n if (isInsideShadowingScope(j, path)) {\n return;\n }\n\n // Update the reference\n path.value.name = \"aui\";\n markAsChanged();\n }\n });\n\n // Also handle JSX identifiers\n root.find(j.JSXIdentifier).forEach((path: any) => {\n if (path.value.name === \"api\") {\n if (!isInsideShadowingScope(j, path)) {\n path.value.name = \"aui\";\n markAsChanged();\n }\n }\n });\n }\n\n // 4. Update hook call references (in case they're used as values)\n Object.entries(hookRenamingMap).forEach(([oldName, newName]) => {\n root.find(j.Identifier).forEach((path: any) => {\n if (path.value.name === oldName) {\n // Skip if already handled in imports\n if (j.ImportSpecifier.check(path.parent.value)) {\n return;\n }\n\n // This might be a reference to the hook as a value\n path.value.name = newName;\n markAsChanged();\n }\n });\n });\n\n // 5. Update JSX component names\n Object.entries(componentRenamingMap).forEach(([oldName, newName]) => {\n // Update JSX opening elements\n root.find(j.JSXOpeningElement).forEach((path: any) => {\n if (\n j.JSXIdentifier.check(path.value.name) &&\n path.value.name.name === oldName\n ) {\n path.value.name.name = newName;\n markAsChanged();\n }\n });\n\n // Update JSX closing elements\n root.find(j.JSXClosingElement).forEach((path: any) => {\n if (\n j.JSXIdentifier.check(path.value.name) &&\n path.value.name.name === oldName\n ) {\n path.value.name.name = newName;\n markAsChanged();\n }\n });\n\n // Update regular identifier references (for component references)\n root.find(j.Identifier).forEach((path: any) => {\n if (path.value.name === oldName) {\n // Skip if already handled in imports\n if (j.ImportSpecifier.check(path.parent.value)) {\n return;\n }\n\n // Skip JSX identifiers (already handled above)\n if (j.JSXIdentifier.check(path.value)) {\n return;\n }\n\n // This might be a reference to the component as a value\n path.value.name = newName;\n markAsChanged();\n }\n });\n });\n },\n);\n\nexport default migrateAssistantApiToAui;\n"],"mappings":"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"}
1
+ {"version":3,"file":"assistant-api-to-aui.js","names":[],"sources":["../../../src/codemods/v0-12/assistant-api-to-aui.ts"],"sourcesContent":["import { createTransformer } from \"../utils/createTransformer\";\n\n// Map of old hook names to new hook names\nconst hookRenamingMap: Record<string, string> = {\n useAssistantApi: \"useAui\",\n useAssistantState: \"useAuiState\",\n useAssistantEvent: \"useAuiEvent\",\n};\n\n// Map of old component names to new component names\nconst componentRenamingMap: Record<string, string> = {\n AssistantIf: \"AuiIf\",\n AssistantProvider: \"AuiProvider\",\n};\n\nconst isUseAuiCall = (j: any, node: any): boolean => {\n return (\n node &&\n j.CallExpression.check(node) &&\n j.Identifier.check(node.callee) &&\n (node.callee.name === \"useAui\" || node.callee.name === \"useAssistantApi\")\n );\n};\n\nconst migrateAssistantApiToAui = createTransformer(\n ({ j, root, markAsChanged }) => {\n // 1. Update imports\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n\n // Only process imports from @assistant-ui packages\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n path.value.specifiers?.forEach((specifier: any) => {\n if (j.ImportSpecifier.check(specifier)) {\n const oldName = specifier.imported.name as string;\n\n // Rename hooks\n if (hookRenamingMap[oldName]) {\n const newName = hookRenamingMap[oldName];\n specifier.imported.name = newName;\n if (specifier.local && specifier.local.name === oldName) {\n specifier.local.name = newName;\n }\n markAsChanged();\n }\n\n // Rename components\n if (componentRenamingMap[oldName]) {\n const newName = componentRenamingMap[oldName];\n specifier.imported.name = newName;\n if (specifier.local && specifier.local.name === oldName) {\n specifier.local.name = newName;\n }\n markAsChanged();\n }\n }\n });\n }\n });\n\n // 2. Collect `api` declarators initialized from useAui / useAssistantApi.\n // References are renamed by binding resolution, so an `api` bound\n // elsewhere (function params, `const { api } = other()`) is never touched.\n const renamedDeclaratorIds = new Set<any>();\n root.find(j.VariableDeclarator).forEach((path: any) => {\n if (\n isUseAuiCall(j, path.value.init) &&\n j.Identifier.check(path.value.id) &&\n path.value.id.name === \"api\"\n ) {\n renamedDeclaratorIds.add(path.value.id);\n }\n });\n\n // 3. Rename references governed by one of those declarators. Resolution\n // is lexical (nearest enclosing declaration wins) rather than via\n // ast-types scopes, which have no block granularity: a block-scoped\n // `const api = other()` inside the same function must shadow.\n if (renamedDeclaratorIds.size > 0) {\n const patternBindsApi = (id: any): boolean => {\n if (\n id &&\n (id.type === \"TSParameterProperty\" ||\n j.TSParameterProperty?.check?.(id))\n ) {\n return patternBindsApi(id.parameter);\n }\n if (j.Identifier.check(id)) return id.name === \"api\";\n if (j.ObjectPattern.check(id)) {\n return id.properties.some((prop: any) =>\n patternBindsApi(prop.value ?? prop.argument ?? prop),\n );\n }\n if (j.ArrayPattern.check(id)) {\n return id.elements.some((el: any) => el && patternBindsApi(el));\n }\n if (j.AssignmentPattern.check(id)) return patternBindsApi(id.left);\n if (j.RestElement.check(id)) return patternBindsApi(id.argument);\n return false;\n };\n\n // What a statement-level node declares for `api`: the declarator id\n // node when it is a plain `const/let/var api = ...`, \"foreign\" for any\n // other binding of the name (patterns, functions, classes, enums), or\n // undefined when it does not bind `api` at all.\n const declaredApi = (statement: any): any => {\n if (!statement) return undefined;\n if (\n j.ExportNamedDeclaration.check(statement) ||\n j.ExportDefaultDeclaration.check(statement)\n ) {\n return declaredApi(statement.declaration);\n }\n if (j.VariableDeclaration.check(statement)) {\n for (const declarator of statement.declarations) {\n if (\n j.Identifier.check(declarator.id) &&\n declarator.id.name === \"api\"\n )\n return declarator.id;\n if (patternBindsApi(declarator.id)) return \"foreign\";\n }\n return undefined;\n }\n // Type-only declarations do not shadow the value binding.\n if (\n statement.type === \"TSTypeAliasDeclaration\" ||\n statement.type === \"TSInterfaceDeclaration\" ||\n statement.type === \"TSDeclareFunction\"\n )\n return undefined;\n // FunctionDeclaration, ClassDeclaration, TS enums/namespaces, …\n if (\n statement.id &&\n j.Identifier.check(statement.id) &&\n statement.id.name === \"api\"\n )\n return \"foreign\";\n return undefined;\n };\n\n const scanStatements = (statements: any[]): any => {\n for (const statement of statements) {\n const found = declaredApi(statement);\n if (found !== undefined) return found;\n }\n return undefined;\n };\n\n // Returns the declarator id node governing `api` here, or \"foreign\"\n // when any other binding of the name shadows it first.\n const governingApiBinding = (path: any): any => {\n let current = path.parent;\n while (current) {\n const node = current.value;\n\n // Anything function-like (declarations, expressions, arrows,\n // object/class methods) binds its params.\n if (Array.isArray(node.params) && node.params.some(patternBindsApi))\n return \"foreign\";\n // A named function/class expression binds its own name in its body.\n if (\n (j.FunctionExpression.check(node) ||\n j.ClassExpression.check(node)) &&\n node.id?.name === \"api\"\n )\n return \"foreign\";\n if (\n j.CatchClause.check(node) &&\n node.param &&\n patternBindsApi(node.param)\n )\n return \"foreign\";\n\n let found: any;\n if (j.BlockStatement.check(node) || j.Program.check(node)) {\n found = scanStatements(node.body);\n } else if (j.ForStatement.check(node)) {\n found = declaredApi(node.init);\n } else if (\n j.ForOfStatement.check(node) ||\n j.ForInStatement.check(node)\n ) {\n found = declaredApi(node.left);\n } else if (j.SwitchStatement.check(node)) {\n found = scanStatements(\n node.cases.flatMap((c: any) => c.consequent),\n );\n } else if (j.StaticBlock?.check?.(node)) {\n found = scanStatements(node.body);\n }\n if (found !== undefined) return found;\n\n current = current.parent;\n }\n return undefined;\n };\n\n const bindsToRenamedApi = (path: any): boolean => {\n const governing = governingApiBinding(path);\n return governing !== \"foreign\" && renamedDeclaratorIds.has(governing);\n };\n\n const referencePaths: any[] = [];\n root.find(j.Identifier, { name: \"api\" }).forEach((path: any) => {\n const parent = path.parent.value;\n if (j.ImportSpecifier.check(parent)) return;\n // Declaration names (variable, function, class, type alias,\n // interface) and TS type positions are not value references.\n if (parent.id === path.value) return;\n if (j.TSTypeReference?.check?.(parent)) return;\n if (j.TSQualifiedName?.check?.(parent)) return;\n // Any non-computed key position is a name, not a reference: object\n // properties, object/class methods, class properties, TS signatures.\n // Esprima-style shorthand reuses one node as key and value, so the\n // value position must survive the guard.\n if (\n parent.key === path.value &&\n !parent.computed &&\n parent.value !== path.value\n )\n return;\n if (\n j.MemberExpression.check(parent) &&\n parent.property === path.value &&\n !parent.computed\n )\n return;\n // JSXIdentifier extends Identifier, so JSX positions land here too:\n // member properties (<config.api/>), namespace names, and lowercase\n // element names (<api/> is an intrinsic tag) are not references.\n if (\n j.JSXMemberExpression?.check?.(parent) &&\n parent.property === path.value\n )\n return;\n if (j.JSXNamespacedName?.check?.(parent)) return;\n if (\n (j.JSXOpeningElement?.check?.(parent) ||\n j.JSXClosingElement?.check?.(parent)) &&\n parent.name === path.value\n )\n return;\n if (j.JSXAttribute.check(parent)) return;\n // The exported name of `export { api }` is the public alias, not a\n // reference; only the local side is renamed (to `aui as api`). A\n // source-bearing re-export binds in the other module, never here.\n if (j.ExportSpecifier.check(parent)) {\n const grandparent = path.parent.parent?.value;\n if (\n j.ExportNamedDeclaration.check(grandparent) &&\n grandparent.source != null\n )\n return;\n if (\n grandparent?.exportKind === \"type\" ||\n parent.exportKind === \"type\"\n )\n return;\n if (parent.exported === path.value && parent.local !== path.value)\n return;\n }\n if (!bindsToRenamedApi(path)) return;\n referencePaths.push(path);\n });\n\n for (const path of referencePaths) {\n const parent = path.parent.value;\n if (\n (j.Property.check(parent) || j.ObjectProperty.check(parent)) &&\n parent.shorthand &&\n parent.value === path.value\n ) {\n // `{ api }` in an object literal: keep the key, rename the value\n parent.shorthand = false;\n parent.key = j.identifier(\"api\");\n parent.value = j.identifier(\"aui\");\n } else if (\n j.ExportSpecifier.check(parent) &&\n parent.local === path.value\n ) {\n // `export { api }` / `export { api as name }`: rename the local\n // binding, keep the public name. Replaced wholesale — recast keeps\n // the shorthand form (dropping the alias) when only the fields of\n // the original node change.\n path.parent.replace(\n j.exportSpecifier.from({\n local: j.identifier(\"aui\"),\n exported: j.Identifier.check(parent.exported)\n ? j.identifier(parent.exported.name)\n : parent.exported,\n }),\n );\n } else {\n path.value.name = \"aui\";\n }\n markAsChanged();\n }\n for (const idNode of renamedDeclaratorIds) {\n idNode.name = \"aui\";\n markAsChanged();\n }\n }\n\n // 4. Update hook call references (in case they're used as values)\n Object.entries(hookRenamingMap).forEach(([oldName, newName]) => {\n root.find(j.Identifier).forEach((path: any) => {\n if (path.value.name === oldName) {\n // Skip if already handled in imports\n if (j.ImportSpecifier.check(path.parent.value)) {\n return;\n }\n\n // This might be a reference to the hook as a value\n path.value.name = newName;\n markAsChanged();\n }\n });\n });\n\n // 5. Update JSX component names\n Object.entries(componentRenamingMap).forEach(([oldName, newName]) => {\n // Update JSX opening elements\n root.find(j.JSXOpeningElement).forEach((path: any) => {\n if (\n j.JSXIdentifier.check(path.value.name) &&\n path.value.name.name === oldName\n ) {\n path.value.name.name = newName;\n markAsChanged();\n }\n });\n\n // Update JSX closing elements\n root.find(j.JSXClosingElement).forEach((path: any) => {\n if (\n j.JSXIdentifier.check(path.value.name) &&\n path.value.name.name === oldName\n ) {\n path.value.name.name = newName;\n markAsChanged();\n }\n });\n\n // Update regular identifier references (for component references)\n root.find(j.Identifier).forEach((path: any) => {\n if (path.value.name === oldName) {\n // Skip if already handled in imports\n if (j.ImportSpecifier.check(path.parent.value)) {\n return;\n }\n\n // Skip JSX identifiers (already handled above)\n if (j.JSXIdentifier.check(path.value)) {\n return;\n }\n\n // This might be a reference to the component as a value\n path.value.name = newName;\n markAsChanged();\n }\n });\n });\n },\n);\n\nexport default migrateAssistantApiToAui;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-if-to-aui-if.d.ts","names":[],"sources":["../../../src/codemods/v0-12/primitive-if-to-aui-if.ts"],"mappings":";cAmKM,4BAAyB,yCAAA,UAAA,oCAAA,KAAA"}
1
+ {"version":3,"file":"primitive-if-to-aui-if.d.ts","names":[],"sources":["../../../src/codemods/v0-12/primitive-if-to-aui-if.ts"],"mappings":";cA2KM,4BAAyB,yCAAA,UAAA,oCAAA,KAAA"}
@@ -82,26 +82,29 @@ const primitiveMap = {
82
82
  }
83
83
  };
84
84
  const fixedConditionMap = { ThreadPrimitive: { Empty: "s.thread.isEmpty" } };
85
+ const UNSUPPORTED_VALUE = Symbol("unsupported");
85
86
  /**
86
87
  * Extract the value of a JSX attribute.
87
88
  * - Boolean prop (no value): `<X.If user>` → `true`
88
89
  * - `{true}` / `{false}`: → `true` / `false`
89
90
  * - `{"positive"}`: → `"positive"`
90
91
  * - `{null}`: → `null`
92
+ * - anything else (dynamic expressions): → UNSUPPORTED_VALUE
91
93
  */
92
94
  const getAttrValue = (j, attr) => {
93
95
  if (attr.value === null || attr.value === void 0) return true;
94
96
  if (j.JSXExpressionContainer.check(attr.value)) {
95
97
  const expr = attr.value.expression;
96
98
  if (j.BooleanLiteral.check(expr)) return expr.value;
99
+ if (j.NullLiteral.check(expr)) return null;
97
100
  if (j.Literal.check(expr)) {
98
101
  if (expr.value === null) return null;
99
102
  return expr.value;
100
103
  }
101
- if (j.NullLiteral.check(expr)) return null;
102
- if (j.Identifier.check(expr) && expr.name === "undefined") return void 0;
104
+ return UNSUPPORTED_VALUE;
103
105
  }
104
106
  if (j.StringLiteral.check(attr.value) || j.Literal.check(attr.value)) return attr.value.value;
107
+ return UNSUPPORTED_VALUE;
105
108
  };
106
109
  const buildConditionString = (fragments) => {
107
110
  const parts = fragments.map((f) => f.negated ? `!${f.expression}` : f.expression);
@@ -121,39 +124,30 @@ const migratePrimitiveIfToAuiIf = createTransformer(({ j, root, markAsChanged })
121
124
  });
122
125
  });
123
126
  if (importedPrimitives.size === 0) return;
124
- root.find(j.JSXOpeningElement).forEach((path) => {
125
- const name = path.value.name;
126
- if (!j.JSXMemberExpression.check(name)) return;
127
- if (!j.JSXIdentifier.check(name.object)) return;
128
- if (!j.JSXIdentifier.check(name.property)) return;
129
- const primitiveName = name.object.name;
130
- const propertyName = name.property.name;
131
- const fixedMap = fixedConditionMap[primitiveName];
132
- if (!fixedMap) return;
133
- const conditionBody = fixedMap[propertyName];
134
- if (!conditionBody) return;
135
- if (!importedPrimitives.has(primitiveName)) return;
136
- if ((path.value.attributes || []).length > 0) return;
127
+ const convertElementToAuiIf = (elementPath, conditionBody) => {
137
128
  const arrowFnAst = j(`(s) => ${conditionBody}`).find(j.ArrowFunctionExpression).paths()[0].value;
138
- path.value.name = j.jsxIdentifier("AuiIf");
139
- path.value.attributes = [j.jsxAttribute(j.jsxIdentifier("condition"), j.jsxExpressionContainer(arrowFnAst))];
129
+ const opening = elementPath.value.openingElement;
130
+ opening.name = j.jsxIdentifier("AuiIf");
131
+ opening.attributes = [j.jsxAttribute(j.jsxIdentifier("condition"), j.jsxExpressionContainer(arrowFnAst))];
132
+ if (elementPath.value.closingElement) elementPath.value.closingElement.name = j.jsxIdentifier("AuiIf");
140
133
  needsAuiIfImport = true;
141
134
  markAsChanged();
142
- });
143
- root.find(j.JSXClosingElement).forEach((path) => {
144
- const name = path.value.name;
135
+ };
136
+ root.find(j.JSXElement).forEach((path) => {
137
+ const name = path.value.openingElement.name;
145
138
  if (!j.JSXMemberExpression.check(name)) return;
146
139
  if (!j.JSXIdentifier.check(name.object)) return;
147
140
  if (!j.JSXIdentifier.check(name.property)) return;
148
141
  const primitiveName = name.object.name;
149
142
  const propertyName = name.property.name;
150
- if (!fixedConditionMap[primitiveName]?.[propertyName]) return;
143
+ const conditionBody = fixedConditionMap[primitiveName]?.[propertyName];
144
+ if (!conditionBody) return;
151
145
  if (!importedPrimitives.has(primitiveName)) return;
152
- path.value.name = j.jsxIdentifier("AuiIf");
153
- markAsChanged();
146
+ if ((path.value.openingElement.attributes || []).length > 0) return;
147
+ convertElementToAuiIf(path, conditionBody);
154
148
  });
155
- root.find(j.JSXOpeningElement).forEach((path) => {
156
- const name = path.value.name;
149
+ root.find(j.JSXElement).forEach((path) => {
150
+ const name = path.value.openingElement.name;
157
151
  if (!j.JSXMemberExpression.check(name)) return;
158
152
  if (!j.JSXIdentifier.check(name.object)) return;
159
153
  if (!j.JSXIdentifier.check(name.property)) return;
@@ -162,7 +156,7 @@ const migratePrimitiveIfToAuiIf = createTransformer(({ j, root, markAsChanged })
162
156
  const propMap = primitiveMap[primitiveName];
163
157
  if (!propMap) return;
164
158
  if (!importedPrimitives.has(primitiveName)) return;
165
- const attrs = path.value.attributes || [];
159
+ const attrs = path.value.openingElement.attributes || [];
166
160
  const fragments = [];
167
161
  let hasUnknownProp = false;
168
162
  for (const attr of attrs) {
@@ -171,33 +165,25 @@ const migratePrimitiveIfToAuiIf = createTransformer(({ j, root, markAsChanged })
171
165
  continue;
172
166
  }
173
167
  const propName = typeof attr.name.name === "string" ? attr.name.name : null;
174
- if (!propName) continue;
168
+ if (!propName) {
169
+ hasUnknownProp = true;
170
+ continue;
171
+ }
175
172
  const mapper = propMap[propName];
176
173
  if (!mapper) {
177
174
  hasUnknownProp = true;
178
175
  continue;
179
176
  }
180
- const fragment = mapper(getAttrValue(j, attr));
177
+ const value = getAttrValue(j, attr);
178
+ if (value === UNSUPPORTED_VALUE) {
179
+ hasUnknownProp = true;
180
+ continue;
181
+ }
182
+ const fragment = mapper(value);
181
183
  if (fragment) fragments.push(fragment);
182
184
  }
183
185
  if (hasUnknownProp || fragments.length === 0) return;
184
- const arrowFnAst = j(`(s) => ${buildConditionString(fragments)}`).find(j.ArrowFunctionExpression).paths()[0].value;
185
- path.value.name = j.jsxIdentifier("AuiIf");
186
- path.value.attributes = [j.jsxAttribute(j.jsxIdentifier("condition"), j.jsxExpressionContainer(arrowFnAst))];
187
- needsAuiIfImport = true;
188
- markAsChanged();
189
- });
190
- root.find(j.JSXClosingElement).forEach((path) => {
191
- const name = path.value.name;
192
- if (!j.JSXMemberExpression.check(name)) return;
193
- if (!j.JSXIdentifier.check(name.object)) return;
194
- if (!j.JSXIdentifier.check(name.property)) return;
195
- if (name.property.name !== "If") return;
196
- const primitiveName = name.object.name;
197
- if (!primitiveMap[primitiveName]) return;
198
- if (!importedPrimitives.has(primitiveName)) return;
199
- path.value.name = j.jsxIdentifier("AuiIf");
200
- markAsChanged();
186
+ convertElementToAuiIf(path, buildConditionString(fragments));
201
187
  });
202
188
  if (needsAuiIfImport) {
203
189
  let hasAuiIfImport = false;
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-if-to-aui-if.js","names":[],"sources":["../../../src/codemods/v0-12/primitive-if-to-aui-if.ts"],"sourcesContent":["import { createTransformer } from \"../utils/createTransformer\";\n\ntype ConditionFragment = {\n expression: string;\n negated: boolean;\n};\n\n// Map ThreadPrimitive.If props to condition expressions\nconst threadPropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n empty: (v) => ({\n expression: \"s.thread.isEmpty\",\n negated: v === false,\n }),\n running: (v) => ({\n expression: \"s.thread.isRunning\",\n negated: v === false,\n }),\n disabled: (v) => ({\n expression: \"s.thread.isDisabled\",\n negated: v === false,\n }),\n};\n\n// Map MessagePrimitive.If props to condition expressions\nconst messagePropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n user: () => ({ expression: 's.message.role === \"user\"', negated: false }),\n assistant: () => ({\n expression: 's.message.role === \"assistant\"',\n negated: false,\n }),\n system: () => ({\n expression: 's.message.role === \"system\"',\n negated: false,\n }),\n hasBranches: () => ({\n expression: \"s.message.branchCount >= 2\",\n negated: false,\n }),\n copied: (v) => ({\n expression: \"s.message.isCopied\",\n negated: v === false,\n }),\n last: (v) => ({\n expression: \"s.message.isLast\",\n negated: v === false,\n }),\n lastOrHover: () => ({\n expression: \"s.message.isHovering || s.message.isLast\",\n negated: false,\n }),\n speaking: (v) => ({\n expression: \"s.message.speech != null\",\n negated: v === false,\n }),\n hasAttachments: (v) =>\n v === true\n ? {\n expression:\n 's.message.role === \"user\" && !!s.message.attachments?.length',\n negated: false,\n }\n : {\n expression:\n 's.message.role !== \"user\" || !s.message.attachments?.length',\n negated: false,\n },\n hasContent: (v) => ({\n expression: \"s.message.parts.length > 0\",\n negated: v === false,\n }),\n submittedFeedback: (v) => {\n if (v === null) {\n return {\n expression:\n \"(s.message.metadata.submittedFeedback?.type ?? null) === null\",\n negated: false,\n };\n }\n return {\n expression: `s.message.metadata.submittedFeedback?.type === \"${v}\"`,\n negated: false,\n };\n },\n};\n\n// Map ComposerPrimitive.If props to condition expressions\nconst composerPropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n editing: (v) => ({\n expression: \"s.composer.isEditing\",\n negated: v === false,\n }),\n dictation: (v) => ({\n expression: \"s.composer.dictation != null\",\n negated: v === false,\n }),\n};\n\nconst primitiveMap: Record<\n string,\n Record<string, (value: unknown) => ConditionFragment | null>\n> = {\n ThreadPrimitive: threadPropMap,\n MessagePrimitive: messagePropMap,\n ComposerPrimitive: composerPropMap,\n};\n\n// Map of XPrimitive.Component → fixed condition (no props needed)\nconst fixedConditionMap: Record<string, Record<string, string>> = {\n ThreadPrimitive: {\n Empty: \"s.thread.isEmpty\",\n },\n};\n\n/**\n * Extract the value of a JSX attribute.\n * - Boolean prop (no value): `<X.If user>` → `true`\n * - `{true}` / `{false}`: → `true` / `false`\n * - `{\"positive\"}`: → `\"positive\"`\n * - `{null}`: → `null`\n */\nconst getAttrValue = (j: any, attr: any): unknown => {\n // Boolean attribute (no value), e.g. `<X.If user>`\n if (attr.value === null || attr.value === undefined) {\n return true;\n }\n\n // JSX expression container: `{true}`, `{false}`, `{\"positive\"}`, `{null}`\n if (j.JSXExpressionContainer.check(attr.value)) {\n const expr = attr.value.expression;\n if (j.BooleanLiteral.check(expr)) return expr.value;\n if (j.Literal.check(expr)) {\n if (expr.value === null) return null;\n return expr.value;\n }\n if (j.NullLiteral.check(expr)) return null;\n if (j.Identifier.check(expr) && expr.name === \"undefined\") return undefined;\n }\n\n // String literal\n if (j.StringLiteral.check(attr.value) || j.Literal.check(attr.value)) {\n return attr.value.value;\n }\n\n return undefined;\n};\n\nconst buildConditionString = (fragments: ConditionFragment[]): string => {\n const parts = fragments.map((f) =>\n f.negated ? `!${f.expression}` : f.expression,\n );\n if (parts.length === 1) return parts[0]!;\n return parts.join(\" && \");\n};\n\nconst migratePrimitiveIfToAuiIf = createTransformer(\n ({ j, root, markAsChanged }) => {\n let needsAuiIfImport = false;\n\n // Track which primitive namespaces are imported\n const importedPrimitives = new Set<string>();\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n path.value.specifiers?.forEach((specifier: any) => {\n if (j.ImportSpecifier.check(specifier)) {\n const name = String(\n specifier.local?.name ?? specifier.imported.name,\n );\n if (primitiveMap[name] || fixedConditionMap[name]) {\n importedPrimitives.add(name);\n }\n }\n });\n }\n });\n\n if (importedPrimitives.size === 0) return;\n\n // Process fixed-condition components: <ThreadPrimitive.Empty> → <AuiIf condition={...}>\n root.find(j.JSXOpeningElement).forEach((path: any) => {\n const name = path.value.name;\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n\n const primitiveName = name.object.name as string;\n const propertyName = name.property.name as string;\n const fixedMap = fixedConditionMap[primitiveName];\n if (!fixedMap) return;\n const conditionBody = fixedMap[propertyName];\n if (!conditionBody) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n // Only transform if there are no props (other than children, which are implicit)\n const attrs: any[] = path.value.attributes || [];\n if (attrs.length > 0) return;\n\n const arrowFnAst = j(`(s) => ${conditionBody}`)\n .find(j.ArrowFunctionExpression)\n .paths()[0]!.value;\n\n path.value.name = j.jsxIdentifier(\"AuiIf\");\n path.value.attributes = [\n j.jsxAttribute(\n j.jsxIdentifier(\"condition\"),\n j.jsxExpressionContainer(arrowFnAst),\n ),\n ];\n\n needsAuiIfImport = true;\n markAsChanged();\n });\n\n // Update closing elements for fixed-condition components\n root.find(j.JSXClosingElement).forEach((path: any) => {\n const name = path.value.name;\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n\n const primitiveName = name.object.name as string;\n const propertyName = name.property.name as string;\n const fixedMap = fixedConditionMap[primitiveName];\n if (!fixedMap?.[propertyName]) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n path.value.name = j.jsxIdentifier(\"AuiIf\");\n markAsChanged();\n });\n\n // Process JSX elements: <ThreadPrimitive.If ...> → <AuiIf condition={...}>\n root.find(j.JSXOpeningElement).forEach((path: any) => {\n const name = path.value.name;\n\n // Check for `<XPrimitive.If ...>`\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n if (name.property.name !== \"If\") return;\n\n const primitiveName = name.object.name;\n const propMap = primitiveMap[primitiveName];\n if (!propMap) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n // Extract props\n const attrs: any[] = path.value.attributes || [];\n const fragments: ConditionFragment[] = [];\n let hasUnknownProp = false;\n\n for (const attr of attrs) {\n if (!j.JSXAttribute.check(attr)) {\n // JSX spread attributes — can't migrate\n hasUnknownProp = true;\n continue;\n }\n const propName =\n typeof attr.name.name === \"string\" ? attr.name.name : null;\n if (!propName) continue;\n\n const mapper = propMap[propName];\n if (!mapper) {\n hasUnknownProp = true;\n continue;\n }\n\n const value = getAttrValue(j, attr);\n const fragment = mapper(value);\n if (fragment) {\n fragments.push(fragment);\n }\n }\n\n // If we couldn't map all props, skip this element\n if (hasUnknownProp || fragments.length === 0) return;\n\n const conditionBody = buildConditionString(fragments);\n\n // Parse the arrow function as an expression to get a proper AST node\n const arrowFnAst = j(`(s) => ${conditionBody}`)\n .find(j.ArrowFunctionExpression)\n .paths()[0]!.value;\n\n // Replace <XPrimitive.If ...> with <AuiIf condition={...}>\n path.value.name = j.jsxIdentifier(\"AuiIf\");\n\n // Replace all attributes with a single condition prop\n path.value.attributes = [\n j.jsxAttribute(\n j.jsxIdentifier(\"condition\"),\n j.jsxExpressionContainer(arrowFnAst),\n ),\n ];\n\n needsAuiIfImport = true;\n markAsChanged();\n });\n\n // Update closing elements to match\n root.find(j.JSXClosingElement).forEach((path: any) => {\n const name = path.value.name;\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n if (name.property.name !== \"If\") return;\n\n const primitiveName = name.object.name;\n if (!primitiveMap[primitiveName]) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n path.value.name = j.jsxIdentifier(\"AuiIf\");\n markAsChanged();\n });\n\n // Add AuiIf import if needed\n if (needsAuiIfImport) {\n let hasAuiIfImport = false;\n let assistantUiImport: any = null;\n\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n assistantUiImport = path;\n path.value.specifiers?.forEach((specifier: any) => {\n if (\n j.ImportSpecifier.check(specifier) &&\n (specifier.imported.name === \"AuiIf\" ||\n specifier.local?.name === \"AuiIf\")\n ) {\n hasAuiIfImport = true;\n }\n });\n }\n });\n\n if (!hasAuiIfImport && assistantUiImport) {\n assistantUiImport.value.specifiers.push(\n j.importSpecifier(j.identifier(\"AuiIf\")),\n );\n markAsChanged();\n }\n }\n },\n);\n\nexport default migratePrimitiveIfToAuiIf;\n"],"mappings":"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"}
1
+ {"version":3,"file":"primitive-if-to-aui-if.js","names":[],"sources":["../../../src/codemods/v0-12/primitive-if-to-aui-if.ts"],"sourcesContent":["import { createTransformer } from \"../utils/createTransformer\";\n\ntype ConditionFragment = {\n expression: string;\n negated: boolean;\n};\n\n// Map ThreadPrimitive.If props to condition expressions\nconst threadPropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n empty: (v) => ({\n expression: \"s.thread.isEmpty\",\n negated: v === false,\n }),\n running: (v) => ({\n expression: \"s.thread.isRunning\",\n negated: v === false,\n }),\n disabled: (v) => ({\n expression: \"s.thread.isDisabled\",\n negated: v === false,\n }),\n};\n\n// Map MessagePrimitive.If props to condition expressions\nconst messagePropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n user: () => ({ expression: 's.message.role === \"user\"', negated: false }),\n assistant: () => ({\n expression: 's.message.role === \"assistant\"',\n negated: false,\n }),\n system: () => ({\n expression: 's.message.role === \"system\"',\n negated: false,\n }),\n hasBranches: () => ({\n expression: \"s.message.branchCount >= 2\",\n negated: false,\n }),\n copied: (v) => ({\n expression: \"s.message.isCopied\",\n negated: v === false,\n }),\n last: (v) => ({\n expression: \"s.message.isLast\",\n negated: v === false,\n }),\n lastOrHover: () => ({\n expression: \"s.message.isHovering || s.message.isLast\",\n negated: false,\n }),\n speaking: (v) => ({\n expression: \"s.message.speech != null\",\n negated: v === false,\n }),\n hasAttachments: (v) =>\n v === true\n ? {\n expression:\n 's.message.role === \"user\" && !!s.message.attachments?.length',\n negated: false,\n }\n : {\n expression:\n 's.message.role !== \"user\" || !s.message.attachments?.length',\n negated: false,\n },\n hasContent: (v) => ({\n expression: \"s.message.parts.length > 0\",\n negated: v === false,\n }),\n submittedFeedback: (v) => {\n if (v === null) {\n return {\n expression:\n \"(s.message.metadata.submittedFeedback?.type ?? null) === null\",\n negated: false,\n };\n }\n return {\n expression: `s.message.metadata.submittedFeedback?.type === \"${v}\"`,\n negated: false,\n };\n },\n};\n\n// Map ComposerPrimitive.If props to condition expressions\nconst composerPropMap: Record<\n string,\n (value: unknown) => ConditionFragment | null\n> = {\n editing: (v) => ({\n expression: \"s.composer.isEditing\",\n negated: v === false,\n }),\n dictation: (v) => ({\n expression: \"s.composer.dictation != null\",\n negated: v === false,\n }),\n};\n\nconst primitiveMap: Record<\n string,\n Record<string, (value: unknown) => ConditionFragment | null>\n> = {\n ThreadPrimitive: threadPropMap,\n MessagePrimitive: messagePropMap,\n ComposerPrimitive: composerPropMap,\n};\n\n// Map of XPrimitive.Component → fixed condition (no props needed)\nconst fixedConditionMap: Record<string, Record<string, string>> = {\n ThreadPrimitive: {\n Empty: \"s.thread.isEmpty\",\n },\n};\n\n// A prop value the maps cannot faithfully express as a static condition\n// (dynamic expressions, `{undefined}`); elements carrying one are skipped\n// so runtime behavior is never silently changed.\nconst UNSUPPORTED_VALUE: unique symbol = Symbol(\"unsupported\");\n\n/**\n * Extract the value of a JSX attribute.\n * - Boolean prop (no value): `<X.If user>` → `true`\n * - `{true}` / `{false}`: → `true` / `false`\n * - `{\"positive\"}`: → `\"positive\"`\n * - `{null}`: → `null`\n * - anything else (dynamic expressions): → UNSUPPORTED_VALUE\n */\nconst getAttrValue = (j: any, attr: any): unknown => {\n // Boolean attribute (no value), e.g. `<X.If user>`\n if (attr.value === null || attr.value === undefined) {\n return true;\n }\n\n // JSX expression container: `{true}`, `{false}`, `{\"positive\"}`, `{null}`\n if (j.JSXExpressionContainer.check(attr.value)) {\n const expr = attr.value.expression;\n if (j.BooleanLiteral.check(expr)) return expr.value;\n // NullLiteral bases Literal in ast-types but carries no `value` field,\n // so it must be recognized before the generic Literal branch.\n if (j.NullLiteral.check(expr)) return null;\n if (j.Literal.check(expr)) {\n if (expr.value === null) return null;\n return expr.value;\n }\n return UNSUPPORTED_VALUE;\n }\n\n // String literal\n if (j.StringLiteral.check(attr.value) || j.Literal.check(attr.value)) {\n return attr.value.value;\n }\n\n return UNSUPPORTED_VALUE;\n};\n\nconst buildConditionString = (fragments: ConditionFragment[]): string => {\n const parts = fragments.map((f) =>\n f.negated ? `!${f.expression}` : f.expression,\n );\n if (parts.length === 1) return parts[0]!;\n return parts.join(\" && \");\n};\n\nconst migratePrimitiveIfToAuiIf = createTransformer(\n ({ j, root, markAsChanged }) => {\n let needsAuiIfImport = false;\n\n // Track which primitive namespaces are imported\n const importedPrimitives = new Set<string>();\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n path.value.specifiers?.forEach((specifier: any) => {\n if (j.ImportSpecifier.check(specifier)) {\n const name = String(\n specifier.local?.name ?? specifier.imported.name,\n );\n if (primitiveMap[name] || fixedConditionMap[name]) {\n importedPrimitives.add(name);\n }\n }\n });\n }\n });\n\n if (importedPrimitives.size === 0) return;\n\n // Opening and closing tags are rewritten together per element, so a\n // skipped element can never be left with a mismatched closing tag.\n const convertElementToAuiIf = (elementPath: any, conditionBody: string) => {\n const arrowFnAst = j(`(s) => ${conditionBody}`)\n .find(j.ArrowFunctionExpression)\n .paths()[0]!.value;\n\n const opening = elementPath.value.openingElement;\n opening.name = j.jsxIdentifier(\"AuiIf\");\n opening.attributes = [\n j.jsxAttribute(\n j.jsxIdentifier(\"condition\"),\n j.jsxExpressionContainer(arrowFnAst),\n ),\n ];\n if (elementPath.value.closingElement) {\n elementPath.value.closingElement.name = j.jsxIdentifier(\"AuiIf\");\n }\n\n needsAuiIfImport = true;\n markAsChanged();\n };\n\n // Process fixed-condition components: <ThreadPrimitive.Empty> → <AuiIf condition={...}>\n root.find(j.JSXElement).forEach((path: any) => {\n const name = path.value.openingElement.name;\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n\n const primitiveName = name.object.name as string;\n const propertyName = name.property.name as string;\n const conditionBody = fixedConditionMap[primitiveName]?.[propertyName];\n if (!conditionBody) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n // Only transform if there are no props (other than children, which are implicit)\n const attrs: any[] = path.value.openingElement.attributes || [];\n if (attrs.length > 0) return;\n\n convertElementToAuiIf(path, conditionBody);\n });\n\n // Process JSX elements: <ThreadPrimitive.If ...> → <AuiIf condition={...}>\n root.find(j.JSXElement).forEach((path: any) => {\n const name = path.value.openingElement.name;\n\n // Check for `<XPrimitive.If ...>`\n if (!j.JSXMemberExpression.check(name)) return;\n if (!j.JSXIdentifier.check(name.object)) return;\n if (!j.JSXIdentifier.check(name.property)) return;\n if (name.property.name !== \"If\") return;\n\n const primitiveName = name.object.name;\n const propMap = primitiveMap[primitiveName];\n if (!propMap) return;\n if (!importedPrimitives.has(primitiveName)) return;\n\n // Extract props\n const attrs: any[] = path.value.openingElement.attributes || [];\n const fragments: ConditionFragment[] = [];\n let hasUnknownProp = false;\n\n for (const attr of attrs) {\n if (!j.JSXAttribute.check(attr)) {\n // JSX spread attributes — can't migrate\n hasUnknownProp = true;\n continue;\n }\n const propName =\n typeof attr.name.name === \"string\" ? attr.name.name : null;\n if (!propName) {\n // e.g. JSXNamespacedName — not expressible as a condition\n hasUnknownProp = true;\n continue;\n }\n\n const mapper = propMap[propName];\n if (!mapper) {\n hasUnknownProp = true;\n continue;\n }\n\n const value = getAttrValue(j, attr);\n if (value === UNSUPPORTED_VALUE) {\n hasUnknownProp = true;\n continue;\n }\n const fragment = mapper(value);\n if (fragment) {\n fragments.push(fragment);\n }\n }\n\n // If we couldn't map all props, skip this element\n if (hasUnknownProp || fragments.length === 0) return;\n\n convertElementToAuiIf(path, buildConditionString(fragments));\n });\n\n // Add AuiIf import if needed\n if (needsAuiIfImport) {\n let hasAuiIfImport = false;\n let assistantUiImport: any = null;\n\n root.find(j.ImportDeclaration).forEach((path: any) => {\n const source = path.value.source.value;\n if (typeof source === \"string\" && source.startsWith(\"@assistant-ui/\")) {\n assistantUiImport = path;\n path.value.specifiers?.forEach((specifier: any) => {\n if (\n j.ImportSpecifier.check(specifier) &&\n (specifier.imported.name === \"AuiIf\" ||\n specifier.local?.name === \"AuiIf\")\n ) {\n hasAuiIfImport = true;\n }\n });\n }\n });\n\n if (!hasAuiIfImport && assistantUiImport) {\n assistantUiImport.value.specifiers.push(\n j.importSpecifier(j.identifier(\"AuiIf\")),\n );\n markAsChanged();\n }\n }\n },\n);\n\nexport default migratePrimitiveIfToAuiIf;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { PackageManagerName } from "../lib/create-project.js";
1
+ import { PackageManagerName } from "../lib/utils/package-manager.js";
2
2
  import { Command } from "commander";
3
3
  //#region src/commands/add.d.ts
4
4
  interface AddComponentsPlan {
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","names":[],"sources":["../../src/commands/add.ts"],"mappings":";;;UAeiB;EACf;EACA;;iBAGc,wBAAwB;EACtC;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;IACE;cAqBS,KAAG"}
1
+ {"version":3,"file":"add.d.ts","names":[],"sources":["../../src/commands/add.ts"],"mappings":";;;UAciB;EACf;EACA;;iBAGc,wBAAwB;EACtC;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;IACE;cAqBS,KAAG"}
@@ -1,6 +1,7 @@
1
+ import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
1
2
  import { logger } from "../lib/utils/logger.js";
2
- import { SpawnExitError, runSpawn } from "../lib/run-spawn.js";
3
- import { dlxCommand, resolvePackageManager, resolvePackageManagerForCwd } from "../lib/create-project.js";
3
+ import { resolvePackageManagerForCwd } from "../lib/utils/package-manager.js";
4
+ import { dlxCommand, resolvePackageManager } from "../lib/create-project.js";
4
5
  import { hasConfig } from "../lib/utils/config.js";
5
6
  import { getComponentsJsonStyle, resolveRegistryItemUrl } from "../lib/utils/registry.js";
6
7
  import { Command } from "commander";
@@ -46,6 +47,7 @@ const add = new Command().name("add").description("add a component to your proje
46
47
  try {
47
48
  await runSpawn(command, args, opts.cwd);
48
49
  } catch (error) {
50
+ if (error instanceof SpawnSignalError) throw error;
49
51
  if (error instanceof SpawnExitError) {
50
52
  logger.error(`Process exited with code ${error.code}`);
51
53
  process.exit(error.code);
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","names":[],"sources":["../../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { logger } from \"../lib/utils/logger\";\nimport { hasConfig } from \"../lib/utils/config\";\nimport {\n getComponentsJsonStyle,\n resolveRegistryItemUrl,\n} from \"../lib/utils/registry\";\nimport {\n dlxCommand,\n resolvePackageManager,\n resolvePackageManagerForCwd,\n type PackageManagerName,\n} from \"../lib/create-project\";\nimport { runSpawn, SpawnExitError } from \"../lib/run-spawn\";\n\nexport interface AddComponentsPlan {\n command: string;\n args: string[];\n}\n\nexport function createAddComponentsPlan(params: {\n components: string[];\n packageManager: PackageManagerName;\n yes?: boolean;\n overwrite?: boolean;\n cwd?: string;\n path?: string;\n style?: string;\n}): AddComponentsPlan {\n const componentsToAdd = params.components.map((c) => {\n if (!/^[a-zA-Z0-9-/]+$/.test(c)) {\n throw new Error(`Invalid component name: ${c}`);\n }\n return resolveRegistryItemUrl(c, params.style);\n });\n\n const [command, dlxArgs] = dlxCommand(params.packageManager);\n const args = [...dlxArgs, \"shadcn@latest\", \"add\", ...componentsToAdd];\n\n // For npm, dlxArgs may already include `--yes` for npx auto-install.\n // This flag is for shadcn's own confirmation prompt.\n if (params.yes) args.push(\"--yes\");\n if (params.overwrite) args.push(\"--overwrite\");\n if (params.cwd) args.push(\"--cwd\", params.cwd);\n if (params.path) args.push(\"--path\", params.path);\n\n return { command, args };\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\"<components...>\", \"the components to add\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", true)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"--use-npm\", \"explicitly use npm\")\n .option(\"--use-pnpm\", \"explicitly use pnpm\")\n .option(\"--use-yarn\", \"explicitly use yarn\")\n .option(\"--use-bun\", \"explicitly use bun\")\n .action(async (components: string[], opts) => {\n // Check if project is initialized\n if (!hasConfig(opts.cwd)) {\n logger.warn(\n \"It looks like you haven't initialized your project yet — defaulting to Base UI flavored components. Run 'assistant-ui init' first for a configured setup.\",\n );\n logger.break();\n }\n\n logger.step(`Adding ${components.length} component(s)...`);\n\n const packageManager = await resolvePackageManagerForCwd(\n opts.cwd,\n resolvePackageManager(opts),\n );\n const style = getComponentsJsonStyle(opts.cwd);\n const { command, args } = createAddComponentsPlan({\n components,\n packageManager,\n yes: opts.yes,\n overwrite: opts.overwrite,\n cwd: opts.cwd,\n path: opts.path,\n ...(style === undefined ? {} : { style }),\n });\n\n try {\n await runSpawn(command, args, opts.cwd);\n } catch (error) {\n if (error instanceof SpawnExitError) {\n logger.error(`Process exited with code ${error.code}`);\n process.exit(error.code);\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to add components: ${message}`);\n process.exit(1);\n }\n\n logger.success(\"Components added successfully!\");\n });\n"],"mappings":";;;;;;;AAoBA,SAAgB,wBAAwB,QAQlB;CACpB,MAAM,kBAAkB,OAAO,WAAW,KAAK,MAAM;EACnD,IAAI,CAAC,mBAAmB,KAAK,CAAC,GAC5B,MAAM,IAAI,MAAM,2BAA2B,GAAG;EAEhD,OAAO,uBAAuB,GAAG,OAAO,KAAK;CAC/C,CAAC;CAED,MAAM,CAAC,SAAS,WAAW,WAAW,OAAO,cAAc;CAC3D,MAAM,OAAO;EAAC,GAAG;EAAS;EAAiB;EAAO,GAAG;CAAe;CAIpE,IAAI,OAAO,KAAK,KAAK,KAAK,OAAO;CACjC,IAAI,OAAO,WAAW,KAAK,KAAK,aAAa;CAC7C,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,GAAG;CAC7C,IAAI,OAAO,MAAM,KAAK,KAAK,UAAU,OAAO,IAAI;CAEhD,OAAO;EAAE;EAAS;CAAK;AACzB;AAEA,MAAa,MAAM,IAAI,QAAQ,CAAC,CAC7B,KAAK,KAAK,CAAC,CACX,YAAY,iCAAiC,CAAC,CAC9C,SAAS,mBAAmB,uBAAuB,CAAC,CACpD,OAAO,aAAa,6BAA6B,IAAI,CAAC,CACtD,OAAO,mBAAmB,6BAA6B,KAAK,CAAC,CAC7D,OACC,mBACA,6DACA,QAAQ,IAAI,CACd,CAAC,CACA,OAAO,qBAAqB,mCAAmC,CAAC,CAChE,OAAO,aAAa,oBAAoB,CAAC,CACzC,OAAO,cAAc,qBAAqB,CAAC,CAC3C,OAAO,cAAc,qBAAqB,CAAC,CAC3C,OAAO,aAAa,oBAAoB,CAAC,CACzC,OAAO,OAAO,YAAsB,SAAS;CAE5C,IAAI,CAAC,UAAU,KAAK,GAAG,GAAG;EACxB,OAAO,KACL,2JACF;EACA,OAAO,MAAM;CACf;CAEA,OAAO,KAAK,UAAU,WAAW,OAAO,iBAAiB;CAEzD,MAAM,iBAAiB,MAAM,4BAC3B,KAAK,KACL,sBAAsB,IAAI,CAC5B;CACA,MAAM,QAAQ,uBAAuB,KAAK,GAAG;CAC7C,MAAM,EAAE,SAAS,SAAS,wBAAwB;EAChD;EACA;EACA,KAAK,KAAK;EACV,WAAW,KAAK;EAChB,KAAK,KAAK;EACV,MAAM,KAAK;EACX,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;CACzC,CAAC;CAED,IAAI;EACF,MAAM,SAAS,SAAS,MAAM,KAAK,GAAG;CACxC,SAAS,OAAO;EACd,IAAI,iBAAiB,gBAAgB;GACnC,OAAO,MAAM,4BAA4B,MAAM,MAAM;GACrD,QAAQ,KAAK,MAAM,IAAI;EACzB;EACA,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,OAAO,MAAM,6BAA6B,SAAS;EACnD,QAAQ,KAAK,CAAC;CAChB;CAEA,OAAO,QAAQ,gCAAgC;AACjD,CAAC"}
1
+ {"version":3,"file":"add.js","names":[],"sources":["../../src/commands/add.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { logger } from \"../lib/utils/logger\";\nimport { hasConfig } from \"../lib/utils/config\";\nimport {\n getComponentsJsonStyle,\n resolveRegistryItemUrl,\n} from \"../lib/utils/registry\";\nimport { dlxCommand, resolvePackageManager } from \"../lib/create-project\";\nimport { runSpawn, SpawnExitError, SpawnSignalError } from \"../lib/run-spawn\";\nimport {\n type PackageManagerName,\n resolvePackageManagerForCwd,\n} from \"../lib/utils/package-manager\";\n\nexport interface AddComponentsPlan {\n command: string;\n args: string[];\n}\n\nexport function createAddComponentsPlan(params: {\n components: string[];\n packageManager: PackageManagerName;\n yes?: boolean;\n overwrite?: boolean;\n cwd?: string;\n path?: string;\n style?: string;\n}): AddComponentsPlan {\n const componentsToAdd = params.components.map((c) => {\n if (!/^[a-zA-Z0-9-/]+$/.test(c)) {\n throw new Error(`Invalid component name: ${c}`);\n }\n return resolveRegistryItemUrl(c, params.style);\n });\n\n const [command, dlxArgs] = dlxCommand(params.packageManager);\n const args = [...dlxArgs, \"shadcn@latest\", \"add\", ...componentsToAdd];\n\n // For npm, dlxArgs may already include `--yes` for npx auto-install.\n // This flag is for shadcn's own confirmation prompt.\n if (params.yes) args.push(\"--yes\");\n if (params.overwrite) args.push(\"--overwrite\");\n if (params.cwd) args.push(\"--cwd\", params.cwd);\n if (params.path) args.push(\"--path\", params.path);\n\n return { command, args };\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\"<components...>\", \"the components to add\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", true)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"--use-npm\", \"explicitly use npm\")\n .option(\"--use-pnpm\", \"explicitly use pnpm\")\n .option(\"--use-yarn\", \"explicitly use yarn\")\n .option(\"--use-bun\", \"explicitly use bun\")\n .action(async (components: string[], opts) => {\n // Check if project is initialized\n if (!hasConfig(opts.cwd)) {\n logger.warn(\n \"It looks like you haven't initialized your project yet — defaulting to Base UI flavored components. Run 'assistant-ui init' first for a configured setup.\",\n );\n logger.break();\n }\n\n logger.step(`Adding ${components.length} component(s)...`);\n\n const packageManager = await resolvePackageManagerForCwd(\n opts.cwd,\n resolvePackageManager(opts),\n );\n const style = getComponentsJsonStyle(opts.cwd);\n const { command, args } = createAddComponentsPlan({\n components,\n packageManager,\n yes: opts.yes,\n overwrite: opts.overwrite,\n cwd: opts.cwd,\n path: opts.path,\n ...(style === undefined ? {} : { style }),\n });\n\n try {\n await runSpawn(command, args, opts.cwd);\n } catch (error) {\n if (error instanceof SpawnSignalError) throw error;\n if (error instanceof SpawnExitError) {\n logger.error(`Process exited with code ${error.code}`);\n process.exit(error.code);\n }\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to add components: ${message}`);\n process.exit(1);\n }\n\n logger.success(\"Components added successfully!\");\n });\n"],"mappings":";;;;;;;;AAmBA,SAAgB,wBAAwB,QAQlB;CACpB,MAAM,kBAAkB,OAAO,WAAW,KAAK,MAAM;EACnD,IAAI,CAAC,mBAAmB,KAAK,CAAC,GAC5B,MAAM,IAAI,MAAM,2BAA2B,GAAG;EAEhD,OAAO,uBAAuB,GAAG,OAAO,KAAK;CAC/C,CAAC;CAED,MAAM,CAAC,SAAS,WAAW,WAAW,OAAO,cAAc;CAC3D,MAAM,OAAO;EAAC,GAAG;EAAS;EAAiB;EAAO,GAAG;CAAe;CAIpE,IAAI,OAAO,KAAK,KAAK,KAAK,OAAO;CACjC,IAAI,OAAO,WAAW,KAAK,KAAK,aAAa;CAC7C,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,GAAG;CAC7C,IAAI,OAAO,MAAM,KAAK,KAAK,UAAU,OAAO,IAAI;CAEhD,OAAO;EAAE;EAAS;CAAK;AACzB;AAEA,MAAa,MAAM,IAAI,QAAQ,CAAC,CAC7B,KAAK,KAAK,CAAC,CACX,YAAY,iCAAiC,CAAC,CAC9C,SAAS,mBAAmB,uBAAuB,CAAC,CACpD,OAAO,aAAa,6BAA6B,IAAI,CAAC,CACtD,OAAO,mBAAmB,6BAA6B,KAAK,CAAC,CAC7D,OACC,mBACA,6DACA,QAAQ,IAAI,CACd,CAAC,CACA,OAAO,qBAAqB,mCAAmC,CAAC,CAChE,OAAO,aAAa,oBAAoB,CAAC,CACzC,OAAO,cAAc,qBAAqB,CAAC,CAC3C,OAAO,cAAc,qBAAqB,CAAC,CAC3C,OAAO,aAAa,oBAAoB,CAAC,CACzC,OAAO,OAAO,YAAsB,SAAS;CAE5C,IAAI,CAAC,UAAU,KAAK,GAAG,GAAG;EACxB,OAAO,KACL,2JACF;EACA,OAAO,MAAM;CACf;CAEA,OAAO,KAAK,UAAU,WAAW,OAAO,iBAAiB;CAEzD,MAAM,iBAAiB,MAAM,4BAC3B,KAAK,KACL,sBAAsB,IAAI,CAC5B;CACA,MAAM,QAAQ,uBAAuB,KAAK,GAAG;CAC7C,MAAM,EAAE,SAAS,SAAS,wBAAwB;EAChD;EACA;EACA,KAAK,KAAK;EACV,WAAW,KAAK;EAChB,KAAK,KAAK;EACV,MAAM,KAAK;EACX,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;CACzC,CAAC;CAED,IAAI;EACF,MAAM,SAAS,SAAS,MAAM,KAAK,GAAG;CACxC,SAAS,OAAO;EACd,IAAI,iBAAiB,kBAAkB,MAAM;EAC7C,IAAI,iBAAiB,gBAAgB;GACnC,OAAO,MAAM,4BAA4B,MAAM,MAAM;GACrD,QAAQ,KAAK,MAAM,IAAI;EACzB;EACA,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,OAAO,MAAM,6BAA6B,SAAS;EACnD,QAAQ,KAAK,CAAC;CAChB;CAEA,OAAO,QAAQ,gCAAgC;AACjD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","names":[],"sources":["../../src/commands/create.ts"],"mappings":";;;UAsBiB;EACf;EACA;EACA;EACA;EACA;EACA;;cAGW,kBAAkB;iBAsQT,eAAe;EACnC;EACA;EACA;EACA,gBAAgB,EAAE;EAClB,kBAAkB,EAAE;IAClB,QAAQ;iBA2EI,8BAA8B;EAC5C;EACA;;iBAYc,iBAAiB;UAOhB;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;;iBAac,wBACd,MAAM,0BACL;cAoCU,QAAM"}
1
+ {"version":3,"file":"create.d.ts","names":[],"sources":["../../src/commands/create.ts"],"mappings":";;;UA2BiB;EACf;EACA;EACA;EACA;EACA;EACA;;cAGW,kBAAkB;iBAsQT,eAAe;EACnC;EACA;EACA;EACA,gBAAgB,EAAE;EAClB,kBAAkB,EAAE;IAClB,QAAQ;iBA2EI,8BAA8B;EAC5C;EACA;;iBAYc,iBAAiB;UAOhB;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;;iBAac,wBACd,MAAM,0BACL;cAoCU,QAAM"}