assistant-ui 0.0.116 → 0.0.118

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 (127) hide show
  1. package/dist/codemods/utils/createTransformer.d.ts +13 -16
  2. package/dist/codemods/utils/createTransformer.d.ts.map +1 -1
  3. package/dist/codemods/utils/resolveBinding.d.ts +3 -0
  4. package/dist/codemods/utils/resolveBinding.d.ts.map +1 -0
  5. package/dist/codemods/utils/resolveBinding.js +78 -0
  6. package/dist/codemods/utils/resolveBinding.js.map +1 -0
  7. package/dist/codemods/v0-11/content-part-to-message-part.d.ts +1 -3
  8. package/dist/codemods/v0-11/content-part-to-message-part.d.ts.map +1 -1
  9. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts +1 -3
  10. package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
  11. package/dist/codemods/v0-12/assistant-api-to-aui.js +51 -99
  12. package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
  13. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts +1 -3
  14. package/dist/codemods/v0-12/event-names-to-camelcase.d.ts.map +1 -1
  15. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts +1 -3
  16. package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
  17. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts +1 -3
  18. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.d.ts.map +1 -1
  19. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js +33 -5
  20. package/dist/codemods/v0-15/aui-accessor-calls-to-properties.js.map +1 -1
  21. package/dist/codemods/v0-8/ui-package-split.d.ts +1 -3
  22. package/dist/codemods/v0-8/ui-package-split.d.ts.map +1 -1
  23. package/dist/codemods/v0-9/edge-package-split.d.ts +1 -3
  24. package/dist/codemods/v0-9/edge-package-split.d.ts.map +1 -1
  25. package/dist/commands/add.d.ts +13 -16
  26. package/dist/commands/add.d.ts.map +1 -1
  27. package/dist/commands/add.js +3 -3
  28. package/dist/commands/agent.d.ts +1 -4
  29. package/dist/commands/agent.d.ts.map +1 -1
  30. package/dist/commands/agent.js +16 -13
  31. package/dist/commands/agent.js.map +1 -1
  32. package/dist/commands/create.d.ts +43 -39
  33. package/dist/commands/create.d.ts.map +1 -1
  34. package/dist/commands/create.js +40 -26
  35. package/dist/commands/create.js.map +1 -1
  36. package/dist/commands/doctor.d.ts +17 -20
  37. package/dist/commands/doctor.d.ts.map +1 -1
  38. package/dist/commands/info.d.ts +4 -6
  39. package/dist/commands/info.d.ts.map +1 -1
  40. package/dist/commands/info.js +3 -3
  41. package/dist/commands/init.d.ts +8 -10
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js +3 -4
  44. package/dist/commands/init.js.map +1 -1
  45. package/dist/commands/mcp.d.ts +1 -4
  46. package/dist/commands/mcp.d.ts.map +1 -1
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/update.d.ts +1 -4
  49. package/dist/commands/update.d.ts.map +1 -1
  50. package/dist/commands/update.js +1 -1
  51. package/dist/commands/upgrade.d.ts +7 -10
  52. package/dist/commands/upgrade.d.ts.map +1 -1
  53. package/dist/index.d.ts +3 -1
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/lib/agent-skill.d.ts +11 -10
  56. package/dist/lib/agent-skill.d.ts.map +1 -1
  57. package/dist/lib/agent-skill.js +78 -2
  58. package/dist/lib/agent-skill.js.map +1 -1
  59. package/dist/lib/create-project.d.ts +33 -32
  60. package/dist/lib/create-project.d.ts.map +1 -1
  61. package/dist/lib/create-project.js +91 -5
  62. package/dist/lib/create-project.js.map +1 -1
  63. package/dist/lib/handle-cli-error.d.ts +1 -4
  64. package/dist/lib/handle-cli-error.d.ts.map +1 -1
  65. package/dist/lib/install-ai-sdk-lib.d.ts +1 -4
  66. package/dist/lib/install-ai-sdk-lib.d.ts.map +1 -1
  67. package/dist/lib/install-edge-lib.d.ts +1 -4
  68. package/dist/lib/install-edge-lib.d.ts.map +1 -1
  69. package/dist/lib/run-spawn.d.ts +17 -19
  70. package/dist/lib/run-spawn.d.ts.map +1 -1
  71. package/dist/lib/run-spawn.js +25 -10
  72. package/dist/lib/run-spawn.js.map +1 -1
  73. package/dist/lib/transform-options.d.ts +5 -8
  74. package/dist/lib/transform-options.d.ts.map +1 -1
  75. package/dist/lib/transform.d.ts +13 -16
  76. package/dist/lib/transform.d.ts.map +1 -1
  77. package/dist/lib/transform.js +19 -35
  78. package/dist/lib/transform.js.map +1 -1
  79. package/dist/lib/upgrade.d.ts +3 -6
  80. package/dist/lib/upgrade.d.ts.map +1 -1
  81. package/dist/lib/upgrade.js +6 -11
  82. package/dist/lib/upgrade.js.map +1 -1
  83. package/dist/lib/utils/config.d.ts +18 -21
  84. package/dist/lib/utils/config.d.ts.map +1 -1
  85. package/dist/lib/utils/file-scanner.d.ts +12 -15
  86. package/dist/lib/utils/file-scanner.d.ts.map +1 -1
  87. package/dist/lib/utils/logger.d.ts +7 -10
  88. package/dist/lib/utils/logger.d.ts.map +1 -1
  89. package/dist/lib/utils/package-installer.d.ts +7 -10
  90. package/dist/lib/utils/package-installer.d.ts.map +1 -1
  91. package/dist/lib/utils/package-json.d.ts +1 -4
  92. package/dist/lib/utils/package-json.d.ts.map +1 -1
  93. package/dist/lib/utils/package-manager.d.ts +9 -12
  94. package/dist/lib/utils/package-manager.d.ts.map +1 -1
  95. package/dist/lib/utils/package-manager.js +13 -2
  96. package/dist/lib/utils/package-manager.js.map +1 -1
  97. package/dist/lib/utils/registry.d.ts +5 -8
  98. package/dist/lib/utils/registry.d.ts.map +1 -1
  99. package/dist/lib/utils/workspace.d.ts +2 -5
  100. package/dist/lib/utils/workspace.d.ts.map +1 -1
  101. package/dist/program.d.ts +1 -4
  102. package/dist/program.d.ts.map +1 -1
  103. package/dist/program.js +6 -6
  104. package/dist/run.d.ts +1 -4
  105. package/dist/run.d.ts.map +1 -1
  106. package/package.json +8 -8
  107. package/src/codemods/utils/resolveBinding.test.ts +107 -0
  108. package/src/codemods/utils/resolveBinding.ts +130 -0
  109. package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +256 -0
  110. package/src/codemods/v0-12/assistant-api-to-aui.ts +125 -225
  111. package/src/codemods/v0-15/__tests__/aui-accessor-calls-to-properties.test.ts +101 -0
  112. package/src/codemods/v0-15/aui-accessor-calls-to-properties.ts +60 -5
  113. package/src/commands/agent.ts +15 -22
  114. package/src/commands/create.ts +53 -20
  115. package/src/commands/init.ts +1 -2
  116. package/src/lib/agent-skill.ts +103 -1
  117. package/src/lib/create-project.ts +99 -4
  118. package/src/lib/run-spawn.test.ts +47 -0
  119. package/src/lib/run-spawn.ts +29 -17
  120. package/src/lib/transform-files.test.ts +71 -0
  121. package/src/lib/transform.test.ts +69 -1
  122. package/src/lib/transform.ts +23 -38
  123. package/src/lib/upgrade.ts +9 -13
  124. package/src/lib/utils/package-manager.ts +24 -1
  125. package/plugin/.claude-plugin/plugin.json +0 -8
  126. package/plugin/skills/assistant-ui/SKILL.md +0 -199
  127. package/plugin/skills/assistant-ui/shipables.json +0 -22
@@ -0,0 +1,130 @@
1
+ import type { JSCodeshift } from "jscodeshift";
2
+
3
+ const patternBinding = (node: any, name: string): any => {
4
+ switch (node?.type) {
5
+ case "Identifier":
6
+ return node.name === name ? node : undefined;
7
+ case "TSParameterProperty":
8
+ return patternBinding(node.parameter, name);
9
+ case "AssignmentPattern":
10
+ return patternBinding(node.left, name);
11
+ case "RestElement":
12
+ return patternBinding(node.argument, name);
13
+ case "ObjectPattern":
14
+ return node.properties
15
+ .map((p: any) => patternBinding(p.value ?? p.argument, name))
16
+ .find(Boolean);
17
+ case "ArrayPattern":
18
+ return node.elements
19
+ .map((p: any) => patternBinding(p, name))
20
+ .find(Boolean);
21
+ }
22
+ };
23
+
24
+ const declarationBinding = (node: any, name: string): any => {
25
+ switch (node?.type) {
26
+ case "ExportNamedDeclaration":
27
+ case "ExportDefaultDeclaration":
28
+ return declarationBinding(node.declaration, name);
29
+ case "VariableDeclaration":
30
+ return node.declarations
31
+ .map((d: any) => patternBinding(d.id, name))
32
+ .find(Boolean);
33
+ case "ImportDeclaration":
34
+ if (node.importKind === "type") return;
35
+ return node.specifiers
36
+ ?.filter((s: any) => s.importKind !== "type")
37
+ .map((s: any) => patternBinding(s.local, name))
38
+ .find(Boolean);
39
+ case "TSTypeAliasDeclaration":
40
+ case "TSInterfaceDeclaration":
41
+ case "TSDeclareFunction":
42
+ return;
43
+ default:
44
+ return patternBinding(node?.id, name);
45
+ }
46
+ };
47
+
48
+ const hoistedBinding = (j: JSCodeshift, body: any, name: string): any => {
49
+ let binding: any;
50
+ j.types.visit(body, {
51
+ visitFunction() {
52
+ return false;
53
+ },
54
+ visitClassDeclaration() {
55
+ return false;
56
+ },
57
+ visitClassExpression() {
58
+ return false;
59
+ },
60
+ visitTSModuleBlock(path) {
61
+ if (path.node !== body) return false;
62
+ this.traverse(path);
63
+ return undefined;
64
+ },
65
+ visitVariableDeclaration(path) {
66
+ if (path.node.kind === "var")
67
+ binding ??= declarationBinding(path.node, name);
68
+ this.traverse(path);
69
+ },
70
+ });
71
+ return binding;
72
+ };
73
+
74
+ // ast-types scopes do not distinguish block-scoped declarations.
75
+ export const resolveBinding = (
76
+ j: JSCodeshift,
77
+ path: any,
78
+ name: string,
79
+ ): any => {
80
+ let child = path;
81
+ for (
82
+ let current = path.parent;
83
+ current;
84
+ child = current, current = current.parent
85
+ ) {
86
+ const node = current.value;
87
+ let binding: any;
88
+ if (Array.isArray(node.params)) {
89
+ binding =
90
+ node.params.map((p: any) => patternBinding(p, name)).find(Boolean) ??
91
+ patternBinding(node.id, name) ??
92
+ (child.value === node.body
93
+ ? hoistedBinding(j, node.body, name)
94
+ : undefined);
95
+ } else if (node.type === "CatchClause") {
96
+ binding = patternBinding(node.param, name);
97
+ } else if (node.type === "ClassExpression") {
98
+ binding = patternBinding(node.id, name);
99
+ } else if (node.type === "ForStatement") {
100
+ binding = declarationBinding(node.init, name);
101
+ } else if (
102
+ node.type === "ForInStatement" ||
103
+ node.type === "ForOfStatement"
104
+ ) {
105
+ binding = declarationBinding(node.left, name);
106
+ } else {
107
+ const statements =
108
+ node.type === "SwitchStatement" && child.value !== node.discriminant
109
+ ? node.cases.flatMap((c: any) => c.consequent)
110
+ : [
111
+ "BlockStatement",
112
+ "Program",
113
+ "StaticBlock",
114
+ "TSModuleBlock",
115
+ ].includes(node.type)
116
+ ? node.body
117
+ : [];
118
+ binding = statements
119
+ .map((s: any) => declarationBinding(s, name))
120
+ .find(Boolean);
121
+ if (
122
+ !binding &&
123
+ ["Program", "StaticBlock", "TSModuleBlock"].includes(node.type)
124
+ ) {
125
+ binding = hoistedBinding(j, node, name);
126
+ }
127
+ }
128
+ if (binding) return binding;
129
+ }
130
+ };
@@ -21,6 +21,262 @@ function applyTransform(source: string): string | null {
21
21
  }
22
22
 
23
23
  describe("assistant-api-to-aui", () => {
24
+ it.each([
25
+ "const aui = props.aui; const api = useAui(); api.thread();",
26
+ "const api = useAui(); const aui = props.aui; api.thread();",
27
+ "const api = useAui(); function read(aui) { return api.thread(); }",
28
+ "const api = useAui(); { const aui = props.aui; api.thread(); }",
29
+ "function read(aui) { const api = useAui(); return api.thread(); }",
30
+ ])("preserves api when renaming would collide or capture: %s", (source) => {
31
+ const input = `import { useAui } from "@assistant-ui/react";\n${source}`;
32
+ expect(applyTransform(input)).toBeNull();
33
+ });
34
+
35
+ it("still migrates the hook when the api local name must be preserved", () => {
36
+ const output =
37
+ applyTransform(`import { useAssistantApi } from "@assistant-ui/react";
38
+ const aui = props.aui;
39
+ const api = useAssistantApi();
40
+ api.thread();`);
41
+ expect(output).toContain('import { useAui } from "@assistant-ui/react";');
42
+ expect(output).toContain("const api = useAui();");
43
+ expect(output).toContain("api.thread();");
44
+ expect(applyTransform(output!)).toBeNull();
45
+ });
46
+
47
+ it("does not let one colliding api binding prevent independent renames", () => {
48
+ const blocked =
49
+ "function blocked(aui) { const api = useAui(); return api.thread(); }";
50
+ const output = applyTransform(`import { useAui } from "@assistant-ui/react";
51
+ ${blocked}
52
+ function safe() { const api = useAui(); return api.thread(); }`);
53
+ expect(output).toContain(blocked);
54
+ expect(output).toContain(
55
+ "function safe() { const aui = useAui(); return aui.thread(); }",
56
+ );
57
+ expect(applyTransform(output!)).toBeNull();
58
+ });
59
+
60
+ it.each([
61
+ ["AssistantProvider", "AuiProvider"],
62
+ ["useAssistantState", "useAuiState"],
63
+ ])("preserves qualified type members named %s", (oldName, newName) => {
64
+ const output =
65
+ applyTransform(`import { ${oldName} } from "@assistant-ui/react";
66
+ import type { Components } from "./types";
67
+ type Foreign = Components.${oldName};
68
+ type Nested = Components.Nested.${oldName};
69
+ type ForeignValue = typeof Components.${oldName};
70
+ type LocalValue = typeof ${oldName};
71
+ type LocalMember = typeof ${oldName}.displayName;
72
+ const value = ${oldName};`);
73
+ expect(output).toContain(`type Foreign = Components.${oldName};`);
74
+ expect(output).toContain(`type Nested = Components.Nested.${oldName};`);
75
+ expect(output).toContain(
76
+ `type ForeignValue = typeof Components.${oldName};`,
77
+ );
78
+ expect(output).toContain(`type LocalValue = typeof ${newName};`);
79
+ expect(output).toContain(
80
+ `type LocalMember = typeof ${newName}.displayName;`,
81
+ );
82
+ expect(output).toContain(`const value = ${newName};`);
83
+ expect(applyTransform(output!)).toBeNull();
84
+ });
85
+
86
+ it.each([
87
+ ["const", "of"],
88
+ ["let", "of"],
89
+ ["const", "in"],
90
+ ["let", "in"],
91
+ ])(
92
+ "preserves %s for-%s bindings in their right-hand side",
93
+ (kind, operator) => {
94
+ const loop = `for (${kind} api ${operator} api.thread()) { api.thread(); }`;
95
+ const output =
96
+ applyTransform(`import { useAssistantApi } from "@assistant-ui/react";
97
+ const api = useAssistantApi();
98
+ ${loop}
99
+ api.thread();`);
100
+ expect(output).toContain(loop);
101
+ expect(output).toContain("const aui = useAui();");
102
+ expect(output).toContain("\naui.thread();");
103
+ },
104
+ );
105
+
106
+ it.each(["useAssistantApi", "useAui"])(
107
+ "preserves api initialized from a foreign %s import",
108
+ (hook) => {
109
+ const input = `import { ${hook} } from "./local-hooks";
110
+ const api = ${hook}();
111
+ api.thread();`;
112
+ expect(applyTransform(input)).toBeNull();
113
+ },
114
+ );
115
+
116
+ it.each(["useAssistantApi", "useAui"])(
117
+ "preserves api initialized from a shadowed %s import",
118
+ (hook) => {
119
+ const shadowed = `function local(${hook}) { const api = ${hook}(); return api.thread(); }
120
+ { const ${hook} = other; const api = ${hook}(); api.thread(); }
121
+ function hoisted() { const api = ${hook}(); if (ready) { var ${hook} = other; } return api.thread(); }`;
122
+ const output =
123
+ applyTransform(`import { ${hook} } from "@assistant-ui/react";
124
+ ${shadowed}
125
+ const api = ${hook}();
126
+ api.thread();`);
127
+ expect(output).toContain(shadowed);
128
+ expect(output).toContain("const aui = useAui();");
129
+ expect(output).toContain("\naui.thread();");
130
+ expect(applyTransform(output!)).toBeNull();
131
+ },
132
+ );
133
+
134
+ it.each(["useAssistantApi", "useAui"])(
135
+ "renames api initialized from an aliased %s import",
136
+ (hook) => {
137
+ const output =
138
+ applyTransform(`import { ${hook} as useClient } from "@assistant-ui/react";
139
+ const api = useClient();
140
+ api.thread();`);
141
+ expect(output).toContain("useAui as useClient");
142
+ expect(output).toContain("const aui = useClient();");
143
+ expect(output).toContain("aui.thread();");
144
+ expect(applyTransform(output!)).toBeNull();
145
+ },
146
+ );
147
+
148
+ it.each([
149
+ 'import type { useAssistantApi } from "@assistant-ui/react";',
150
+ 'import { type useAssistantApi } from "@assistant-ui/react";',
151
+ ])(
152
+ "does not infer an api value from type-only imports: %s",
153
+ (declaration) => {
154
+ const output = applyTransform(`${declaration}
155
+ const api = useAssistantApi();
156
+ api.thread();`);
157
+ expect(output).toContain("const api = useAssistantApi();");
158
+ expect(output).toContain("api.thread();");
159
+ },
160
+ );
161
+
162
+ it.each(["useAssistantApi", "useAui"])(
163
+ "leaves unresolved %s calls alone",
164
+ (hook) => {
165
+ expect(applyTransform(`const api = ${hook}(); api.thread();`)).toBeNull();
166
+ },
167
+ );
168
+
169
+ it("preserves hooks and components imported from another package", () => {
170
+ const input = `import { useAssistantState, AssistantIf } from "./local-hooks";
171
+ import { useAui } from "@assistant-ui/react";
172
+ const read = () => useAssistantState();
173
+ const view = <AssistantIf />;`;
174
+ expect(applyTransform(input)).toBeNull();
175
+ });
176
+
177
+ it.each([
178
+ "function local(useAssistantState) { return useAssistantState(); }",
179
+ "{ const useAssistantState = other; useAssistantState(); }",
180
+ "{ const { useAssistantState } = other; useAssistantState(); }",
181
+ "function local() { if (ready) { var useAssistantState = other; } return useAssistantState(); }",
182
+ ])("preserves a shadowed hook: %s", (unrelated) => {
183
+ const output = applyTransform(
184
+ `import { useAssistantState } from "@assistant-ui/react";\n${unrelated}\nuseAssistantState();`,
185
+ );
186
+ expect(output).toContain(unrelated);
187
+ expect(output).toContain("\nuseAuiState();");
188
+ });
189
+
190
+ it("preserves hook import aliases", () => {
191
+ const output =
192
+ applyTransform(`import { useAssistantState as useLocalState } from "@assistant-ui/react";
193
+ useLocalState();`);
194
+ expect(output).toContain("useAuiState as useLocalState");
195
+ expect(output).toContain("useLocalState();");
196
+ expect(applyTransform(output!)).toBeNull();
197
+ });
198
+
199
+ it("avoids duplicating an existing import of the new local name", () => {
200
+ const output =
201
+ applyTransform(`import { useAssistantState } from "@assistant-ui/react";
202
+ import { useAuiState } from "./other";
203
+ useAssistantState();
204
+ useAuiState();`);
205
+ expect(output).toContain("useAuiState as useAssistantState");
206
+ expect(output).toContain('import { useAuiState } from "./other";');
207
+ expect(output).toContain("\nuseAssistantState();");
208
+ });
209
+
210
+ it("preserves public property and export names", () => {
211
+ const output =
212
+ applyTransform(`import { useAssistantState } from "@assistant-ui/react";
213
+ const value = { useAssistantState };
214
+ obj.useAssistantState();
215
+ const config = { useAssistantState: "unchanged" };
216
+ export { useAssistantState };
217
+ export { useAssistantState as remote } from "./other";`);
218
+ expect(output).toMatch(/useAssistantState: useAuiState/);
219
+ expect(output).toContain("obj.useAssistantState();");
220
+ expect(output).toContain('useAssistantState: "unchanged"');
221
+ expect(output).toContain("useAuiState as useAssistantState");
222
+ expect(output).toContain(
223
+ 'export { useAssistantState as remote } from "./other";',
224
+ );
225
+ });
226
+
227
+ it("does not capture references with an existing new-name binding", () => {
228
+ const output =
229
+ applyTransform(`import { useAssistantState } from "@assistant-ui/react";
230
+ function local(useAuiState) { return useAssistantState(); }`);
231
+ expect(output).toContain("useAuiState as useAssistantState");
232
+ expect(output).toContain(
233
+ "function local(useAuiState) { return useAssistantState(); }",
234
+ );
235
+ });
236
+
237
+ it("preserves a shadowed JSX component and JSX property names", () => {
238
+ const output =
239
+ applyTransform(`import { AssistantIf } from "@assistant-ui/react";
240
+ const view = <AssistantIf AssistantIf="attribute" />;
241
+ function local(AssistantIf) { return <AssistantIf />; }
242
+ const other = <components.AssistantIf />;`);
243
+ expect(output).toContain('<AuiIf AssistantIf="attribute" />');
244
+ expect(output).toContain(
245
+ "function local(AssistantIf) { return <AssistantIf />; }",
246
+ );
247
+ expect(output).toContain("<components.AssistantIf />");
248
+ });
249
+
250
+ it("preserves local names for type-only imports", () => {
251
+ const output =
252
+ applyTransform(`import type { AssistantProvider } from "@assistant-ui/react";
253
+ type Provider = typeof AssistantProvider;`);
254
+ expect(output).toContain("AuiProvider as AssistantProvider");
255
+ expect(output).toContain("typeof AssistantProvider");
256
+ });
257
+ it("does not rename references to a hoisted body variable", () => {
258
+ const input = `import { useAssistantApi } from "@assistant-ui/react";
259
+ const api = useAssistantApi();
260
+ function worker() { if (ready) { var api = other(); } return api.value; }
261
+ api.thread();`;
262
+ const output = applyTransform(input);
263
+ expect(output).toContain(
264
+ "if (ready) { var api = other(); } return api.value;",
265
+ );
266
+ expect(output).toContain("aui.thread();");
267
+ });
268
+
269
+ it("resolves switch discriminants and parameter defaults outside body bindings", () => {
270
+ const output =
271
+ applyTransform(`import { useAssistantApi } from "@assistant-ui/react";
272
+ const api = useAssistantApi();
273
+ function worker(value = api.thread()) { var api = other(); return api.value; }
274
+ switch (api.kind) { case 1: const api = other(); api.thread(); }`);
275
+ expect(output).toContain("value = aui.thread()");
276
+ expect(output).toContain("switch (aui.kind)");
277
+ expect(output).toContain("var api = other(); return api.value;");
278
+ expect(output).toContain("const api = other(); api.thread();");
279
+ });
24
280
  it("should rename useAssistantApi to useAui", () => {
25
281
  const input = `
26
282
  import { useAssistantApi } from "@assistant-ui/react";