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.
- package/README.md +5 -5
- package/dist/babel-jsx.d.ts +9 -0
- package/dist/babel-jsx.d.ts.map +1 -1
- package/dist/babel-jsx.js +72 -0
- package/dist/babel-jsx.js.map +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +262 -42
- package/dist/cli.js.map +1 -1
- package/dist/css-core.d.ts +50 -0
- package/dist/css-core.d.ts.map +1 -0
- package/dist/css-core.js +231 -0
- package/dist/css-core.js.map +1 -0
- package/dist/css.d.ts +9 -43
- package/dist/css.d.ts.map +1 -1
- package/dist/css.js +9 -232
- package/dist/css.js.map +1 -1
- package/dist/exporter.d.ts +1 -1
- package/dist/exporter.d.ts.map +1 -1
- package/dist/exporter.js +72 -11
- package/dist/exporter.js.map +1 -1
- package/dist/exporter.test.js +78 -0
- package/dist/exporter.test.js.map +1 -1
- package/dist/framer-chunks/{SqliteDatabase-VAKIICSG-R7ZS6CHH.js → SqliteDatabase-VAKIICSG-OPV4MG3Y.js} +5 -4
- package/dist/framer-chunks/{chunk-2DZGP7C2.js → chunk-7ZLQTYXQ.js} +5 -24
- package/dist/framer-chunks/chunk-IKQSD2QC.js +10 -0
- package/dist/framer-chunks/default-blog-sqlite-7ZHEY3GT-TVGUYU6H.js +7 -0
- package/dist/framer-chunks/fontshare-4THNDPMZ-FLLTWCDO.js +7 -0
- package/dist/framer-chunks/fontshare-B2QLD7YB-5V3XZJAH.js +7 -0
- package/dist/framer-chunks/fontshare-O22OBJ3D-FIG3CRN3.js +7 -0
- package/dist/framer-chunks/framer-font-45AI7UCZ-CKGC4MJC.js +7 -0
- package/dist/framer-chunks/google-3FCAKCAC-AM34UPJK.js +7 -0
- package/dist/framer-chunks/google-3SZHWBC6-2VTQEQ7J.js +7 -0
- package/dist/framer-chunks/google-GXDJLGJB-JNEJGCGD.js +7 -0
- package/dist/framer-chunks/sqlite-wasm-FGP37EAY-NO5QVZDI.js +7 -0
- package/dist/framer-chunks/sqlite3-SISQ6ENZ-5WRKGWTY.js +7 -0
- package/dist/framer.d.ts +128 -0
- package/dist/framer.js +820 -428
- package/dist/plugin-mcp-dist/lib/framer.d.ts +1 -7
- package/dist/plugin-mcp-dist/lib/framer.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/framer.js +90 -23
- package/dist/plugin-mcp-dist/lib/framer.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/framer.test.d.ts +2 -0
- package/dist/plugin-mcp-dist/lib/framer.test.d.ts.map +1 -0
- package/dist/plugin-mcp-dist/lib/framer.test.js +214 -0
- package/dist/plugin-mcp-dist/lib/framer.test.js.map +1 -0
- package/dist/plugin-mcp-dist/lib/mcp-handlers.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/mcp-handlers.js +69 -11
- package/dist/plugin-mcp-dist/lib/mcp-handlers.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/mcp.test.js +340 -364
- package/dist/plugin-mcp-dist/lib/mcp.test.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/plugin-websocket.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/plugin-websocket.js +0 -3
- package/dist/plugin-mcp-dist/lib/plugin-websocket.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/react-export.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/react-export.js +79 -61
- package/dist/plugin-mcp-dist/lib/react-export.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/schema.d.ts +8 -0
- package/dist/plugin-mcp-dist/lib/schema.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/schema.js +18 -1
- package/dist/plugin-mcp-dist/lib/schema.js.map +1 -1
- package/dist/plugin-mcp-dist/lib/store.d.ts +1 -1
- package/dist/plugin-mcp-dist/lib/store.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/tunnel-integration.test.d.ts +2 -0
- package/dist/plugin-mcp-dist/lib/tunnel-integration.test.d.ts.map +1 -0
- package/dist/plugin-mcp-dist/lib/tunnel-integration.test.js +147 -0
- package/dist/plugin-mcp-dist/lib/tunnel-integration.test.js.map +1 -0
- package/dist/plugin-mcp-dist/lib/tunnel.d.ts +46 -0
- package/dist/plugin-mcp-dist/lib/tunnel.d.ts.map +1 -0
- package/dist/plugin-mcp-dist/lib/tunnel.js +117 -0
- package/dist/plugin-mcp-dist/lib/tunnel.js.map +1 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.d.ts +13 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.d.ts.map +1 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.js +56 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.js.map +1 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.test.d.ts +2 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.test.d.ts.map +1 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.test.js +212 -0
- package/dist/plugin-mcp-dist/lib/upstream-socket.test.js.map +1 -0
- package/dist/plugin-mcp-dist/lib/utils.d.ts +1 -9
- package/dist/plugin-mcp-dist/lib/utils.d.ts.map +1 -1
- package/dist/plugin-mcp-dist/lib/utils.js +13 -9
- package/dist/plugin-mcp-dist/lib/utils.js.map +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -13
- package/dist/react.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -8
- package/src/babel-jsx.ts +99 -0
- package/src/cli.ts +295 -42
- package/src/css-core.ts +277 -0
- package/src/css.tsx +10 -276
- package/src/exporter.test.ts +82 -0
- package/src/exporter.ts +92 -11
- package/src/framer.d.ts +128 -0
- package/src/framer.js +820 -428
- package/src/plugin-mcp-dist/lib/framer.d.ts +2 -5
- package/src/plugin-mcp-dist/lib/framer.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/framer.js +90 -23
- package/src/plugin-mcp-dist/lib/framer.js.map +1 -1
- package/src/plugin-mcp-dist/lib/framer.test.d.ts +2 -0
- package/src/plugin-mcp-dist/lib/framer.test.d.ts.map +1 -0
- package/src/plugin-mcp-dist/lib/framer.test.js +213 -0
- package/src/plugin-mcp-dist/lib/framer.test.js.map +1 -0
- package/src/plugin-mcp-dist/lib/mcp-handlers.d.ts +2 -2
- package/src/plugin-mcp-dist/lib/mcp-handlers.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/mcp-handlers.js +69 -11
- package/src/plugin-mcp-dist/lib/mcp-handlers.js.map +1 -1
- package/src/plugin-mcp-dist/lib/mcp.test.js +340 -364
- package/src/plugin-mcp-dist/lib/mcp.test.js.map +1 -1
- package/src/plugin-mcp-dist/lib/plugin-websocket.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/plugin-websocket.js +0 -3
- package/src/plugin-mcp-dist/lib/plugin-websocket.js.map +1 -1
- package/src/plugin-mcp-dist/lib/react-export.d.ts +1 -1
- package/src/plugin-mcp-dist/lib/react-export.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/react-export.js +79 -61
- package/src/plugin-mcp-dist/lib/react-export.js.map +1 -1
- package/src/plugin-mcp-dist/lib/schema.d.ts +11 -3
- package/src/plugin-mcp-dist/lib/schema.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/schema.js +18 -1
- package/src/plugin-mcp-dist/lib/schema.js.map +1 -1
- package/src/plugin-mcp-dist/lib/tunnel-integration.test.d.ts +2 -0
- package/src/plugin-mcp-dist/lib/tunnel-integration.test.d.ts.map +1 -0
- package/src/plugin-mcp-dist/lib/tunnel-integration.test.js +146 -0
- package/src/plugin-mcp-dist/lib/tunnel-integration.test.js.map +1 -0
- package/src/plugin-mcp-dist/lib/tunnel.d.ts +55 -0
- package/src/plugin-mcp-dist/lib/tunnel.d.ts.map +1 -0
- package/src/plugin-mcp-dist/lib/tunnel.js +116 -0
- package/src/plugin-mcp-dist/lib/tunnel.js.map +1 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.d.ts +28 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.d.ts.map +1 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.js +55 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.js.map +1 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.test.d.ts +5 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.test.d.ts.map +1 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.test.js +211 -0
- package/src/plugin-mcp-dist/lib/upstream-socket.test.js.map +1 -0
- package/src/plugin-mcp-dist/lib/utils.d.ts +2 -2
- package/src/plugin-mcp-dist/lib/utils.d.ts.map +1 -1
- package/src/plugin-mcp-dist/lib/utils.js +13 -9
- package/src/plugin-mcp-dist/lib/utils.js.map +1 -1
- package/src/react.tsx +7 -19
- package/src/styles/framer.css +34 -64
- package/src/version.ts +1 -1
- package/dist/framer-chunks/default-blog-sqlite-7ZHEY3GT-27R5KAAW.js +0 -9
- package/dist/framer-chunks/fontshare-4THNDPMZ-BJQGNHXN.js +0 -27099
- package/dist/framer-chunks/fontshare-B2QLD7YB-4BZEAA37.js +0 -119
- package/dist/framer-chunks/fontshare-O22OBJ3D-ALBQLFE5.js +0 -825
- package/dist/framer-chunks/framer-font-45AI7UCZ-LU7DEIDM.js +0 -7
- package/dist/framer-chunks/google-3FCAKCAC-P5EL6KGL.js +0 -623876
- package/dist/framer-chunks/google-3SZHWBC6-OBXS3UIH.js +0 -1627
- package/dist/framer-chunks/google-GXDJLGJB-HHIXFE4M.js +0 -6885
- package/dist/framer-chunks/sqlite-wasm-FGP37EAY-HR6PIAJQ.js +0 -11479
- package/dist/framer-chunks/sqlite3-SISQ6ENZ-KMXYXSSV.js +0 -9
- package/dist/generated/api-client.d.ts +0 -21
- package/dist/generated/api-client.d.ts.map +0 -1
- package/dist/generated/api-client.js +0 -27
- package/dist/generated/api-client.js.map +0 -1
- package/src/generated/api-client.d.ts +0 -1238
- 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://
|
|
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
|
-

|
|
313
313
|
|
|
314
314
|
## Example
|
|
315
315
|
|
|
316
|
-
Look at the [nextjs-app source code folder](
|
|
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
|
|
package/dist/babel-jsx.d.ts
CHANGED
|
@@ -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
|
package/dist/babel-jsx.d.ts.map
CHANGED
|
@@ -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
|
package/dist/babel-jsx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babel-jsx.js","sourceRoot":"","sources":["../src/babel-jsx.ts"],"names":[],"mappings":"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"}
|
|
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:
|
|
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;
|
|
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('[
|
|
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(
|
|
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 (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
...
|
|
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
|
|
339
|
-
const
|
|
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
|
-
|
|
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
|
|
486
|
-
if (
|
|
487
|
-
console.log(`using server 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
|
|
500
|
-
.
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
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
|
|
508
|
-
return String(
|
|
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(
|
|
523
|
-
throw
|
|
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 || '';
|