unframer 4.1.8 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +5 -5
  2. package/dist/babel-jsx.d.ts +9 -0
  3. package/dist/babel-jsx.d.ts.map +1 -1
  4. package/dist/babel-jsx.js +72 -0
  5. package/dist/babel-jsx.js.map +1 -1
  6. package/dist/cli.d.ts +2 -2
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +262 -42
  9. package/dist/cli.js.map +1 -1
  10. package/dist/css-core.d.ts +50 -0
  11. package/dist/css-core.d.ts.map +1 -0
  12. package/dist/css-core.js +231 -0
  13. package/dist/css-core.js.map +1 -0
  14. package/dist/css.d.ts +9 -43
  15. package/dist/css.d.ts.map +1 -1
  16. package/dist/css.js +9 -232
  17. package/dist/css.js.map +1 -1
  18. package/dist/exporter.d.ts +1 -1
  19. package/dist/exporter.d.ts.map +1 -1
  20. package/dist/exporter.js +72 -11
  21. package/dist/exporter.js.map +1 -1
  22. package/dist/exporter.test.js +78 -0
  23. package/dist/exporter.test.js.map +1 -1
  24. package/dist/framer-chunks/{SqliteDatabase-VAKIICSG-R7ZS6CHH.js → SqliteDatabase-VAKIICSG-OPV4MG3Y.js} +5 -4
  25. package/dist/framer-chunks/{chunk-2DZGP7C2.js → chunk-7ZLQTYXQ.js} +5 -24
  26. package/dist/framer-chunks/chunk-IKQSD2QC.js +10 -0
  27. package/dist/framer-chunks/default-blog-sqlite-7ZHEY3GT-TVGUYU6H.js +7 -0
  28. package/dist/framer-chunks/fontshare-4THNDPMZ-FLLTWCDO.js +7 -0
  29. package/dist/framer-chunks/fontshare-B2QLD7YB-5V3XZJAH.js +7 -0
  30. package/dist/framer-chunks/fontshare-O22OBJ3D-FIG3CRN3.js +7 -0
  31. package/dist/framer-chunks/framer-font-45AI7UCZ-CKGC4MJC.js +7 -0
  32. package/dist/framer-chunks/google-3FCAKCAC-AM34UPJK.js +7 -0
  33. package/dist/framer-chunks/google-3SZHWBC6-2VTQEQ7J.js +7 -0
  34. package/dist/framer-chunks/google-GXDJLGJB-JNEJGCGD.js +7 -0
  35. package/dist/framer-chunks/sqlite-wasm-FGP37EAY-NO5QVZDI.js +7 -0
  36. package/dist/framer-chunks/sqlite3-SISQ6ENZ-5WRKGWTY.js +7 -0
  37. package/dist/framer.d.ts +128 -0
  38. package/dist/framer.js +820 -428
  39. package/dist/plugin-mcp-dist/lib/framer.d.ts +1 -7
  40. package/dist/plugin-mcp-dist/lib/framer.d.ts.map +1 -1
  41. package/dist/plugin-mcp-dist/lib/framer.js +90 -23
  42. package/dist/plugin-mcp-dist/lib/framer.js.map +1 -1
  43. package/dist/plugin-mcp-dist/lib/framer.test.d.ts +2 -0
  44. package/dist/plugin-mcp-dist/lib/framer.test.d.ts.map +1 -0
  45. package/dist/plugin-mcp-dist/lib/framer.test.js +214 -0
  46. package/dist/plugin-mcp-dist/lib/framer.test.js.map +1 -0
  47. package/dist/plugin-mcp-dist/lib/mcp-handlers.d.ts.map +1 -1
  48. package/dist/plugin-mcp-dist/lib/mcp-handlers.js +69 -11
  49. package/dist/plugin-mcp-dist/lib/mcp-handlers.js.map +1 -1
  50. package/dist/plugin-mcp-dist/lib/mcp.test.js +340 -364
  51. package/dist/plugin-mcp-dist/lib/mcp.test.js.map +1 -1
  52. package/dist/plugin-mcp-dist/lib/plugin-websocket.d.ts.map +1 -1
  53. package/dist/plugin-mcp-dist/lib/plugin-websocket.js +0 -3
  54. package/dist/plugin-mcp-dist/lib/plugin-websocket.js.map +1 -1
  55. package/dist/plugin-mcp-dist/lib/react-export.d.ts.map +1 -1
  56. package/dist/plugin-mcp-dist/lib/react-export.js +79 -61
  57. package/dist/plugin-mcp-dist/lib/react-export.js.map +1 -1
  58. package/dist/plugin-mcp-dist/lib/schema.d.ts +8 -0
  59. package/dist/plugin-mcp-dist/lib/schema.d.ts.map +1 -1
  60. package/dist/plugin-mcp-dist/lib/schema.js +18 -1
  61. package/dist/plugin-mcp-dist/lib/schema.js.map +1 -1
  62. package/dist/plugin-mcp-dist/lib/store.d.ts +1 -1
  63. package/dist/plugin-mcp-dist/lib/store.d.ts.map +1 -1
  64. package/dist/plugin-mcp-dist/lib/tunnel-integration.test.d.ts +2 -0
  65. package/dist/plugin-mcp-dist/lib/tunnel-integration.test.d.ts.map +1 -0
  66. package/dist/plugin-mcp-dist/lib/tunnel-integration.test.js +147 -0
  67. package/dist/plugin-mcp-dist/lib/tunnel-integration.test.js.map +1 -0
  68. package/dist/plugin-mcp-dist/lib/tunnel.d.ts +46 -0
  69. package/dist/plugin-mcp-dist/lib/tunnel.d.ts.map +1 -0
  70. package/dist/plugin-mcp-dist/lib/tunnel.js +117 -0
  71. package/dist/plugin-mcp-dist/lib/tunnel.js.map +1 -0
  72. package/dist/plugin-mcp-dist/lib/upstream-socket.d.ts +13 -0
  73. package/dist/plugin-mcp-dist/lib/upstream-socket.d.ts.map +1 -0
  74. package/dist/plugin-mcp-dist/lib/upstream-socket.js +56 -0
  75. package/dist/plugin-mcp-dist/lib/upstream-socket.js.map +1 -0
  76. package/dist/plugin-mcp-dist/lib/upstream-socket.test.d.ts +2 -0
  77. package/dist/plugin-mcp-dist/lib/upstream-socket.test.d.ts.map +1 -0
  78. package/dist/plugin-mcp-dist/lib/upstream-socket.test.js +212 -0
  79. package/dist/plugin-mcp-dist/lib/upstream-socket.test.js.map +1 -0
  80. package/dist/plugin-mcp-dist/lib/utils.d.ts +1 -9
  81. package/dist/plugin-mcp-dist/lib/utils.d.ts.map +1 -1
  82. package/dist/plugin-mcp-dist/lib/utils.js +13 -9
  83. package/dist/plugin-mcp-dist/lib/utils.js.map +1 -1
  84. package/dist/react.d.ts +1 -1
  85. package/dist/react.d.ts.map +1 -1
  86. package/dist/react.js +7 -13
  87. package/dist/react.js.map +1 -1
  88. package/dist/version.d.ts +1 -1
  89. package/dist/version.js +1 -1
  90. package/package.json +7 -8
  91. package/src/babel-jsx.ts +99 -0
  92. package/src/cli.ts +295 -42
  93. package/src/css-core.ts +277 -0
  94. package/src/css.tsx +10 -276
  95. package/src/exporter.test.ts +82 -0
  96. package/src/exporter.ts +92 -11
  97. package/src/framer.d.ts +128 -0
  98. package/src/framer.js +820 -428
  99. package/src/plugin-mcp-dist/lib/framer.d.ts +2 -5
  100. package/src/plugin-mcp-dist/lib/framer.d.ts.map +1 -1
  101. package/src/plugin-mcp-dist/lib/framer.js +90 -23
  102. package/src/plugin-mcp-dist/lib/framer.js.map +1 -1
  103. package/src/plugin-mcp-dist/lib/framer.test.d.ts +2 -0
  104. package/src/plugin-mcp-dist/lib/framer.test.d.ts.map +1 -0
  105. package/src/plugin-mcp-dist/lib/framer.test.js +213 -0
  106. package/src/plugin-mcp-dist/lib/framer.test.js.map +1 -0
  107. package/src/plugin-mcp-dist/lib/mcp-handlers.d.ts +2 -2
  108. package/src/plugin-mcp-dist/lib/mcp-handlers.d.ts.map +1 -1
  109. package/src/plugin-mcp-dist/lib/mcp-handlers.js +69 -11
  110. package/src/plugin-mcp-dist/lib/mcp-handlers.js.map +1 -1
  111. package/src/plugin-mcp-dist/lib/mcp.test.js +340 -364
  112. package/src/plugin-mcp-dist/lib/mcp.test.js.map +1 -1
  113. package/src/plugin-mcp-dist/lib/plugin-websocket.d.ts.map +1 -1
  114. package/src/plugin-mcp-dist/lib/plugin-websocket.js +0 -3
  115. package/src/plugin-mcp-dist/lib/plugin-websocket.js.map +1 -1
  116. package/src/plugin-mcp-dist/lib/react-export.d.ts +1 -1
  117. package/src/plugin-mcp-dist/lib/react-export.d.ts.map +1 -1
  118. package/src/plugin-mcp-dist/lib/react-export.js +79 -61
  119. package/src/plugin-mcp-dist/lib/react-export.js.map +1 -1
  120. package/src/plugin-mcp-dist/lib/schema.d.ts +11 -3
  121. package/src/plugin-mcp-dist/lib/schema.d.ts.map +1 -1
  122. package/src/plugin-mcp-dist/lib/schema.js +18 -1
  123. package/src/plugin-mcp-dist/lib/schema.js.map +1 -1
  124. package/src/plugin-mcp-dist/lib/tunnel-integration.test.d.ts +2 -0
  125. package/src/plugin-mcp-dist/lib/tunnel-integration.test.d.ts.map +1 -0
  126. package/src/plugin-mcp-dist/lib/tunnel-integration.test.js +146 -0
  127. package/src/plugin-mcp-dist/lib/tunnel-integration.test.js.map +1 -0
  128. package/src/plugin-mcp-dist/lib/tunnel.d.ts +55 -0
  129. package/src/plugin-mcp-dist/lib/tunnel.d.ts.map +1 -0
  130. package/src/plugin-mcp-dist/lib/tunnel.js +116 -0
  131. package/src/plugin-mcp-dist/lib/tunnel.js.map +1 -0
  132. package/src/plugin-mcp-dist/lib/upstream-socket.d.ts +28 -0
  133. package/src/plugin-mcp-dist/lib/upstream-socket.d.ts.map +1 -0
  134. package/src/plugin-mcp-dist/lib/upstream-socket.js +55 -0
  135. package/src/plugin-mcp-dist/lib/upstream-socket.js.map +1 -0
  136. package/src/plugin-mcp-dist/lib/upstream-socket.test.d.ts +5 -0
  137. package/src/plugin-mcp-dist/lib/upstream-socket.test.d.ts.map +1 -0
  138. package/src/plugin-mcp-dist/lib/upstream-socket.test.js +211 -0
  139. package/src/plugin-mcp-dist/lib/upstream-socket.test.js.map +1 -0
  140. package/src/plugin-mcp-dist/lib/utils.d.ts +2 -2
  141. package/src/plugin-mcp-dist/lib/utils.d.ts.map +1 -1
  142. package/src/plugin-mcp-dist/lib/utils.js +13 -9
  143. package/src/plugin-mcp-dist/lib/utils.js.map +1 -1
  144. package/src/react.tsx +7 -19
  145. package/src/styles/framer.css +34 -64
  146. package/src/version.ts +1 -1
  147. package/dist/framer-chunks/default-blog-sqlite-7ZHEY3GT-27R5KAAW.js +0 -9
  148. package/dist/framer-chunks/fontshare-4THNDPMZ-BJQGNHXN.js +0 -27099
  149. package/dist/framer-chunks/fontshare-B2QLD7YB-4BZEAA37.js +0 -119
  150. package/dist/framer-chunks/fontshare-O22OBJ3D-ALBQLFE5.js +0 -825
  151. package/dist/framer-chunks/framer-font-45AI7UCZ-LU7DEIDM.js +0 -7
  152. package/dist/framer-chunks/google-3FCAKCAC-P5EL6KGL.js +0 -623876
  153. package/dist/framer-chunks/google-3SZHWBC6-OBXS3UIH.js +0 -1627
  154. package/dist/framer-chunks/google-GXDJLGJB-HHIXFE4M.js +0 -6885
  155. package/dist/framer-chunks/sqlite-wasm-FGP37EAY-HR6PIAJQ.js +0 -11479
  156. package/dist/framer-chunks/sqlite3-SISQ6ENZ-KMXYXSSV.js +0 -9
  157. package/dist/generated/api-client.d.ts +0 -21
  158. package/dist/generated/api-client.d.ts.map +0 -1
  159. package/dist/generated/api-client.js +0 -27
  160. package/dist/generated/api-client.js.map +0 -1
  161. package/src/generated/api-client.d.ts +0 -1238
  162. package/src/generated/api-client.js +0 -26
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- <div align='center'>
1
+ <div hidden align='center'>
2
2
  <br/>
3
3
  <br/>
4
4
  <h3>unframer</h3>
@@ -23,7 +23,7 @@ You can watch a [Video Tutorial on YouTube here](https://www.youtube.com/watch?v
23
23
  npm install unframer react@19 react-dom@19
24
24
  ```
25
25
 
26
- 1. Install the [`React Export` Framer plugin](https://www.framer.com/marketplace/plugins/react-export/), open it and select which components you want to export.
26
+ 1. Install the [`React Export` Framer plugin](https://framer.link/TGWRs2U), open it and select which components you want to export.
27
27
 
28
28
  1. Run the command `npx unframer {projectId} --outDir ./src/framer` to download the components and their types in the `outDir` directory.
29
29
  Run this command every time you add a new Framer component.
@@ -297,7 +297,7 @@ If you find any errors rendering your components:
297
297
 
298
298
  ## Future Compatibility
299
299
 
300
- Every Framer runtime change is upstreamed automatically via Github Actions to this [file](unframer/src/framer.js) and an example app is deployed [here](https://unframer-nextjs-app.vercel.app/). This means that if something breaks it's easy to bisect the specific change and fix it.
300
+ Every Framer runtime change is upstreamed automatically via Github Actions to this [file](https://github.com/remorses/unframer/blob/main/unframer/src/framer.js) and an example app is deployed [here](https://unframer-nextjs-app.vercel.app/). This means that if something breaks it's easy to bisect the specific change and fix it.
301
301
 
302
302
  For example in May 2024 Framer upgraded to React 19 and unframer broke, the reason was that framer runtime no longer injected ssr styles to `head` because react should do it automatically from version 19, this however broke unframer when using react 18, but i was able to quickly fix it by adding back the code to inject styles to `head` in unframer.
303
303
 
@@ -309,11 +309,11 @@ Here is the below landing page Lighthouse score when using Astro:
309
309
 
310
310
  > **Important**: For best performance in development, disable React strict mode. Strict mode causes components to mount and unmount twice, which can cause issues with Framer animations and state management.
311
311
 
312
- ![lighthouse score](./assets/astro-performance.png)
312
+ ![lighthouse score](https://raw.githubusercontent.com/remorses/unframer/main/assets/astro-performance.png)
313
313
 
314
314
  ## Example
315
315
 
316
- Look at the [nextjs-app source code folder](./nextjs-app) for an example and [the deployed website here](https://unframer-nextjs-app.vercel.app/)
316
+ Look at the [nextjs-app source code folder](https://github.com/remorses/unframer/tree/main/nextjs-app) for an example and [the deployed website here](https://unframer-nextjs-app.vercel.app/)
317
317
 
318
318
  ## MCP CLI Commands
319
319
 
@@ -12,4 +12,13 @@ export declare function babelPluginJsxTransform({ types: t }: {
12
12
  CallExpression(path: any): void;
13
13
  };
14
14
  };
15
+ /**
16
+ * Injects `suppressHydrationWarning: true` into _jsx/_jsxs call props for elements
17
+ * that support it: lowercase HTML elements (div, span, etc.) and motion.* components.
18
+ * This prevents React hydration mismatch warnings caused by Framer's runtime rendering
19
+ * differently on server vs client (e.g. motion.div with layoutId, SVG containers, style attributes).
20
+ */
21
+ export declare function babelPluginSuppressHydration({ types: t }: {
22
+ types: typeof BabelTypes;
23
+ }): PluginObj;
15
24
  //# sourceMappingURL=babel-jsx.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"babel-jsx.d.ts","sourceRoot":"","sources":["../src/babel-jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,UAAU,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQ5C,wBAAgB,4BAA4B,CAAC,EACzC,KAAK,EAAE,CAAC,EACX,EAAE;IACC,KAAK,EAAE,OAAO,UAAU,CAAA;CAC3B,GAAG,SAAS,CAuDZ;AAMD,wBAAgB,uBAAuB,CAAC,EACpC,KAAK,EAAE,CAAC,EACX,EAAE;IACC,KAAK,EAAE,OAAO,UAAU,CAAA;CAC3B;;;;;;EA8LA"}
1
+ {"version":3,"file":"babel-jsx.d.ts","sourceRoot":"","sources":["../src/babel-jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,UAAU,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQ5C,wBAAgB,4BAA4B,CAAC,EACzC,KAAK,EAAE,CAAC,EACX,EAAE;IACC,KAAK,EAAE,OAAO,UAAU,CAAA;CAC3B,GAAG,SAAS,CAuDZ;AAMD,wBAAgB,uBAAuB,CAAC,EACpC,KAAK,EAAE,CAAC,EACX,EAAE;IACC,KAAK,EAAE,OAAO,UAAU,CAAA;CAC3B;;;;;;EA8LA;AAoBD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EACzC,KAAK,EAAE,CAAC,EACX,EAAE;IACC,KAAK,EAAE,OAAO,UAAU,CAAA;CAC3B,GAAG,SAAS,CAqFZ"}
package/dist/babel-jsx.js CHANGED
@@ -224,4 +224,76 @@ function canRenderAsJsx(name) {
224
224
  const first = name[0];
225
225
  return first.toUpperCase() === first;
226
226
  }
227
+ /**
228
+ * Injects `suppressHydrationWarning: true` into _jsx/_jsxs call props for elements
229
+ * that support it: lowercase HTML elements (div, span, etc.) and motion.* components.
230
+ * This prevents React hydration mismatch warnings caused by Framer's runtime rendering
231
+ * differently on server vs client (e.g. motion.div with layoutId, SVG containers, style attributes).
232
+ */
233
+ export function babelPluginSuppressHydration({ types: t, }) {
234
+ const jsxFunctions = new Set();
235
+ const fragmentNames = new Set();
236
+ return {
237
+ name: 'suppress-hydration-warning',
238
+ visitor: {
239
+ ImportDeclaration(path) {
240
+ const source = path.node.source.value;
241
+ if (source === 'react/jsx-runtime' ||
242
+ source === 'react/jsx-dev-runtime') {
243
+ for (const specifier of path.node.specifiers) {
244
+ if (t.isImportSpecifier(specifier) &&
245
+ t.isIdentifier(specifier.imported)) {
246
+ if (specifier.imported.name === 'jsx' ||
247
+ specifier.imported.name === 'jsxs') {
248
+ jsxFunctions.add(specifier.local.name);
249
+ }
250
+ if (specifier.imported.name === 'Fragment') {
251
+ fragmentNames.add(specifier.local.name);
252
+ }
253
+ }
254
+ }
255
+ }
256
+ if (source === 'react') {
257
+ for (const specifier of path.node.specifiers) {
258
+ if (t.isImportSpecifier(specifier) &&
259
+ t.isIdentifier(specifier.imported) &&
260
+ specifier.imported.name === 'Fragment') {
261
+ fragmentNames.add(specifier.local.name);
262
+ }
263
+ }
264
+ }
265
+ },
266
+ CallExpression(path) {
267
+ if (!t.isIdentifier(path.node.callee) ||
268
+ !jsxFunctions.has(path.node.callee.name)) {
269
+ return;
270
+ }
271
+ const [elementArg, propsArg] = path.node.arguments;
272
+ if (!propsArg || !t.isObjectExpression(propsArg)) {
273
+ return;
274
+ }
275
+ // Skip React.Fragment — it only accepts key and children props.
276
+ // Handles both `Fragment` (Identifier) and `React.Fragment` (MemberExpression).
277
+ if (t.isIdentifier(elementArg) && fragmentNames.has(elementArg.name)) {
278
+ return;
279
+ }
280
+ if (t.isMemberExpression(elementArg) &&
281
+ t.isIdentifier(elementArg.property) &&
282
+ elementArg.property.name === 'Fragment') {
283
+ return;
284
+ }
285
+ // Skip if suppressHydrationWarning is already present
286
+ const alreadyHas = propsArg.properties.some((prop) => {
287
+ return (t.isObjectProperty(prop) &&
288
+ t.isIdentifier(prop.key) &&
289
+ prop.key.name === 'suppressHydrationWarning');
290
+ });
291
+ if (alreadyHas) {
292
+ return;
293
+ }
294
+ propsArg.properties.unshift(t.objectProperty(t.identifier('suppressHydrationWarning'), t.booleanLiteral(true)));
295
+ },
296
+ },
297
+ };
298
+ }
227
299
  //# sourceMappingURL=babel-jsx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"babel-jsx.js","sourceRoot":"","sources":["../src/babel-jsx.ts"],"names":[],"mappings":"AAGA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC7B,YAAY;IACZ,mBAAmB;IACnB,gBAAgB;CACnB,CAAC,CAAA;AAEF,MAAM,UAAU,4BAA4B,CAAC,EACzC,KAAK,EAAE,CAAC,GAGX,EAAa;IACV,MAAM,MAAM,GAAc;QACtB,IAAI,EAAE,iCAAiC;QACvC,OAAO,EAAE;YACL,sBAAsB,EAAE;gBACpB,IAAI,CAAC,IAAI,EAAE;oBACP,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;oBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAA;oBAC9B,MAAM,UAAU,GACZ,MAAM;wBACN,MAAM,CAAC,YAAY,EAAE;wBACrB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;wBACpC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;wBACd,OAAM;oBACV,CAAC;oBACD,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;oBAC1B,CAAC;yBAAM,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;wBACnC,sDAAsD;wBACtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAC9B,CAAC,OAAO,EAAE,EAAE,CACR,OAAO;4BACP,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;gCACpB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CACpC,CAAA;wBACD,IAAI,MAAM,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAChD,IAAI,CAAC;gCACD,MAAM,QAAQ,GAA2B;oCACrC,IAAI,EAAE,aAAa;oCACnB,eAAe,EAAE;wCACb,IAAI,EAAE,oBAAoB;qCAC7B;oCACD,eAAe,EAAE;wCACb,IAAI,EAAE,oBAAoB;qCAC7B;oCACD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC1B,QAAQ,CACJ;iCACX,CAAA;gCACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;4BAC9B,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACT,OAAO,CAAC,KAAK,CACT,wCAAwC,EACxC,IAAI,EACJ,CAAC,CACJ,CAAA;4BACL,CAAC;wBACL,CAAC;oBACL,CAAC;gBAAA,CACJ;aACJ;SACJ;KACJ,CAAA;IACD,OAAO,MAAM,CAAA;AAAA,CAChB;AAED,SAAS,QAAQ,CAAI,KAAQ,EAA2B;IACpD,OAAO,KAAK,IAAI,IAAI,CAAA;AAAA,CACvB;AAED,MAAM,UAAU,uBAAuB,CAAC,EACpC,KAAK,EAAE,CAAC,GAGX,EAAE;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,OAAO;QACH,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE;YACL,iBAAiB,CAAC,IAAI,EAAE;gBACpB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;gBAErC,kCAAkC;gBAClC,IACI,MAAM,KAAK,mBAAmB;oBAC9B,MAAM,KAAK,uBAAuB,EACpC,CAAC;oBACC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;wBACxC,IACI,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC;4BAC9B,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,EACpC,CAAC;4BACC,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAA;4BAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAA;4BAEtC,qCAAqC;4BACrC,IACI,UAAU,KAAK,KAAK;gCACpB,UAAU,KAAK,MAAM;gCACrB,UAAU,KAAK,UAAU,EAC3B,CAAC;gCACC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;4BAC/B,CAAC;wBACL,CAAC;oBAAA,CACJ,CAAC,CAAA;gBACN,CAAC;gBAED,kDAAkD;gBAClD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;wBACxC,IACI,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC;4BAC9B,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,EACpC,CAAC;4BACC,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAA;4BAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAA;4BAEtC,sDAAsD;4BACtD,IACI,UAAU,KAAK,eAAe;gCAC9B,UAAU,KAAK,UAAU,EAC3B,CAAC;gCACC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;4BAC/B,CAAC;wBACL,CAAC;oBAAA,CACJ,CAAC,CAAA;gBACN,CAAC;YAAA,CACJ;YACD,cAAc,CAAC,IAAI,EAAE;gBACjB,oCAAoC;gBACpC,IACI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;oBACjB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAC1C,CAAC;oBACC,OAAM;gBACV,CAAC;gBAED,kCAAkC;gBAClC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,eAAe;wBACrB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpD,CAAA;gBACT,CAAC;gBAED,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;gBAElD,4BAA4B;gBAC5B,IAAI,WAAW,GAAG,EAAE,CAAA;gBACpB,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACzC,WAAW,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACzE,CAAC;qBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC7C,WAAW,GAAG,UAAU,CAAC,KAAK,CAAA;gBAClC,CAAC;qBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;wBACnC,OAAM;oBACV,CAAC;oBACD,WAAW,GAAG,UAAU,CAAC,IAAI,CAAA;gBACjC,CAAC;qBAAM,CAAC;oBACJ,0CAA0C;oBAC1C,OAAM;gBACV,CAAC;gBAED,yBAAyB;gBACzB,MAAM,UAAU,GAA0B;oBACtC,IAAI,EAAE,YAAY;oBAClB,cAAc,EAAE;wBACZ,IAAI,EAAE,mBAAmB;wBACzB,IAAI,EAAE;4BACF,IAAI,EAAE,eAAe;4BACrB,IAAI,EAAE,WAAW;yBACpB;wBACD,UAAU,EAAE,EAAE;wBACd,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,UAAU,CACpC;qBACJ;oBACD,cAAc,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,UAAU,CACpC;wBACG,CAAC,CAAC;4BACI,IAAI,EAAE,mBAAmB;4BACzB,IAAI,EAAE;gCACF,IAAI,EAAE,eAAe;gCACrB,IAAI,EAAE,WAAW;6BACpB;yBACJ;wBACH,CAAC,CAAC,IAAI;oBACV,QAAQ,EAAE,EAAE;iBACf,CAAA;gBAED,iBAAiB;gBACjB,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAClC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;4BAChC,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;gCACtC,IAAI,EAAE,oBAAoB;gCAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;6BAC1B,CAAC,CAAA;wBACN,CAAC;6BAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;4BACvC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gCACxC,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CACzC,CAAC,OAAO,EAAE,EAAE,CAAC;oCACT,IACI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EACpC,CAAC;wCACC,OAAO,OAAO,CAAA;oCAClB,CAAC;oCACD,OAAO;wCACH,IAAI,EAAE,wBAAwB;wCAC9B,UAAU,EAAE,OAAO;qCACtB,CAAA;gCAAA,CACJ,CACJ,CAAA;4BACL,CAAC;iCAAM,CAAC;gCACJ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oCACxC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gCACtC,CAAC;qCAAM,CAAC;oCACJ,UAAU,CAAC,QAAQ,GAAG;wCAClB;4CACI,IAAI,EAAE,wBAAwB;4CAC9B,UAAU,EAAE,IAAI,CAAC,KAAK;yCACzB;qCACJ,CAAA;gCACL,CAAC;4BACL,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACJ,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAA;4BAC7B,IACI,CAAC,QAAQ;gCACT,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,eAAe,EACpC,CAAC;gCACC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAA;4BAC7B,CAAC;4BACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACZ,OAAO,CAAC,GAAG,CACP,yBAAyB,IAAI,CAAC,SAAS,CACnC,IAAI,CACP,EAAE,CACN,CAAA;gCACD,OAAM;4BACV,CAAC;4BAED,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC;gCACtC,IAAI,EAAE,cAAc;gCACpB,IAAI,EAAE;oCACF,IAAI,EAAE,eAAe;oCACrB,IAAI,EAAE,QAAQ;iCACjB;gCACD,KAAK,EAAE;oCACH,IAAI,EAAE,wBAAwB;oCAC9B,UAAU,EAAE,IAAI,CAAC,KAAK;iCACzB;6BACJ,CAAC,CAAA;wBACN,CAAC;oBAAA,CACJ,CAAC,CAAA;gBACN,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;YAAA,CAC/B;SACJ;KACJ,CAAA;AAAA,CACJ;AAED,SAAS,qBAAqB,CAAC,GAAG,EAAE;IAChC,OAAO,IAAI,CAAC,SAAS,CACjB,CAAC,GAAG,GAAG,CAAC,EACR,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAC3D,CAAC,CACJ,CAAA;AAAA,CACJ;AAED,SAAS,cAAc,CAAC,IAAY,EAAW;IAC3C,0BAA0B;IAC1B,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAA;IAE/B,sCAAsC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACrB,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;AAAA,CACvC"}
1
+ {"version":3,"file":"babel-jsx.js","sourceRoot":"","sources":["../src/babel-jsx.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import './sentry.js';
2
2
  import { StyleToken } from './exporter.js';
3
- import { BreakpointSizes } from './css.js';
3
+ import { BreakpointSizes } from './css-core.js';
4
4
  export declare const cli: import("goke").Goke<{}>;
5
5
  export type Config = {
6
6
  jsx?: boolean;
@@ -51,7 +51,7 @@ export declare function configFromFetch({ projectId, externalPackages, allExtern
51
51
  outDir?: string | undefined;
52
52
  projectId: any;
53
53
  }): Promise<{
54
- websiteUrl: string | null;
54
+ websiteUrl: any;
55
55
  cwd: string;
56
56
  config: Config;
57
57
  }>;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,aAAa,CAAA;AAGpB,OAAO,EAAU,UAAU,EAA8B,MAAM,eAAe,CAAA;AAU9E,OAAO,EAAE,eAAe,EAA0B,MAAM,UAAU,CAAA;AAsBlE,eAAO,MAAM,GAAG,yBAAmB,CAAA;AAikBnC,MAAM,MAAM,MAAM,GAAG;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,UAAU,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KACzB,CAAA;IACD,oBAAoB,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,MAAM,CAAA;QACrB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;KAChB,EAAE,CAAA;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;QACrB,IAAI,EAAE,MAAM,CAAA;KACf,EAAE,CAAA;IAEH,OAAO,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACf,EAAE,CAAA;IACH,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6BAA6B,EAAE,uBAAuB,EAAE,CAAA;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAE/B,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IAEjB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAsB,eAAe,CAAC,EAClC,SAAS,EACT,gBAAiC,EACjC,WAAmB,EACnB,KAAU,EACV,MAAwC,EAC3C;;;;;;CAAA;;;;GAyHA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,aAAa,CAAA;AAGpB,OAAO,EAAU,UAAU,EAA8B,MAAM,eAAe,CAAA;AAS9E,OAAO,EAAE,eAAe,EAA0B,MAAM,eAAe,CAAA;AAuBvE,eAAO,MAAM,GAAG,yBAAmB,CAAA;AA4rBnC,MAAM,MAAM,MAAM,GAAG;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,UAAU,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KACzB,CAAA;IACD,oBAAoB,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,aAAa,EAAE,MAAM,CAAA;QACrB,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;KAChB,EAAE,CAAA;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;QACrB,IAAI,EAAE,MAAM,CAAA;KACf,EAAE,CAAA;IAEH,OAAO,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACf,EAAE,CAAA;IACH,WAAW,CAAC,EAAE,eAAe,CAAA;IAC7B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6BAA6B,EAAE,uBAAuB,EAAE,CAAA;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAE/B,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IAEjB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAiID,wBAAsB,eAAe,CAAC,EAClC,SAAS,EACT,gBAAiC,EACjC,WAAmB,EACnB,KAAU,EACV,MAAwC,EAC3C;;;;;;CAAA;;;;GA4HA"}
package/dist/cli.js CHANGED
@@ -7,15 +7,14 @@ import { fetch } from 'undici';
7
7
  import './sentry.js';
8
8
  import { input, select, password } from '@inquirer/prompts';
9
9
  import { bundle, createExampleComponentCode } from './exporter.js';
10
- import { createClient } from './generated/api-client.js';
11
10
  import { generateStackblitzFiles } from './stackblitz.js';
12
11
  import { goke, wrapJsonSchema } from 'goke';
13
12
  import { exec } from 'child_process';
14
13
  import { promisify } from 'util';
15
14
  import fs from 'fs';
16
15
  import path, { basename } from 'path';
17
- import { defaultBreakpointSizes } from './css.js';
18
- import { componentNameToPath, dedent, isTruthy, logger, sleep, spinner, } from './utils.js';
16
+ import { defaultBreakpointSizes } from './css-core.js';
17
+ import { componentNameToPath, dedent, isTruthy, kebabCase, logger, sleep, spinner, } from './utils.js';
19
18
  import { getPackageManager } from './package-manager.js';
20
19
  import { notifyError } from './sentry.js';
21
20
  import { dispatcher } from './undici-dispatcher.js';
@@ -24,14 +23,14 @@ import { addMcpCommands } from '@goke/mcp';
24
23
  const configNames = ['unframer.config.json', 'unframer.json'];
25
24
  export const cli = goke('unframer');
26
25
  let defaultOutDir = 'framer';
27
- cli.command('[projectId]', 'Run unframer with optional project ID')
26
+ cli.command('[...projectIds]', 'Run unframer with one or more project IDs')
28
27
  .option('--outDir <dir>', 'Output directory')
29
28
  .option('--external [package]', 'Make some package external, do not pass a package name to make all packages external')
30
29
  .option('--watch', 'Watch for changes and rebuild')
31
30
  .option('--jsx', 'Output jsx code instead of minified .js code')
32
31
  .option('--debug', 'Enable debug logging')
33
32
  .option('--metafile', 'Generate meta.json file with build metadata')
34
- .action(async function main(projectId, options) {
33
+ .action(async function main(projectIds, options) {
35
34
  const outDir = options.outDir || defaultOutDir;
36
35
  const jsx = options.jsx ?? true;
37
36
  const external_ = options.external;
@@ -47,17 +46,30 @@ cli.command('[projectId]', 'Run unframer with optional project ID')
47
46
  const controller = new AbortController();
48
47
  const signal = controller.signal;
49
48
  const watch = options.watch;
50
- if (projectId) {
51
- const { config, cwd, websiteUrl } = await configFromFetch({
52
- allExternal,
53
- externalPackages,
54
- outDir,
55
- projectId,
56
- });
49
+ if (projectIds.length > 0) {
50
+ if (watch && projectIds.length > 1) {
51
+ console.error('--watch is only supported with a single project ID');
52
+ process.exit(1);
53
+ }
54
+ // Fetch configs for all project IDs
55
+ const fetchResults = await Promise.all(projectIds.map((projectId) => {
56
+ return configFromFetch({
57
+ allExternal,
58
+ externalPackages,
59
+ outDir,
60
+ projectId,
61
+ });
62
+ }));
63
+ // Merge configs when multiple projects are provided, otherwise use single config directly
64
+ const mergedConfig = fetchResults.length === 1
65
+ ? fetchResults[0].config
66
+ : mergeConfigs(fetchResults.map((r) => r.config));
67
+ const cwd = fetchResults[0].cwd;
68
+ const websiteUrl = fetchResults[0].websiteUrl;
57
69
  const { rebuild, buildContext } = await bundle({
58
70
  config: {
59
71
  jsx,
60
- ...config,
72
+ ...mergedConfig,
61
73
  },
62
74
  watch,
63
75
  cwd,
@@ -335,13 +347,14 @@ const hasMcpCommand = cliArgs.includes('mcp');
335
347
  const hasProjectOption = cliArgs.some((arg) => {
336
348
  return arg === '--project' || arg.startsWith('--project=');
337
349
  });
338
- const shouldUseServerApiForProjectOption = hasMcpCommand && hasProjectOption;
339
- const mcpMode = shouldUseServerApiForProjectOption
350
+ const hasMcpEvalCommand = hasMcpCommand && cliArgs.includes('eval');
351
+ const hasServerApiEnv = Boolean(process.env.FRAMER_PROJECT_URL || process.env.FRAMER_API_KEY);
352
+ const shouldUseServerApi = hasMcpCommand && (hasProjectOption || hasMcpEvalCommand || hasServerApiEnv);
353
+ const mcpMode = shouldUseServerApi
340
354
  ? 'server-api'
341
355
  : config.mode || (config.mcpUrl ? 'plugin' : undefined);
342
356
  if (mcpMode === 'server-api') {
343
357
  // Server API mode - use framer-api directly
344
- // Commands are registered via registerServerApiCommands below
345
358
  await registerServerApiCommands();
346
359
  }
347
360
  else {
@@ -379,9 +392,103 @@ else {
379
392
  async function registerServerApiCommands() {
380
393
  // Dynamic import to avoid loading framer-api in plugin mode
381
394
  const { connect } = await import('framer-api');
395
+ // `mcp eval` — run arbitrary framer-api code against a project.
396
+ // Useful for testing API calls before implementing them in MCP tools.
397
+ // The `framer` client is available as a local variable inside the evaluated code.
398
+ cli.command('mcp eval [code]', 'Evaluate arbitrary framer-api code against a project')
399
+ .option('--project <url>', 'Framer project URL. Also reads FRAMER_PROJECT_URL env var.')
400
+ .action(async (code, options) => {
401
+ // Read code from argument or stdin
402
+ let evalCode = code;
403
+ if (!evalCode && !process.stdin.isTTY) {
404
+ const chunks = [];
405
+ for await (const chunk of process.stdin) {
406
+ chunks.push(chunk);
407
+ }
408
+ evalCode = Buffer.concat(chunks).toString('utf-8').trim();
409
+ }
410
+ if (!evalCode) {
411
+ console.error('No code provided. Pass as argument or pipe via stdin.');
412
+ process.exit(1);
413
+ }
414
+ const projectUrl = options.project ||
415
+ process.env.FRAMER_PROJECT_URL ||
416
+ loadConfig().framerProjectUrl;
417
+ const apiKey = process.env.FRAMER_API_KEY || loadConfig().framerApiKey;
418
+ if (!projectUrl) {
419
+ console.error('Project URL required. Use --project option, FRAMER_PROJECT_URL env var, or set during login.');
420
+ process.exit(1);
421
+ }
422
+ if (!apiKey) {
423
+ console.error('API key required. Set FRAMER_API_KEY env var or run `unframer mcp login` first.');
424
+ process.exit(1);
425
+ }
426
+ let framerClient;
427
+ let actionError;
428
+ try {
429
+ spinner.start('Connecting to Framer...');
430
+ framerClient = await connect(projectUrl, apiKey);
431
+ spinner.stop('Connected');
432
+ // Build an async function body. If the code is a single expression
433
+ // (no semicolons and no newlines), wrap it as a return so the result is captured.
434
+ const isExpression = !evalCode.includes(';') && !evalCode.includes('\n');
435
+ const functionBody = isExpression
436
+ ? `return (${evalCode})`
437
+ : evalCode;
438
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
439
+ const fn = new AsyncFunction('framer', functionBody);
440
+ const result = await fn(framerClient);
441
+ if (result !== undefined) {
442
+ const output = (() => {
443
+ try {
444
+ return JSON.stringify(result, null, 2);
445
+ }
446
+ catch {
447
+ return String(result);
448
+ }
449
+ })();
450
+ console.log(output);
451
+ }
452
+ }
453
+ catch (error) {
454
+ actionError = error;
455
+ }
456
+ finally {
457
+ if (framerClient) {
458
+ try {
459
+ await framerClient.disconnect();
460
+ }
461
+ catch (disconnectError) {
462
+ logger.error('Failed disconnecting from Framer:', disconnectError);
463
+ }
464
+ }
465
+ }
466
+ if (actionError) {
467
+ console.error('Eval failed:', actionError instanceof Error ? actionError.message : actionError);
468
+ if (actionError instanceof Error && actionError.stack) {
469
+ console.error(actionError.stack);
470
+ }
471
+ process.exit(1);
472
+ }
473
+ });
382
474
  // Import tool definitions and handler from plugin-mcp
383
475
  // Note: Run `pnpm --filter plugin-mcp build && pnpm --filter plugin-mcp gen-unframer` first
384
- const { mcpTools, mcpToolHandler } = await import('./plugin-mcp-dist/lib/mcp-handlers.js');
476
+ let mcpTools;
477
+ let mcpToolHandler;
478
+ try {
479
+ const imported = await import('./plugin-mcp-dist/lib/mcp-handlers.js');
480
+ mcpTools = imported.mcpTools;
481
+ mcpToolHandler = imported.mcpToolHandler;
482
+ }
483
+ catch (error) {
484
+ if (hasMcpEvalCommand) {
485
+ // eval command only needs framer-api, not plugin-mcp handlers
486
+ logger.log('Could not load plugin-mcp handlers:', error instanceof Error ? error.message : error);
487
+ }
488
+ else {
489
+ throw new Error('Failed to load plugin-mcp handlers. Run: pnpm --filter plugin-mcp tsc --incremental && pnpm --filter plugin-mcp gen-unframer', { cause: error });
490
+ }
491
+ }
385
492
  if (!mcpTools || !mcpToolHandler) {
386
493
  return;
387
494
  }
@@ -480,48 +587,161 @@ async function registerServerApiCommands() {
480
587
  });
481
588
  }
482
589
  }
590
+ /**
591
+ * Merge multiple project configs into a single Config so esbuild bundles all
592
+ * components together and deduplicates shared chunks automatically.
593
+ *
594
+ * - Components maps are merged; on name collision the second project's component
595
+ * is prefixed with the project name to disambiguate.
596
+ * - First project's projectId/projectName/fullFramerProjectId are used as the
597
+ * primary identifiers (framerSiteId in ContextProviders).
598
+ * - Arrays (componentBreakpoints, tokens, locales, framerWebPages, etc.) are concatenated.
599
+ */
600
+ function mergeConfigs(configs) {
601
+ if (configs.length === 0) {
602
+ throw new Error('mergeConfigs called with empty array');
603
+ }
604
+ if (configs.length === 1) {
605
+ return configs[0];
606
+ }
607
+ const first = configs[0];
608
+ // Merge components maps, disambiguating name collisions.
609
+ // Track rename maps per config so we can update breakpoints and instances.
610
+ const mergedComponents = {};
611
+ const renameMaps = [];
612
+ for (const config of configs) {
613
+ const projectSlug = kebabCase(config.projectName || config.projectId || '');
614
+ const renameMap = new Map();
615
+ renameMaps.push(renameMap);
616
+ for (const [name, url] of Object.entries(config.components)) {
617
+ if (mergedComponents[name]) {
618
+ // Name collision: prefix with project slug, ensure uniqueness with numeric suffix
619
+ const base = projectSlug ? `${projectSlug}/${name}` : `${config.projectId}/${name}`;
620
+ const disambiguated = uniqueComponentName(base, mergedComponents);
621
+ logger.log(`Component name collision for "${name}", renaming to "${disambiguated}"`);
622
+ renameMap.set(name, disambiguated);
623
+ mergedComponents[disambiguated] = url;
624
+ }
625
+ else {
626
+ mergedComponents[name] = url;
627
+ }
628
+ }
629
+ }
630
+ // Merge componentBreakpoints, updating componentName for any renamed components
631
+ const mergedBreakpoints = configs.flatMap((config, i) => {
632
+ const renameMap = renameMaps[i];
633
+ return (config.componentBreakpoints || []).map((bp) => {
634
+ const renamed = renameMap.get(bp.componentName);
635
+ if (renamed) {
636
+ return { ...bp, componentName: renamed };
637
+ }
638
+ return bp;
639
+ });
640
+ });
641
+ // Merge tokens, deduplicate by id (keep first occurrence)
642
+ const seenTokenIds = new Set();
643
+ const mergedTokens = configs.flatMap((config) => {
644
+ return (config.tokens || []).filter((token) => {
645
+ if (seenTokenIds.has(token.id)) {
646
+ return false;
647
+ }
648
+ seenTokenIds.add(token.id);
649
+ return true;
650
+ });
651
+ });
652
+ // Merge locales, deduplicate by code
653
+ const seenLocaleCodes = new Set();
654
+ const mergedLocales = configs.flatMap((config) => {
655
+ return (config.locales || []).filter((locale) => {
656
+ if (seenLocaleCodes.has(locale.code)) {
657
+ return false;
658
+ }
659
+ seenLocaleCodes.add(locale.code);
660
+ return true;
661
+ });
662
+ });
663
+ // Merge framerWebPages
664
+ const mergedWebPages = configs.flatMap((config) => {
665
+ return config.framerWebPages || [];
666
+ });
667
+ // Merge componentInstancesInIndexPage, updating componentPathSlug for renamed components
668
+ const mergedInstances = configs.flatMap((config, i) => {
669
+ const renameMap = renameMaps[i];
670
+ return (config.componentInstancesInIndexPage || []).map((instance) => {
671
+ const renamed = renameMap.get(instance.componentPathSlug);
672
+ if (renamed) {
673
+ return { ...instance, componentPathSlug: renamed };
674
+ }
675
+ return instance;
676
+ });
677
+ }).sort((a, b) => {
678
+ return a.pageOrdering - b.pageOrdering;
679
+ });
680
+ const projectNames = configs
681
+ .map((c) => c.projectName)
682
+ .filter(isTruthy);
683
+ spinner.info(`Merging ${configs.length} projects: ${projectNames.join(', ')}`);
684
+ return {
685
+ ...first,
686
+ components: mergedComponents,
687
+ componentBreakpoints: mergedBreakpoints,
688
+ tokens: mergedTokens,
689
+ locales: mergedLocales,
690
+ framerWebPages: mergedWebPages,
691
+ componentInstancesInIndexPage: mergedInstances,
692
+ };
693
+ }
694
+ /** Generate a unique component name by appending a numeric suffix if the base already exists */
695
+ function uniqueComponentName(base, existing) {
696
+ if (!existing[base]) {
697
+ return base;
698
+ }
699
+ let index = 2;
700
+ while (existing[`${base}-${index}`]) {
701
+ index++;
702
+ }
703
+ return `${base}-${index}`;
704
+ }
483
705
  export async function configFromFetch({ projectId, externalPackages = [], allExternal = false, agent = '', outDir = undefined, }) {
484
706
  logger.log(`Fetching config for project ${projectId}`);
485
- const url = process.env.UNFRAMER_SERVER_URL;
486
- if (url) {
487
- console.log(`using server url ${url}`);
707
+ const baseUrl = (process.env.UNFRAMER_SERVER_URL || 'https://unframer.co').replace(/\/$/, '');
708
+ if (process.env.UNFRAMER_SERVER_URL) {
709
+ console.log(`using server url ${baseUrl}`);
488
710
  }
489
- const client = await createClient({
490
- url: url || 'https://unframer.co',
491
- headers: {
492
- 'X-Agent': agent ||
493
- (process.env.GITHUB_ACTIONS === 'true'
494
- ? 'github-actions'
495
- : 'cli'),
496
- },
497
- });
498
711
  spinner.start(`Fetching config for project ${projectId}`);
499
- const { data, error } = await client.api.plugins.reactExportPlugin
500
- .project({ projectId })
501
- .get();
502
- if (error) {
503
- if (error.status === 402) {
504
- const rawValue = error.value;
505
- const buyUrl = rawValue?.buyUrl;
712
+ const agentHeader = agent ||
713
+ (process.env.GITHUB_ACTIONS === 'true' ? 'github-actions' : 'cli');
714
+ const response = await fetch(`${baseUrl}/api/plugins/reactExportPlugin/project/${encodeURIComponent(projectId)}`, { headers: { 'X-Agent': agentHeader } });
715
+ const text = await response.text();
716
+ const parsed = (() => {
717
+ try {
718
+ return JSON.parse(text);
719
+ }
720
+ catch {
721
+ return text;
722
+ }
723
+ })();
724
+ if (!response.ok) {
725
+ if (response.status === 402) {
726
+ const buyUrl = parsed?.buyUrl;
506
727
  const message = (() => {
507
- if (typeof rawValue === 'object' && rawValue?.message) {
508
- return String(rawValue.message);
728
+ if (typeof parsed === 'object' && parsed?.message) {
729
+ return String(parsed.message);
509
730
  }
510
731
  return 'A React Export subscription is required to download components.';
511
732
  })();
512
- // spinner.error(details)
513
733
  spinner.error(message);
514
734
  console.info('');
515
735
  console.info('Go to this url to buy the Framer React Export subscription:\n');
516
736
  console.info(green(buyUrl));
517
737
  console.info();
518
738
  process.exit(1);
519
- // throw new Error(details, { cause: error })
520
739
  }
521
740
  spinner.error('Error fetching project data:');
522
- console.error(error);
523
- throw error;
741
+ console.error(parsed);
742
+ throw new Error(`HTTP ${response.status}`, { cause: parsed });
524
743
  }
744
+ const data = parsed;
525
745
  spinner.info(`Got Framer project data`);
526
746
  const websiteUrl = data?.project?.websiteUrl;
527
747
  const projectName = data?.project?.projectName || '';