@reframejs/unframer 4.2.0-reframe.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 (111) hide show
  1. package/README.md +389 -0
  2. package/bin.js +5 -0
  3. package/dist/babel-jsx.d.ts +24 -0
  4. package/dist/babel-jsx.js +299 -0
  5. package/dist/babel-plugin-imports.d.ts +15 -0
  6. package/dist/babel-plugin-imports.js +211 -0
  7. package/dist/babel-typedoc.d.ts +39 -0
  8. package/dist/babel-typedoc.js +76 -0
  9. package/dist/bin.d.ts +2 -0
  10. package/dist/bin.js +3 -0
  11. package/dist/cli.d.ts +59 -0
  12. package/dist/cli.js +821 -0
  13. package/dist/compat.d.ts +2 -0
  14. package/dist/compat.js +23 -0
  15. package/dist/config.d.ts +18 -0
  16. package/dist/config.js +27 -0
  17. package/dist/css-core.d.ts +50 -0
  18. package/dist/css-core.js +231 -0
  19. package/dist/css.d.ts +15 -0
  20. package/dist/css.js +36 -0
  21. package/dist/esbuild.d.ts +31 -0
  22. package/dist/esbuild.js +317 -0
  23. package/dist/exporter.d.ts +96 -0
  24. package/dist/exporter.js +1151 -0
  25. package/dist/flat-cache-interceptor.d.ts +24 -0
  26. package/dist/flat-cache-interceptor.js +87 -0
  27. package/dist/framer-chunks/chunk-IKQSD2QC.js +10 -0
  28. package/dist/framer-chunks/fontshare-PZLWRK4B-MHMZIGTX.js +7 -0
  29. package/dist/framer-chunks/fontshare-SXU5BGFE-OWTMMPGS.js +7 -0
  30. package/dist/framer-chunks/fontshare-TIA7QUPT-PUDLUTQ7.js +7 -0
  31. package/dist/framer-chunks/framer-font-RD2SUPQH-Q4MS7WS6.js +7 -0
  32. package/dist/framer-chunks/google-EGNT223R-P4DUHBW2.js +7 -0
  33. package/dist/framer-chunks/google-H6SFY4F5-5JSJCGDR.js +7 -0
  34. package/dist/framer-chunks/google-YSYBFRE6-L7YAHH7V.js +7 -0
  35. package/dist/framer-client.server.d.ts +4 -0
  36. package/dist/framer-client.server.js +45 -0
  37. package/dist/framer-package-versions.d.ts +781 -0
  38. package/dist/framer-package-versions.js +782 -0
  39. package/dist/framer-types.d.ts +30 -0
  40. package/dist/framer-types.js +35 -0
  41. package/dist/framer.d.ts +4990 -0
  42. package/dist/framer.js +64296 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.js +13 -0
  45. package/dist/package-manager.d.ts +10 -0
  46. package/dist/package-manager.js +138 -0
  47. package/dist/plugin-mcp-dist/lib/client-websocket.d.ts +5 -0
  48. package/dist/plugin-mcp-dist/lib/client-websocket.js +103 -0
  49. package/dist/plugin-mcp-dist/lib/cms.d.ts +10 -0
  50. package/dist/plugin-mcp-dist/lib/cms.js +58 -0
  51. package/dist/plugin-mcp-dist/lib/errors.d.ts +5 -0
  52. package/dist/plugin-mcp-dist/lib/errors.js +48 -0
  53. package/dist/plugin-mcp-dist/lib/framer-client.d.ts +2 -0
  54. package/dist/plugin-mcp-dist/lib/framer-client.js +4 -0
  55. package/dist/plugin-mcp-dist/lib/framer-client.server.d.ts +3 -0
  56. package/dist/plugin-mcp-dist/lib/framer-client.server.js +46 -0
  57. package/dist/plugin-mcp-dist/lib/framer.d.ts +30 -0
  58. package/dist/plugin-mcp-dist/lib/framer.js +1084 -0
  59. package/dist/plugin-mcp-dist/lib/hooks.d.ts +6 -0
  60. package/dist/plugin-mcp-dist/lib/hooks.js +46 -0
  61. package/dist/plugin-mcp-dist/lib/mcp-client.d.ts +142 -0
  62. package/dist/plugin-mcp-dist/lib/mcp-client.js +40 -0
  63. package/dist/plugin-mcp-dist/lib/mcp-handlers.d.ts +385 -0
  64. package/dist/plugin-mcp-dist/lib/mcp-handlers.js +1924 -0
  65. package/dist/plugin-mcp-dist/lib/mcp-tools.d.ts +5 -0
  66. package/dist/plugin-mcp-dist/lib/mcp-tools.js +5 -0
  67. package/dist/plugin-mcp-dist/lib/mcp-websocket.d.ts +10 -0
  68. package/dist/plugin-mcp-dist/lib/mcp-websocket.js +88 -0
  69. package/dist/plugin-mcp-dist/lib/plugin-websocket.d.ts +5 -0
  70. package/dist/plugin-mcp-dist/lib/plugin-websocket.js +170 -0
  71. package/dist/plugin-mcp-dist/lib/react-export.d.ts +51 -0
  72. package/dist/plugin-mcp-dist/lib/react-export.js +358 -0
  73. package/dist/plugin-mcp-dist/lib/schema.d.ts +276 -0
  74. package/dist/plugin-mcp-dist/lib/schema.js +907 -0
  75. package/dist/plugin-mcp-dist/lib/store.d.ts +2 -0
  76. package/dist/plugin-mcp-dist/lib/store.js +10 -0
  77. package/dist/plugin-mcp-dist/lib/tree-utils.d.ts +6 -0
  78. package/dist/plugin-mcp-dist/lib/tree-utils.js +141 -0
  79. package/dist/plugin-mcp-dist/lib/tunnel.d.ts +46 -0
  80. package/dist/plugin-mcp-dist/lib/tunnel.js +117 -0
  81. package/dist/plugin-mcp-dist/lib/types.d.ts +110 -0
  82. package/dist/plugin-mcp-dist/lib/types.js +188 -0
  83. package/dist/plugin-mcp-dist/lib/upstream-socket.d.ts +13 -0
  84. package/dist/plugin-mcp-dist/lib/upstream-socket.js +56 -0
  85. package/dist/plugin-mcp-dist/lib/utils.d.ts +13 -0
  86. package/dist/plugin-mcp-dist/lib/utils.js +57 -0
  87. package/dist/plugin-mcp-dist/lib/websocket-server.d.ts +10 -0
  88. package/dist/plugin-mcp-dist/lib/websocket-server.js +88 -0
  89. package/dist/plugin-mcp-dist/lib/xml.d.ts +10 -0
  90. package/dist/plugin-mcp-dist/lib/xml.js +395 -0
  91. package/dist/react.d.ts +76 -0
  92. package/dist/react.js +280 -0
  93. package/dist/renamer.d.ts +11 -0
  94. package/dist/renamer.js +139 -0
  95. package/dist/sentry.d.ts +2 -0
  96. package/dist/sentry.js +5 -0
  97. package/dist/stackblitz.d.ts +9 -0
  98. package/dist/stackblitz.js +179 -0
  99. package/dist/styles/framer.css +920 -0
  100. package/dist/styles/reset.css +37 -0
  101. package/dist/typescript.d.ts +24 -0
  102. package/dist/typescript.js +197 -0
  103. package/dist/undici-dispatcher.d.ts +2 -0
  104. package/dist/undici-dispatcher.js +10 -0
  105. package/dist/unframer-loader.d.ts +2 -0
  106. package/dist/unframer-loader.js +12 -0
  107. package/dist/utils.d.ts +20 -0
  108. package/dist/utils.js +81 -0
  109. package/dist/version.d.ts +2 -0
  110. package/dist/version.js +2 -0
  111. package/package.json +131 -0
@@ -0,0 +1,37 @@
1
+ :root {
2
+ -webkit-font-smoothing: antialiased;
3
+ -moz-osx-font-smoothing: grayscale;
4
+ }
5
+
6
+ * {
7
+ box-sizing: border-box;
8
+ -webkit-font-smoothing: inherit;
9
+ }
10
+
11
+ :where(
12
+ .unframer h1,
13
+ .unframer h2,
14
+ .unframer h3,
15
+ .unframer h4,
16
+ .unframer h5,
17
+ .unframer h6,
18
+ .unframer p,
19
+ .unframer figure
20
+ ) {
21
+ margin: 0;
22
+ }
23
+
24
+ :where(.unframer) {
25
+ line-height: normal;
26
+ }
27
+
28
+ :where(
29
+ .unframer,
30
+ .unframer input,
31
+ .unframer textarea,
32
+ .unframer select,
33
+ .unframer button
34
+ ) {
35
+ font-size: 12px;
36
+ font-family: sans-serif;
37
+ }
@@ -0,0 +1,24 @@
1
+ import type { PropertyControls } from './framer-types.js';
2
+ export declare function componentCamelCase(str: string): string;
3
+ export declare function componentImportedName({ componentPath, duplicateLeafNames }: {
4
+ componentPath: string;
5
+ duplicateLeafNames: ReadonlySet<string>;
6
+ }): string;
7
+ /**
8
+ * Generates TypeDoc comments that will be injected into JSX files
9
+ * instead of generating separate .d.ts files
10
+ */
11
+ export declare function propControlsToTypedocComments({ locales, componentImportedName, propertyControls, logger, includeLocaleTypes }: {
12
+ propertyControls: PropertyControls;
13
+ componentImportedName: string;
14
+ locales?: Array<{
15
+ slug: string;
16
+ }>;
17
+ logger: any;
18
+ includeLocaleTypes?: boolean;
19
+ }): {
20
+ headerComment: string;
21
+ responsiveComment: string;
22
+ defaultExportComment: string;
23
+ };
24
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1,197 @@
1
+ import { propCamelCaseJustLikeFramer } from './compat.js';
2
+ import { ControlType } from './framer-types.js';
3
+ export function componentCamelCase(str) {
4
+ str = str?.replace(/\.jsx?$/, '');
5
+ if (!str) {
6
+ return 'FramerComponent';
7
+ }
8
+ // Use the leaf component name by default so generated imports stay stable.
9
+ str = str.split('/').filter(Boolean).pop() || '';
10
+ // Replace all non-alphanumeric characters with space
11
+ // This handles spaces, special chars, underscores, hyphens, etc.
12
+ const words = str.replace(/[^a-zA-Z0-9]+/g, ' ').trim().split(/\s+/).filter(Boolean);
13
+ if (words.length === 0) {
14
+ return 'FramerComponent';
15
+ }
16
+ str = words
17
+ .map((word, index) => {
18
+ if (index === 0) {
19
+ return word[0].toUpperCase() + word.slice(1);
20
+ }
21
+ return word[0].toUpperCase() + word.slice(1);
22
+ })
23
+ .join('');
24
+ // If component name starts with a number, add prefix 'Framer'
25
+ if (/^[0-9]/.test(str)) {
26
+ str = 'Framer' + str;
27
+ }
28
+ str = str + 'FramerComponent';
29
+ return str;
30
+ }
31
+ export function componentImportedName({ componentPath, duplicateLeafNames, }) {
32
+ const normalizedPath = componentPath?.replace(/\.jsx?$/, '') || '';
33
+ const pathSegments = normalizedPath.split('/').filter(Boolean);
34
+ const leafName = pathSegments[pathSegments.length - 1] || '';
35
+ if (!duplicateLeafNames.has(leafName)) {
36
+ return componentCamelCase(normalizedPath);
37
+ }
38
+ const words = pathSegments
39
+ .flatMap((segment) => {
40
+ return segment
41
+ .replace(/[^a-zA-Z0-9]+/g, ' ')
42
+ .trim()
43
+ .split(/\s+/)
44
+ .filter(Boolean);
45
+ });
46
+ if (words.length === 0) {
47
+ return 'FramerComponent';
48
+ }
49
+ let result = words
50
+ .map((word) => {
51
+ return word[0].toUpperCase() + word.slice(1);
52
+ })
53
+ .join('');
54
+ if (/^[0-9]/.test(result)) {
55
+ result = 'Framer' + result;
56
+ }
57
+ return result + 'FramerComponent';
58
+ }
59
+ /**
60
+ * Generates TypeDoc comments that will be injected into JSX files
61
+ * instead of generating separate .d.ts files
62
+ */
63
+ export function propControlsToTypedocComments({ locales, componentImportedName, propertyControls, logger, includeLocaleTypes = false, }) {
64
+ try {
65
+ const types = Object.entries(propertyControls || {})
66
+ .map(([key, value]) => {
67
+ if (!value) {
68
+ return;
69
+ }
70
+ const typescriptType = (value) => {
71
+ if (!value?.type) {
72
+ return 'any';
73
+ }
74
+ switch (value.type) {
75
+ case ControlType.Color:
76
+ return 'string';
77
+ case ControlType.Boolean:
78
+ return 'boolean';
79
+ case ControlType.Number:
80
+ return 'number';
81
+ case ControlType.String:
82
+ return 'string';
83
+ case ControlType.Enum: {
84
+ const options = value.optionTitles || value.options;
85
+ return options.map((x) => `'${x}'`).join(' | ');
86
+ }
87
+ case ControlType.File:
88
+ return 'string';
89
+ case ControlType.Image:
90
+ return 'string';
91
+ case ControlType.ComponentInstance:
92
+ return 'React.ReactNode';
93
+ case ControlType.Array:
94
+ return `${typescriptType(value.control)}[]`;
95
+ case ControlType.Object:
96
+ return `{${Object.entries(value.controls)
97
+ .map(([k, v]) => {
98
+ return `${k}: ${typescriptType(v)}`;
99
+ })
100
+ .join(', ')}`;
101
+ case ControlType.Date:
102
+ return 'string | Date';
103
+ case ControlType.Link:
104
+ return 'string';
105
+ case ControlType.ResponsiveImage:
106
+ return `{src: string, srcSet?: string, alt?: string}`;
107
+ case ControlType.FusedNumber:
108
+ return 'number';
109
+ case ControlType.Transition:
110
+ return 'any';
111
+ case ControlType.EventHandler:
112
+ return 'Function';
113
+ default:
114
+ return 'any';
115
+ }
116
+ };
117
+ let name = propCamelCaseJustLikeFramer(value.title || key || '');
118
+ if (!name) {
119
+ return '';
120
+ }
121
+ return ` * ${name}?: ${typescriptType(value)} // ${value.title || name}`;
122
+ })
123
+ .filter(Boolean)
124
+ .join('\n');
125
+ const componentName = componentImportedName;
126
+ const defaultPropsJsDoc = [
127
+ ' * children?: React.ReactNode',
128
+ includeLocaleTypes ? ' * locale?: Locale' : null,
129
+ ' * style?: React.CSSProperties',
130
+ ' * className?: string',
131
+ ' * id?: string',
132
+ ' * ref?: any',
133
+ ' * width?: any',
134
+ ' * height?: any',
135
+ ' * layoutId?: string',
136
+ ]
137
+ .filter(Boolean)
138
+ .join('\n');
139
+ // Generate header comment with type definitions
140
+ let headerComment = '';
141
+ if (includeLocaleTypes) {
142
+ headerComment += '/**\n';
143
+ headerComment += ' * @typedef Locale\n';
144
+ // Generate union type from locales if available
145
+ const localeType = (() => {
146
+ if (locales && Array.isArray(locales) && locales.length > 0) {
147
+ return locales
148
+ .map((locale) => `'${locale.slug}'`)
149
+ .join(' | ');
150
+ }
151
+ return 'string';
152
+ })();
153
+ headerComment += ` * ${localeType}\n`;
154
+ headerComment += ' */\n\n';
155
+ }
156
+ headerComment += '/**\n';
157
+ headerComment += ' * @typedef {{\n';
158
+ headerComment += defaultPropsJsDoc;
159
+ if (types) {
160
+ headerComment += '\n' + types;
161
+ }
162
+ headerComment += `\n}} Props\n`;
163
+ headerComment += '\n */';
164
+ // Generate responsive comment
165
+ let responsiveComment = '/**\n';
166
+ responsiveComment +=
167
+ ' * @type {import("unframer").UnframerBreakpoint}\n';
168
+ responsiveComment +=
169
+ ' * Represents a responsive breakpoint for unframer.\n';
170
+ responsiveComment += ' */\n\n';
171
+ responsiveComment += '/**\n';
172
+ responsiveComment += ' * @typedef VariantsMap\n';
173
+ responsiveComment +=
174
+ " * Partial record of UnframerBreakpoint to Props.variant, with a mandatory 'base' key.\n";
175
+ responsiveComment +=
176
+ " * { [key in UnframerBreakpoint]?: Props['variant'] } & { base: Props['variant'] }\n";
177
+ responsiveComment += ' */\n\n';
178
+ responsiveComment += `/**\n * Renders ${componentName} for all breakpoints with a variants map. Variant prop is inferred per breakpoint.\n * @function\n * @param {Omit<Props, 'variant'> & {variants?: VariantsMap}} props\n * @returns {any}\n */`;
179
+ // Generate default export comment - use inline function type instead of referencing undefined type
180
+ const defaultExportComment = `/** @type {function(Props): any} */`;
181
+ return {
182
+ headerComment,
183
+ responsiveComment,
184
+ defaultExportComment,
185
+ };
186
+ }
187
+ catch (e) {
188
+ logger.error(e.message);
189
+ logger.error('cannot generate typedoc comments', e.stack);
190
+ return {
191
+ headerComment: '',
192
+ responsiveComment: '',
193
+ defaultExportComment: '',
194
+ };
195
+ }
196
+ }
197
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1,2 @@
1
+ export declare const dispatcher: import("undici").Dispatcher.ComposedDispatcher;
2
+ //# sourceMappingURL=undici-dispatcher.d.ts.map
@@ -0,0 +1,10 @@
1
+ import { Agent, interceptors, setGlobalDispatcher } from 'undici';
2
+ import { FlatCacheStore } from './flat-cache-interceptor.js';
3
+ export const dispatcher = new Agent({
4
+ keepAliveTimeout: 20,
5
+ keepAliveMaxTimeout: 20,
6
+ }).compose(interceptors.cache({
7
+ store: new FlatCacheStore({ cacheDir: `.unframer` }),
8
+ }));
9
+ setGlobalDispatcher(dispatcher);
10
+ //# sourceMappingURL=undici-dispatcher.js.map
@@ -0,0 +1,2 @@
1
+ export declare function resolve(specifier: any, context: any, defaultResolve: any): Promise<any>;
2
+ //# sourceMappingURL=unframer-loader.d.ts.map
@@ -0,0 +1,12 @@
1
+ const mapPackages = JSON.parse(process.env.UNFRAMER_MAP_PACKAGES || '{}');
2
+ export async function resolve(specifier, context, defaultResolve) {
3
+ if (mapPackages[specifier]) {
4
+ return {
5
+ url: mapPackages[specifier],
6
+ // format: 'module', // Specify that unframer is an ES module
7
+ shortCircuit: true, // Signal that we're intentionally not calling next hook
8
+ };
9
+ }
10
+ return defaultResolve(specifier, context, defaultResolve);
11
+ }
12
+ //# sourceMappingURL=unframer-loader.js.map
@@ -0,0 +1,20 @@
1
+ import dedent from 'string-dedent';
2
+ export declare function terminalMarkdown(markdown: string): string;
3
+ export declare const logger: {
4
+ debug: boolean;
5
+ log(...args: any[]): void;
6
+ start(x?: string | undefined): void;
7
+ stop(x?: string | undefined): void;
8
+ info(...args: any[]): void;
9
+ update(...args: any[]): void;
10
+ green(...args: any[]): void;
11
+ error(...args: any[]): void;
12
+ };
13
+ export declare const spinner: import("nanospinner").Spinner;
14
+ export declare function componentNameToPath(name: string): string;
15
+ export declare function sleep(ms: number): Promise<unknown>;
16
+ export declare function kebabCase(str: string): string;
17
+ export declare function isTruthy<T>(x: T | null | undefined | false | 0 | ''): x is T;
18
+ export declare const stackblitzDemoExample: string | undefined;
19
+ export { dedent };
20
+ //# sourceMappingURL=utils.d.ts.map
package/dist/utils.js ADDED
@@ -0,0 +1,81 @@
1
+ import dedent from 'string-dedent';
2
+ import pico from 'picocolors';
3
+ import { createSpinner } from 'nanospinner';
4
+ export function terminalMarkdown(markdown) {
5
+ return markdown;
6
+ }
7
+ const shouldDebugUnframer = !!process.env.DEBUG_UNFRAMER;
8
+ const prefix = '[unframer]';
9
+ export const logger = {
10
+ debug: shouldDebugUnframer,
11
+ log(...args) {
12
+ if (!logger.debug) {
13
+ return;
14
+ }
15
+ console.log(prefix, ...args);
16
+ },
17
+ start(x) {
18
+ if (!x)
19
+ return;
20
+ console.log(prefix, x);
21
+ },
22
+ stop(x) {
23
+ if (!x)
24
+ return;
25
+ console.log(prefix, x);
26
+ },
27
+ info(...args) {
28
+ console.log(prefix, ...args);
29
+ },
30
+ update(...args) {
31
+ console.log(prefix, ...args);
32
+ },
33
+ green(...args) {
34
+ console.log([prefix, ...args].map((x) => pico.green(x)).join(' '));
35
+ },
36
+ error(...args) {
37
+ console.error([prefix, ...args].map((x) => pico.red(x)).join(' '));
38
+ },
39
+ };
40
+ export const spinner = createSpinner('Unframer');
41
+ export function componentNameToPath(name) {
42
+ return (name
43
+ .split('/')
44
+ .filter(Boolean)
45
+ .map((part) => kebabCase(part))
46
+ .join('/') || 'component-without-name');
47
+ }
48
+ export function sleep(ms) {
49
+ return new Promise((resolve) => setTimeout(resolve, ms));
50
+ }
51
+ // https://www.npmjs.com/package/just-kebab-case?activeTab=readme
52
+ // any combination of spaces and punctuation characters
53
+ // thanks to http://stackoverflow.com/a/25575009
54
+ var wordSeparators = /[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]+/;
55
+ var capital_plus_lower = /[A-ZÀ-Ý\u00C0-\u00D6\u00D9-\u00DD][a-zà-ÿ]/g;
56
+ var capitals = /[A-ZÀ-Ý\u00C0-\u00D6\u00D9-\u00DD]+/g;
57
+ export function kebabCase(str) {
58
+ // replace word starts with space + lower case equivalent for later parsing
59
+ // 1) treat cap + lower as start of new word
60
+ str = str.replace(capital_plus_lower, function (match) {
61
+ // match is one caps followed by one non-cap
62
+ return ' ' + (match[0].toLowerCase() || match[0]) + match[1];
63
+ });
64
+ // 2) treat all remaining capitals as words
65
+ str = str.replace(capitals, function (match) {
66
+ // match is a series of caps
67
+ return ' ' + match.toLowerCase();
68
+ });
69
+ return str
70
+ .trim()
71
+ .split(wordSeparators)
72
+ .join('-')
73
+ .replace(/^-/, '')
74
+ .replace(/-\s*$/, '');
75
+ }
76
+ export function isTruthy(x) {
77
+ return Boolean(x);
78
+ }
79
+ export const stackblitzDemoExample = process.env.STACKBLITZ_DEMO_EXAMPLE;
80
+ export { dedent };
81
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,2 @@
1
+ export declare const version = "4.2.0-reframe.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1,2 @@
1
+ export const version = '4.2.0-reframe.0';
2
+ //# sourceMappingURL=version.js.map
package/package.json ADDED
@@ -0,0 +1,131 @@
1
+ {
2
+ "name": "@reframejs/unframer",
3
+ "version": "4.2.0-reframe.0",
4
+ "type": "module",
5
+ "description": "Reframe-maintained runtime for importing Framer components into React apps",
6
+ "sideEffects": false,
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Elixir-Piloting/reframe.git",
10
+ "directory": "packages/unframer/unframer"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Elixir-Piloting/reframe/issues"
14
+ },
15
+ "homepage": "https://reframe.elxr.studio/docs",
16
+ "imports": {
17
+ "#framer-client": {
18
+ "types": "./dist/plugin-mcp-dist/lib/framer-client.server.d.ts",
19
+ "default": "./dist/plugin-mcp-dist/lib/framer-client.server.js"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "build": "pnpm tsgo && node scripts/copy-build-assets.mjs",
24
+ "test": "vitest",
25
+ "prepublishOnly": "node scripts/prepare-package.mjs && pnpm build",
26
+ "download-framer": "tsx scripts/download.ts",
27
+ "watch": "pnpm tsc -w"
28
+ },
29
+ "bin": {
30
+ "unframer": "bin.js"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "bin.js",
35
+ "!dist/**/*.test.*",
36
+ "!dist/**/*.map",
37
+ "README.md"
38
+ ],
39
+ "main": "./dist/index.js",
40
+ "types": "./dist/index.d.ts",
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.ts",
44
+ "default": "./dist/index.js"
45
+ },
46
+ "./framer.js": {
47
+ "types": "./dist/framer.d.ts",
48
+ "default": "./dist/framer.js"
49
+ },
50
+ "./dist/exporter": {
51
+ "types": "./dist/exporter.d.ts",
52
+ "default": "./dist/exporter.js"
53
+ },
54
+ "./styles/*": {
55
+ "default": "./dist/styles/*"
56
+ },
57
+ "./package.json": "./package.json"
58
+ },
59
+ "keywords": [
60
+ "reframe",
61
+ "framer",
62
+ "react",
63
+ "typescript"
64
+ ],
65
+ "author": "Reframe, with Unframer contributions by Tommaso De Rossi",
66
+ "license": "",
67
+ "publishConfig": {
68
+ "access": "public"
69
+ },
70
+ "peerDependencies": {
71
+ "react": "*",
72
+ "react-dom": "*"
73
+ },
74
+ "engines": {
75
+ "node": ">=18.0.0"
76
+ },
77
+ "dependencies": {
78
+ "@antfu/ni": "^25.0.0",
79
+ "@babel/core": "^7.28.6",
80
+ "@biomejs/js-api": "^0.7.1",
81
+ "@biomejs/wasm-nodejs": "^1.9.4",
82
+ "@goke/mcp": "^0.0.4",
83
+ "@inquirer/prompts": "^8.2.0",
84
+ "@modelcontextprotocol/sdk": "^1.25.3",
85
+ "async-sema": "^3.1.1",
86
+ "camelcase": "^9.0.0",
87
+ "diff": "^7.0.0",
88
+ "dom-serializer": "^2.0.0",
89
+ "esbuild": "^0.28.0",
90
+ "framer-api": "^0.1.2",
91
+ "goke": "^6.12.1",
92
+ "htmlparser2": "^10.1.0",
93
+ "nanospinner": "^1.2.2",
94
+ "picocolors": "^1.1.1",
95
+ "react-router": "^7.12.0",
96
+ "real-framer-motion": "npm:framer-motion@^12.34.2",
97
+ "sema4": "^0.1.3",
98
+ "spiceflow": "^1.18.0",
99
+ "string-dedent": "^3.0.1",
100
+ "undici": "^7.18.2",
101
+ "zod": "^4.3.6"
102
+ },
103
+ "devDependencies": {
104
+ "@babel/helper-annotate-as-pure": "^7.25.9",
105
+ "@babel/helper-environment-visitor": "^7.24.7",
106
+ "@babel/helper-split-export-declaration": "^7.24.7",
107
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9",
108
+ "@babel/traverse": "^7.28.6",
109
+ "@babel/types": "^7.28.6",
110
+ "@types/babel__core": "^7.20.5",
111
+ "@types/babel__traverse": "^7.28.0",
112
+ "@types/bun": "^1.1.6",
113
+ "@types/node": "^22.15.21",
114
+ "@types/react": "^19.2.14",
115
+ "@types/react-dom": "^19.2.3",
116
+ "@typescript/native-preview": "7.0.0-dev.20260117.1",
117
+ "@xmorse/deployment-utils": "^0.7.5",
118
+ "concurrently": "^9.1.2",
119
+ "dprint-node": "^1.0.8",
120
+ "lightningcss": "^1.32.0",
121
+ "openai": "^4.80.1",
122
+ "posthtml": "^0.16.6",
123
+ "react": "19.2.7",
124
+ "react-dom": "19.2.7",
125
+ "tiktoken": "^1.0.18",
126
+ "tsx": "^4.23.13",
127
+ "typescript": "^5.9.3",
128
+ "vite": "^8.3.0",
129
+ "vitest": "^3.2.7"
130
+ }
131
+ }