@depup/react-live 4.1.8-depup.0 → 5.0.0-depup.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/dist/index.mjs CHANGED
@@ -1,366 +1,265 @@
1
- var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- var __objRest = (source, exclude) => {
21
- var target = {};
22
- for (var prop in source)
23
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
- target[prop] = source[prop];
25
- if (source != null && __getOwnPropSymbols)
26
- for (var prop of __getOwnPropSymbols(source)) {
27
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
- target[prop] = source[prop];
29
- }
30
- return target;
31
- };
32
- var __async = (__this, __arguments, generator) => {
33
- return new Promise((resolve, reject) => {
34
- var fulfilled = (value) => {
35
- try {
36
- step(generator.next(value));
37
- } catch (e) {
38
- reject(e);
39
- }
40
- };
41
- var rejected = (value) => {
42
- try {
43
- step(generator.throw(value));
44
- } catch (e) {
45
- reject(e);
46
- }
47
- };
48
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
49
- step((generator = generator.apply(__this, __arguments)).next());
50
- });
51
- };
52
-
53
- // src/components/Editor/index.tsx
54
1
  import { Highlight, themes } from "prism-react-renderer";
55
- import { useEffect, useRef, useState } from "react";
2
+ import React, { Component, createContext, useContext, useEffect, useRef, useState } from "react";
56
3
  import { useEditable } from "use-editable";
57
4
  import { jsx, jsxs } from "react/jsx-runtime";
58
- var CodeEditor = (props) => {
59
- const { tabMode = "indentation" } = props;
60
- const editorRef = useRef(null);
61
- const [code, setCode] = useState(props.code || "");
62
- const { theme } = props;
63
- useEffect(() => {
64
- setCode(props.code);
65
- }, [props.code]);
66
- useEditable(
67
- editorRef,
68
- (text) => {
69
- const t = text.slice(0, -1);
70
- setCode(t);
71
- if (props.onChange) {
72
- props.onChange(t);
73
- }
74
- },
75
- {
76
- disabled: props.disabled,
77
- indentation: tabMode === "indentation" ? 2 : void 0
78
- }
79
- );
80
- return /* @__PURE__ */ jsx("div", { className: props.className, style: props.style, children: /* @__PURE__ */ jsx(
81
- Highlight,
82
- {
83
- code,
84
- theme: props.theme || themes.nightOwl,
85
- language: props.language,
86
- children: ({
87
- className: _className,
88
- tokens,
89
- getLineProps,
90
- getTokenProps,
91
- style: _style
92
- }) => /* @__PURE__ */ jsx(
93
- "pre",
94
- {
95
- className: _className,
96
- style: __spreadValues(__spreadValues({
97
- margin: 0,
98
- outline: "none",
99
- padding: 10,
100
- fontFamily: "inherit"
101
- }, theme && typeof theme.plain === "object" ? theme.plain : {}), _style),
102
- ref: editorRef,
103
- spellCheck: "false",
104
- children: tokens.map((line, lineIndex) => /* @__PURE__ */ jsxs("span", __spreadProps(__spreadValues({}, getLineProps({ line })), { children: [
105
- line.filter((token) => !token.empty).map((token, tokenIndex) => /* @__PURE__ */ jsx(
106
- "span",
107
- __spreadValues({}, getTokenProps({ token })),
108
- `token-${tokenIndex}`
109
- )),
110
- "\n"
111
- ] }), `line-${lineIndex}`))
112
- }
113
- )
114
- }
115
- ) });
5
+ import { transform } from "sucrase";
6
+ //#region src/components/Editor/index.tsx
7
+ const CodeEditor = (props) => {
8
+ const { tabMode = "indentation" } = props;
9
+ const editorRef = useRef(null);
10
+ const [code, setCode] = useState(props.code || "");
11
+ const { theme } = props;
12
+ useEffect(() => {
13
+ setCode(props.code);
14
+ }, [props.code]);
15
+ useEditable(editorRef, (text) => {
16
+ const t = text.slice(0, -1);
17
+ setCode(t);
18
+ if (props.onChange) props.onChange(t);
19
+ }, {
20
+ disabled: props.disabled,
21
+ indentation: tabMode === "indentation" ? 2 : void 0
22
+ });
23
+ return /* @__PURE__ */ jsx("div", {
24
+ className: props.className,
25
+ style: props.style,
26
+ children: /* @__PURE__ */ jsx(Highlight, {
27
+ code,
28
+ theme: props.theme || themes.nightOwl,
29
+ language: props.language,
30
+ prism: props.prism,
31
+ children: ({ className: _className, tokens, getLineProps, getTokenProps, style: _style }) => /* @__PURE__ */ jsx("pre", {
32
+ className: _className,
33
+ style: {
34
+ margin: 0,
35
+ outline: "none",
36
+ padding: 10,
37
+ fontFamily: "inherit",
38
+ ...theme && typeof theme.plain === "object" ? theme.plain : {},
39
+ ..._style
40
+ },
41
+ ref: editorRef,
42
+ spellCheck: "false",
43
+ children: tokens.map((line, lineIndex) => /* @__PURE__ */ jsxs("span", {
44
+ ...getLineProps({ line }),
45
+ children: [line.filter((token) => !token.empty).map((token, tokenIndex) => /* @__PURE__ */ jsx("span", { ...getTokenProps({ token }) }, `token-${tokenIndex}`)), "\n"]
46
+ }, `line-${lineIndex}`))
47
+ })
48
+ })
49
+ });
116
50
  };
117
- var Editor_default = CodeEditor;
118
-
119
- // src/components/Live/LiveProvider.tsx
120
- import { useEffect as useEffect2, useState as useState2 } from "react";
121
-
122
- // src/components/Live/LiveContext.ts
123
- import { createContext } from "react";
124
- var LiveContext = createContext({});
125
- var LiveContext_default = LiveContext;
126
-
127
- // src/utils/transpile/index.ts
128
- import React2 from "react";
129
-
130
- // src/utils/transpile/transform.ts
131
- import { transform as _transform } from "sucrase";
132
- var defaultTransforms = ["jsx", "imports"];
133
- function transform(opts = {}) {
134
- const transforms = Array.isArray(opts.transforms) ? opts.transforms.filter(Boolean) : defaultTransforms;
135
- return (code) => _transform(code, { transforms }).code;
51
+ //#endregion
52
+ //#region src/components/Live/LiveContext.ts
53
+ const LiveContext = createContext({});
54
+ //#endregion
55
+ //#region src/utils/transpile/transform.ts
56
+ const defaultTransforms = ["jsx", "imports"];
57
+ function transform$1(opts = {}) {
58
+ const transforms = Array.isArray(opts.transforms) ? opts.transforms.filter(Boolean) : defaultTransforms;
59
+ return (code) => transform(code, {
60
+ transforms,
61
+ production: true
62
+ }).code;
136
63
  }
137
-
138
- // src/utils/transpile/errorBoundary.tsx
139
- import React, { Component } from "react";
140
- import { jsx as jsx2 } from "react/jsx-runtime";
141
- var errorBoundary = (Element, errorCallback) => {
142
- return class ErrorBoundary extends Component {
143
- componentDidCatch(error) {
144
- errorCallback(error);
145
- }
146
- render() {
147
- return typeof Element === "function" ? /* @__PURE__ */ jsx2(Element, {}) : React.isValidElement(Element) ? Element : null;
148
- }
149
- };
64
+ //#endregion
65
+ //#region src/utils/transpile/errorBoundary.tsx
66
+ const errorBoundary = (Element, errorCallback) => {
67
+ return class ErrorBoundary extends Component {
68
+ state = { hasError: false };
69
+ static getDerivedStateFromError() {
70
+ return { hasError: true };
71
+ }
72
+ componentDidCatch(error) {
73
+ errorCallback(error);
74
+ }
75
+ render() {
76
+ if (this.state.hasError) return null;
77
+ return typeof Element === "function" ? /* @__PURE__ */ jsx(Element, {}) : React.isValidElement(Element) ? Element : null;
78
+ }
79
+ };
150
80
  };
151
- var errorBoundary_default = errorBoundary;
152
-
153
- // src/utils/transpile/evalCode.ts
154
- var evalCode = (code, scope) => {
155
- const scopeKeys = Object.keys(scope);
156
- const scopeValues = scopeKeys.map((key) => scope[key]);
157
- return new Function(...scopeKeys, code)(...scopeValues);
81
+ //#endregion
82
+ //#region src/utils/transpile/evalCode.ts
83
+ const evalCode = (code, scope) => {
84
+ const scopeKeys = Object.keys(scope);
85
+ const scopeValues = scopeKeys.map((key) => scope[key]);
86
+ return new Function(...scopeKeys, code)(...scopeValues);
158
87
  };
159
- var evalCode_default = evalCode;
160
-
161
- // src/utils/transpile/compose.ts
88
+ //#endregion
89
+ //#region src/utils/transpile/compose.ts
90
+ /**
91
+ * Creates a new composite function that invokes the functions from right to left
92
+ */
162
93
  function compose(...functions) {
163
- return functions.reduce(
164
- (acc, currentFn) => (...args) => acc(currentFn(...args))
165
- );
94
+ return functions.reduce((acc, currentFn) => (...args) => acc(currentFn(...args)));
166
95
  }
167
-
168
- // src/utils/transpile/index.ts
169
- var jsxConst = 'const _jsxFileName = "";';
170
- var trimCode = (code) => code.trim().replace(/;$/, "");
171
- var spliceJsxConst = (code) => code.replace(jsxConst, "").trim();
172
- var addJsxConst = (code) => jsxConst + code;
173
- var wrapReturn = (code) => `return (${code})`;
174
- var generateElement = ({ code = "", scope = {}, enableTypeScript = true }, errorCallback) => {
175
- const firstPassTransforms = ["jsx"];
176
- enableTypeScript && firstPassTransforms.push("typescript");
177
- const transformed = compose(
178
- addJsxConst,
179
- transform({ transforms: ["imports"] }),
180
- spliceJsxConst,
181
- trimCode,
182
- transform({ transforms: firstPassTransforms }),
183
- wrapReturn,
184
- trimCode
185
- )(code);
186
- return errorBoundary_default(
187
- evalCode_default(transformed, __spreadValues({ React: React2 }, scope)),
188
- errorCallback
189
- );
96
+ //#endregion
97
+ //#region src/utils/transpile/index.ts
98
+ const trimCode = (code) => code.trim().replace(/;$/, "");
99
+ const wrapReturn = (code) => `return (${code})`;
100
+ const generateElement = ({ code = "", scope = {}, enableTypeScript = true }, errorCallback) => {
101
+ /**
102
+ * To enable TypeScript we need to transform the TS to JS code first,
103
+ * wrap the eval in a return statement, then transform any imports. The
104
+ * two-phase approach is required to do the implicit evaluation and not
105
+ * wrap leading Interface or Type statements in the return.
106
+ */
107
+ const firstPassTransforms = ["jsx"];
108
+ if (enableTypeScript) firstPassTransforms.push("typescript");
109
+ const transformed = compose(transform$1({ transforms: ["imports"] }), trimCode, transform$1({ transforms: firstPassTransforms }), wrapReturn, trimCode)(code);
110
+ return errorBoundary(evalCode(transformed, {
111
+ React,
112
+ ...scope
113
+ }), errorCallback);
190
114
  };
191
- var renderElementAsync = ({ code = "", scope = {}, enableTypeScript = true }, resultCallback, errorCallback) => {
192
- const render = (element) => {
193
- if (typeof element === "undefined") {
194
- errorCallback(new SyntaxError("`render` must be called with valid JSX."));
195
- } else {
196
- resultCallback(errorBoundary_default(element, errorCallback));
197
- }
198
- };
199
- if (!/render\s*\(/.test(code)) {
200
- return errorCallback(
201
- new SyntaxError("No-Inline evaluations must call `render`.")
202
- );
203
- }
204
- const transforms = ["jsx", "imports"];
205
- enableTypeScript && transforms.splice(1, 0, "typescript");
206
- evalCode_default(transform({ transforms })(code), __spreadProps(__spreadValues({ React: React2 }, scope), { render }));
115
+ const renderElementAsync = ({ code = "", scope = {}, enableTypeScript = true }, resultCallback, errorCallback) => {
116
+ const render = (element) => {
117
+ if (typeof element === "undefined") errorCallback(/* @__PURE__ */ new SyntaxError("`render` must be called with valid JSX."));
118
+ else resultCallback(errorBoundary(element, errorCallback));
119
+ };
120
+ if (!/render\s*\(/.test(code)) return errorCallback(/* @__PURE__ */ new SyntaxError("No-Inline evaluations must call `render`."));
121
+ const transforms = ["jsx", "imports"];
122
+ if (enableTypeScript) transforms.splice(1, 0, "typescript");
123
+ evalCode(transform$1({ transforms })(code), {
124
+ React,
125
+ ...scope,
126
+ render
127
+ });
207
128
  };
208
-
209
- // src/components/Live/LiveProvider.tsx
210
- import { jsx as jsx3 } from "react/jsx-runtime";
211
- function LiveProvider({
212
- children,
213
- code = "",
214
- language = "tsx",
215
- theme,
216
- enableTypeScript = true,
217
- disabled = false,
218
- scope,
219
- transformCode,
220
- noInline = false
221
- }) {
222
- const [state, setState] = useState2({
223
- error: void 0,
224
- element: void 0
225
- });
226
- function transpileAsync(newCode) {
227
- return __async(this, null, function* () {
228
- const errorCallback = (error) => {
229
- setState((previousState) => __spreadProps(__spreadValues({}, previousState), {
230
- error: error.toString(),
231
- element: void 0
232
- }));
233
- };
234
- try {
235
- const transformResult = transformCode ? transformCode(newCode) : newCode;
236
- try {
237
- const transformedCode = yield Promise.resolve(transformResult);
238
- const renderElement = (element) => setState({ error: void 0, element, newCode });
239
- if (typeof transformedCode !== "string") {
240
- throw new Error("Code failed to transform");
241
- }
242
- const input = {
243
- code: transformedCode,
244
- scope,
245
- enableTypeScript
246
- };
247
- if (noInline) {
248
- setState((previousState) => __spreadProps(__spreadValues({}, previousState), {
249
- error: void 0,
250
- element: null
251
- }));
252
- renderElementAsync(input, renderElement, errorCallback);
253
- } else {
254
- renderElement(generateElement(input, errorCallback));
255
- }
256
- } catch (error) {
257
- return errorCallback(error);
258
- }
259
- } catch (e) {
260
- errorCallback(e);
261
- return Promise.resolve();
262
- }
263
- });
264
- }
265
- const onError = (error) => setState({ error: error.toString() });
266
- useEffect2(() => {
267
- transpileAsync(code).catch(onError);
268
- }, [code, scope, noInline, transformCode]);
269
- const onChange = (newCode) => {
270
- transpileAsync(newCode).catch(onError);
271
- };
272
- return /* @__PURE__ */ jsx3(
273
- LiveContext_default.Provider,
274
- {
275
- value: __spreadProps(__spreadValues({}, state), {
276
- code,
277
- language,
278
- theme,
279
- disabled,
280
- onError,
281
- onChange
282
- }),
283
- children
284
- }
285
- );
129
+ //#endregion
130
+ //#region src/components/Live/LiveProvider.tsx
131
+ function LiveProvider({ children, code = "", language = "tsx", theme, enableTypeScript = true, disabled = false, scope, transformCode, noInline = false }) {
132
+ const [state, setState] = useState({
133
+ error: void 0,
134
+ element: void 0
135
+ });
136
+ async function transpileAsync(newCode) {
137
+ const errorCallback = (error) => {
138
+ setState((previousState) => ({
139
+ ...previousState,
140
+ error: error.toString(),
141
+ element: void 0
142
+ }));
143
+ };
144
+ try {
145
+ const transformResult = transformCode ? transformCode(newCode) : newCode;
146
+ try {
147
+ const transformedCode = await Promise.resolve(transformResult);
148
+ const renderElement = (element) => setState({
149
+ error: void 0,
150
+ element,
151
+ newCode
152
+ });
153
+ if (typeof transformedCode !== "string") throw new Error("Code failed to transform");
154
+ const input = {
155
+ code: transformedCode,
156
+ scope,
157
+ enableTypeScript
158
+ };
159
+ if (noInline) {
160
+ setState((previousState) => ({
161
+ ...previousState,
162
+ error: void 0,
163
+ element: null
164
+ }));
165
+ renderElementAsync(input, renderElement, errorCallback);
166
+ } else renderElement(generateElement(input, errorCallback));
167
+ } catch (error) {
168
+ return errorCallback(error);
169
+ }
170
+ } catch (e) {
171
+ errorCallback(e);
172
+ return Promise.resolve();
173
+ }
174
+ }
175
+ const onError = (error) => setState({ error: error.toString() });
176
+ useEffect(() => {
177
+ transpileAsync(code).catch(onError);
178
+ }, [
179
+ code,
180
+ scope,
181
+ noInline,
182
+ transformCode
183
+ ]);
184
+ const onChange = (newCode) => {
185
+ transpileAsync(newCode).catch(onError);
186
+ };
187
+ return /* @__PURE__ */ jsx(LiveContext.Provider, {
188
+ value: {
189
+ ...state,
190
+ code,
191
+ language,
192
+ theme,
193
+ disabled,
194
+ onError,
195
+ onChange
196
+ },
197
+ children
198
+ });
286
199
  }
287
- var LiveProvider_default = LiveProvider;
288
-
289
- // src/components/Live/LiveEditor.tsx
290
- import { useContext } from "react";
291
- import { jsx as jsx4 } from "react/jsx-runtime";
200
+ //#endregion
201
+ //#region src/components/Live/LiveEditor.tsx
292
202
  function LiveEditor(props) {
293
- const { code, language, theme, disabled, onChange } = useContext(LiveContext_default);
294
- return /* @__PURE__ */ jsx4(
295
- Editor_default,
296
- __spreadValues({
297
- theme,
298
- code,
299
- language,
300
- disabled,
301
- onChange
302
- }, props)
303
- );
203
+ const { code, language, theme, disabled, onChange } = useContext(LiveContext);
204
+ return /* @__PURE__ */ jsx(CodeEditor, {
205
+ theme,
206
+ code,
207
+ language,
208
+ disabled,
209
+ onChange,
210
+ ...props
211
+ });
304
212
  }
305
-
306
- // src/components/Live/LiveError.tsx
307
- import { useContext as useContext2 } from "react";
308
- import { jsx as jsx5 } from "react/jsx-runtime";
213
+ //#endregion
214
+ //#region src/components/Live/LiveError.tsx
309
215
  function LiveError(props) {
310
- const { error } = useContext2(LiveContext_default);
311
- return error ? /* @__PURE__ */ jsx5("pre", __spreadProps(__spreadValues({}, props), { children: error })) : null;
216
+ const { error } = useContext(LiveContext);
217
+ return error ? /* @__PURE__ */ jsx("pre", {
218
+ ...props,
219
+ children: error
220
+ }) : null;
312
221
  }
313
-
314
- // src/components/Live/LivePreview.tsx
315
- import { useContext as useContext3 } from "react";
316
-
317
- // src/components/Live/ErrorBoundary.tsx
318
- import { Component as Component2 } from "react";
319
- var ErrorBoundary = class extends Component2 {
320
- static getDerivedStateFromError() {
321
- return { hasError: true };
322
- }
323
- constructor(props) {
324
- super(props);
325
- this.state = { hasError: false };
326
- }
327
- componentDidCatch(err) {
328
- var _a, _b;
329
- (_b = (_a = this.props).onError) == null ? void 0 : _b.call(_a, err);
330
- }
331
- render() {
332
- if (this.state.hasError) {
333
- return null;
334
- }
335
- return this.props.children;
336
- }
222
+ //#endregion
223
+ //#region src/components/Live/ErrorBoundary.tsx
224
+ var ErrorBoundary = class extends Component {
225
+ static getDerivedStateFromError() {
226
+ return { hasError: true };
227
+ }
228
+ constructor(props) {
229
+ super(props);
230
+ this.state = { hasError: false };
231
+ }
232
+ componentDidCatch(err) {
233
+ this.props.onError?.(err);
234
+ }
235
+ render() {
236
+ if (this.state.hasError) return null;
237
+ return this.props.children;
238
+ }
337
239
  };
338
-
339
- // src/components/Live/LivePreview.tsx
340
- import { jsx as jsx6 } from "react/jsx-runtime";
341
- function LivePreview(_a) {
342
- var _b = _a, { Component: Component3 = "div" } = _b, rest = __objRest(_b, ["Component"]);
343
- const { element: Element, onError, newCode } = useContext3(LiveContext_default);
344
- return /* @__PURE__ */ jsx6(ErrorBoundary, { onError, children: /* @__PURE__ */ jsx6(Component3, __spreadProps(__spreadValues({}, rest), { children: Element ? /* @__PURE__ */ jsx6(Element, {}) : null })) }, newCode);
240
+ //#endregion
241
+ //#region src/components/Live/LivePreview.tsx
242
+ function LivePreview({ Component = "div", ...rest }) {
243
+ const { element: Element, onError, newCode } = useContext(LiveContext);
244
+ return /* @__PURE__ */ jsx(ErrorBoundary, {
245
+ onError,
246
+ children: /* @__PURE__ */ jsx(Component, {
247
+ ...rest,
248
+ children: Element ? /* @__PURE__ */ jsx(Element, {}) : null
249
+ })
250
+ }, newCode);
345
251
  }
346
- var LivePreview_default = LivePreview;
347
-
348
- // src/hoc/withLive.tsx
349
- import { jsx as jsx7 } from "react/jsx-runtime";
252
+ //#endregion
253
+ //#region src/hoc/withLive.tsx
350
254
  function withLive(WrappedComponent) {
351
- const WithLive = (props) => /* @__PURE__ */ jsx7(LiveContext_default.Consumer, { children: (live) => /* @__PURE__ */ jsx7(WrappedComponent, __spreadValues({ live }, props)) });
352
- WithLive.displayName = "WithLive";
353
- return WithLive;
255
+ const WithLive = (props) => /* @__PURE__ */ jsx(LiveContext.Consumer, { children: (live) => /* @__PURE__ */ jsx(WrappedComponent, {
256
+ live,
257
+ ...props
258
+ }) });
259
+ WithLive.displayName = "WithLive";
260
+ return WithLive;
354
261
  }
355
- export {
356
- Editor_default as Editor,
357
- LiveContext_default as LiveContext,
358
- LiveEditor,
359
- LiveError,
360
- LivePreview_default as LivePreview,
361
- LiveProvider_default as LiveProvider,
362
- generateElement,
363
- renderElementAsync,
364
- withLive
365
- };
262
+ //#endregion
263
+ export { CodeEditor as Editor, LiveContext, LiveEditor, LiveError, LivePreview, LiveProvider, generateElement, renderElementAsync, withLive };
264
+
366
265
  //# sourceMappingURL=index.mjs.map