@builder.io/sdk-svelte 5.2.16 → 5.4.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 +4 -0
- package/lib/browser/blocks/symbol/symbol.helpers.d.ts +1 -0
- package/lib/browser/blocks/symbol/symbol.helpers.js +6 -0
- package/lib/browser/blocks/symbol/symbol.svelte +5 -1
- package/lib/browser/components/block/block.helpers.d.ts +1 -3
- package/lib/browser/components/block/block.helpers.js +31 -4
- package/lib/browser/components/block/block.svelte +14 -1
- package/lib/browser/components/builder-scripts.svelte +39 -0
- package/lib/browser/components/builder-scripts.svelte.d.ts +22 -0
- package/lib/browser/components/content/components/styles.helpers.d.ts +1 -1
- package/lib/browser/components/content/components/styles.helpers.js +1 -1
- package/lib/browser/components/content/content.helpers.d.ts +5 -1
- package/lib/browser/components/content/content.helpers.js +39 -2
- package/lib/browser/components/content/content.svelte +4 -17
- package/lib/browser/components/content-variants/content-variants.svelte +15 -8
- package/lib/browser/components/content-variants/content-variants.svelte.d.ts +5 -0
- package/lib/browser/components/content-variants/helpers.d.ts +6 -0
- package/lib/browser/components/content-variants/helpers.js +5 -0
- package/lib/browser/constants/builder-registered-components.d.ts +1 -0
- package/lib/browser/constants/builder-registered-components.js +40 -33
- package/lib/browser/constants/device-sizes.js +14 -2
- package/lib/browser/constants/sdk-version.d.ts +1 -1
- package/lib/browser/constants/sdk-version.js +1 -1
- package/lib/browser/context/builder-scripts.context.d.ts +7 -0
- package/lib/browser/context/builder-scripts.context.js +5 -0
- package/lib/browser/functions/evaluate/browser-runtime/browser.js +13 -1
- package/lib/browser/functions/evaluate/evaluate.js +21 -5
- package/lib/browser/functions/evaluate/node-runtime/node-runtime.js +114 -23
- package/lib/browser/functions/evaluate/safe-state-expression.d.ts +33 -0
- package/lib/browser/functions/evaluate/safe-state-expression.js +236 -0
- package/lib/browser/functions/evaluate/should-force-browser-runtime-in-node.js +3 -1
- package/lib/browser/functions/extract-localized-values.d.ts +4 -0
- package/lib/browser/functions/extract-localized-values.js +65 -26
- package/lib/browser/functions/get-block-properties.js +2 -1
- package/lib/browser/functions/get-processed-block.d.ts +0 -1
- package/lib/browser/functions/get-processed-block.js +45 -57
- package/lib/browser/functions/is-editing-or-previewing.d.ts +1 -0
- package/lib/browser/functions/is-editing-or-previewing.js +3 -0
- package/lib/browser/functions/set.d.ts +29 -1
- package/lib/browser/functions/set.js +85 -4
- package/lib/browser/helpers/bounded-cache.d.ts +4 -0
- package/lib/browser/helpers/bounded-cache.js +12 -0
- package/lib/browser/helpers/copy-plain-data.d.ts +6 -0
- package/lib/browser/helpers/copy-plain-data.js +40 -0
- package/lib/browser/index-helpers/blocks-exports.d.ts +1 -0
- package/lib/browser/index-helpers/blocks-exports.js +1 -0
- package/lib/edge/blocks/symbol/symbol.helpers.d.ts +1 -0
- package/lib/edge/blocks/symbol/symbol.helpers.js +6 -0
- package/lib/edge/blocks/symbol/symbol.svelte +5 -1
- package/lib/edge/components/block/block.helpers.d.ts +1 -3
- package/lib/edge/components/block/block.helpers.js +31 -4
- package/lib/edge/components/block/block.svelte +14 -1
- package/lib/edge/components/builder-scripts.svelte +39 -0
- package/lib/edge/components/builder-scripts.svelte.d.ts +22 -0
- package/lib/edge/components/content/components/styles.helpers.d.ts +1 -1
- package/lib/edge/components/content/components/styles.helpers.js +1 -1
- package/lib/edge/components/content/content.helpers.d.ts +5 -1
- package/lib/edge/components/content/content.helpers.js +39 -2
- package/lib/edge/components/content/content.svelte +4 -17
- package/lib/edge/components/content-variants/content-variants.svelte +15 -8
- package/lib/edge/components/content-variants/content-variants.svelte.d.ts +5 -0
- package/lib/edge/components/content-variants/helpers.d.ts +6 -0
- package/lib/edge/components/content-variants/helpers.js +5 -0
- package/lib/edge/constants/builder-registered-components.d.ts +1 -0
- package/lib/edge/constants/builder-registered-components.js +40 -33
- package/lib/edge/constants/device-sizes.js +14 -2
- package/lib/edge/constants/sdk-version.d.ts +1 -1
- package/lib/edge/constants/sdk-version.js +1 -1
- package/lib/edge/context/builder-scripts.context.d.ts +7 -0
- package/lib/edge/context/builder-scripts.context.js +5 -0
- package/lib/edge/functions/evaluate/browser-runtime/browser.js +13 -1
- package/lib/edge/functions/evaluate/evaluate.js +21 -5
- package/lib/edge/functions/evaluate/node-runtime/node-runtime.js +114 -23
- package/lib/edge/functions/evaluate/safe-state-expression.d.ts +33 -0
- package/lib/edge/functions/evaluate/safe-state-expression.js +236 -0
- package/lib/edge/functions/evaluate/should-force-browser-runtime-in-node.js +3 -1
- package/lib/edge/functions/extract-localized-values.d.ts +4 -0
- package/lib/edge/functions/extract-localized-values.js +65 -26
- package/lib/edge/functions/get-block-properties.js +2 -1
- package/lib/edge/functions/get-processed-block.d.ts +0 -1
- package/lib/edge/functions/get-processed-block.js +45 -57
- package/lib/edge/functions/is-editing-or-previewing.d.ts +1 -0
- package/lib/edge/functions/is-editing-or-previewing.js +3 -0
- package/lib/edge/functions/set.d.ts +29 -1
- package/lib/edge/functions/set.js +85 -4
- package/lib/edge/helpers/bounded-cache.d.ts +4 -0
- package/lib/edge/helpers/bounded-cache.js +12 -0
- package/lib/edge/helpers/copy-plain-data.d.ts +6 -0
- package/lib/edge/helpers/copy-plain-data.js +40 -0
- package/lib/edge/index-helpers/blocks-exports.d.ts +1 -0
- package/lib/edge/index-helpers/blocks-exports.js +1 -0
- package/lib/node/blocks/symbol/symbol.helpers.d.ts +1 -0
- package/lib/node/blocks/symbol/symbol.helpers.js +6 -0
- package/lib/node/blocks/symbol/symbol.svelte +5 -1
- package/lib/node/components/block/block.helpers.d.ts +1 -3
- package/lib/node/components/block/block.helpers.js +31 -4
- package/lib/node/components/block/block.svelte +14 -1
- package/lib/node/components/builder-scripts.svelte +39 -0
- package/lib/node/components/builder-scripts.svelte.d.ts +22 -0
- package/lib/node/components/content/components/styles.helpers.d.ts +1 -1
- package/lib/node/components/content/components/styles.helpers.js +1 -1
- package/lib/node/components/content/content.helpers.d.ts +5 -1
- package/lib/node/components/content/content.helpers.js +39 -2
- package/lib/node/components/content/content.svelte +4 -17
- package/lib/node/components/content-variants/content-variants.svelte +15 -8
- package/lib/node/components/content-variants/content-variants.svelte.d.ts +5 -0
- package/lib/node/components/content-variants/helpers.d.ts +6 -0
- package/lib/node/components/content-variants/helpers.js +5 -0
- package/lib/node/constants/builder-registered-components.d.ts +1 -0
- package/lib/node/constants/builder-registered-components.js +40 -33
- package/lib/node/constants/device-sizes.js +14 -2
- package/lib/node/constants/sdk-version.d.ts +1 -1
- package/lib/node/constants/sdk-version.js +1 -1
- package/lib/node/context/builder-scripts.context.d.ts +7 -0
- package/lib/node/context/builder-scripts.context.js +5 -0
- package/lib/node/functions/evaluate/browser-runtime/browser.js +13 -1
- package/lib/node/functions/evaluate/evaluate.js +21 -5
- package/lib/node/functions/evaluate/node-runtime/node-runtime.js +114 -23
- package/lib/node/functions/evaluate/safe-state-expression.d.ts +33 -0
- package/lib/node/functions/evaluate/safe-state-expression.js +236 -0
- package/lib/node/functions/evaluate/should-force-browser-runtime-in-node.js +3 -1
- package/lib/node/functions/extract-localized-values.d.ts +4 -0
- package/lib/node/functions/extract-localized-values.js +65 -26
- package/lib/node/functions/get-block-properties.js +2 -1
- package/lib/node/functions/get-processed-block.d.ts +0 -1
- package/lib/node/functions/get-processed-block.js +45 -57
- package/lib/node/functions/is-editing-or-previewing.d.ts +1 -0
- package/lib/node/functions/is-editing-or-previewing.js +3 -0
- package/lib/node/functions/set.d.ts +29 -1
- package/lib/node/functions/set.js +85 -4
- package/lib/node/helpers/bounded-cache.d.ts +4 -0
- package/lib/node/helpers/bounded-cache.js +12 -0
- package/lib/node/helpers/copy-plain-data.d.ts +6 -0
- package/lib/node/helpers/copy-plain-data.js +40 -0
- package/lib/node/index-helpers/blocks-exports.d.ts +1 -0
- package/lib/node/index-helpers/blocks-exports.js +1 -0
- package/package.json +1 -1
- package/src/blocks/symbol/symbol.helpers.ts +7 -0
- package/src/blocks/symbol/symbol.svelte +8 -1
- package/src/components/block/block.helpers.ts +38 -5
- package/src/components/block/block.svelte +14 -1
- package/src/components/builder-scripts.svelte +57 -0
- package/src/components/content/components/styles.helpers.ts +1 -1
- package/src/components/content/content.helpers.ts +45 -4
- package/src/components/content/content.svelte +7 -24
- package/src/components/content-variants/content-variants.svelte +21 -8
- package/src/components/content-variants/helpers.ts +6 -0
- package/src/constants/builder-registered-components.ts +40 -34
- package/src/constants/device-sizes.ts +14 -3
- package/src/constants/sdk-version.ts +1 -1
- package/src/context/builder-scripts.context.ts +6 -0
- package/src/functions/evaluate/browser-runtime/browser.ts +14 -1
- package/src/functions/evaluate/evaluate.ts +22 -5
- package/src/functions/evaluate/node-runtime/node-runtime.ts +116 -25
- package/src/functions/evaluate/safe-state-expression.ts +224 -0
- package/src/functions/evaluate/should-force-browser-runtime-in-node.ts +3 -1
- package/src/functions/extract-localized-values.ts +61 -27
- package/src/functions/get-block-properties.ts +5 -1
- package/src/functions/get-processed-block.ts +46 -57
- package/src/functions/is-editing-or-previewing.ts +3 -0
- package/src/functions/set.ts +89 -4
- package/src/helpers/bounded-cache.ts +12 -0
- package/src/helpers/copy-plain-data.ts +36 -0
- package/src/index-helpers/blocks-exports.ts +1 -0
|
@@ -1,61 +1,10 @@
|
|
|
1
|
-
import { TARGET } from '../constants/target';
|
|
2
1
|
import type { BuilderContextInterface } from '../context/types';
|
|
3
|
-
import { omit } from '../helpers/omit';
|
|
4
2
|
import type { BuilderBlock } from '../types/builder-block';
|
|
5
3
|
import { evaluate } from './evaluate/index';
|
|
6
4
|
import { resolveLocalizedValues } from './extract-localized-values';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { isEditingOrPreviewing } from './is-editing-or-previewing';
|
|
6
|
+
import { setCopyOnWrite } from './set';
|
|
9
7
|
import { transformBlock } from './transform-block';
|
|
10
|
-
|
|
11
|
-
// Deep clone a block but without cloning any child blocks
|
|
12
|
-
export function deepCloneWithConditions<T = any>(obj: T): T {
|
|
13
|
-
if (obj === null || typeof obj !== 'object') {
|
|
14
|
-
return obj;
|
|
15
|
-
}
|
|
16
|
-
if (Array.isArray(obj)) {
|
|
17
|
-
return (obj.map((item: any) => deepCloneWithConditions(item)) as T);
|
|
18
|
-
}
|
|
19
|
-
if ((obj as any)['@type'] === '@builder.io/sdk:Element') {
|
|
20
|
-
return obj;
|
|
21
|
-
}
|
|
22
|
-
const clonedObj: any = {};
|
|
23
|
-
for (const key in obj) {
|
|
24
|
-
if (key !== 'meta' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
25
|
-
clonedObj[key] = deepCloneWithConditions(obj[key]);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return clonedObj;
|
|
29
|
-
}
|
|
30
|
-
const IS_SDK_WITHOUT_CACHED_PROCESSED_BLOCK = ['svelte', 'vue', 'angular', 'qwik', 'solid'].includes(TARGET);
|
|
31
|
-
const getCopy = (block: BuilderBlock): BuilderBlock => {
|
|
32
|
-
if (IS_SDK_WITHOUT_CACHED_PROCESSED_BLOCK) {
|
|
33
|
-
const copy = fastClone(block);
|
|
34
|
-
const copied = {
|
|
35
|
-
...copy,
|
|
36
|
-
properties: {
|
|
37
|
-
...copy.properties
|
|
38
|
-
},
|
|
39
|
-
actions: {
|
|
40
|
-
...copy.actions
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
return copied;
|
|
44
|
-
} else {
|
|
45
|
-
const copy = (deepCloneWithConditions(omit(block, 'children', 'meta')) as BuilderBlock);
|
|
46
|
-
return {
|
|
47
|
-
...copy,
|
|
48
|
-
properties: {
|
|
49
|
-
...copy.properties
|
|
50
|
-
},
|
|
51
|
-
actions: {
|
|
52
|
-
...copy.actions
|
|
53
|
-
},
|
|
54
|
-
children: block.children,
|
|
55
|
-
meta: block.meta
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
8
|
const evaluateBindings = ({
|
|
60
9
|
block,
|
|
61
10
|
context,
|
|
@@ -68,7 +17,19 @@ const evaluateBindings = ({
|
|
|
68
17
|
if (!block.bindings) {
|
|
69
18
|
return block;
|
|
70
19
|
}
|
|
71
|
-
|
|
20
|
+
// Only objects along a bound path are copied: the block (and content) passed in is never mutated.
|
|
21
|
+
const copied = new WeakSet<object>();
|
|
22
|
+
const copy: BuilderBlock = {
|
|
23
|
+
...block,
|
|
24
|
+
properties: {
|
|
25
|
+
...block.properties
|
|
26
|
+
},
|
|
27
|
+
actions: {
|
|
28
|
+
...block.actions
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
copied.add(copy.properties!);
|
|
32
|
+
copied.add(copy.actions!);
|
|
72
33
|
for (const binding in block.bindings) {
|
|
73
34
|
const expression = block.bindings[binding];
|
|
74
35
|
const value = evaluate({
|
|
@@ -78,9 +39,24 @@ const evaluateBindings = ({
|
|
|
78
39
|
rootSetState,
|
|
79
40
|
context
|
|
80
41
|
});
|
|
81
|
-
|
|
42
|
+
setCopyOnWrite(copy, binding, value, copied);
|
|
82
43
|
}
|
|
83
|
-
return
|
|
44
|
+
return copy;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* A block without bindings processes to the same result for a given locale, so
|
|
49
|
+
* it is computed once per block object instead of on every render.
|
|
50
|
+
* Only the latest locale is kept, so a block holds at most one cached result.
|
|
51
|
+
*/
|
|
52
|
+
const PROCESSED_BLOCKS_WITHOUT_BINDINGS = new WeakMap<BuilderBlock, {
|
|
53
|
+
locale: string;
|
|
54
|
+
block: BuilderBlock;
|
|
55
|
+
}>();
|
|
56
|
+
const hasBindings = (block: BuilderBlock) => {
|
|
57
|
+
if (!block.bindings) return false;
|
|
58
|
+
for (const _ in block.bindings) return true;
|
|
59
|
+
return false;
|
|
84
60
|
};
|
|
85
61
|
export function getProcessedBlock({
|
|
86
62
|
block,
|
|
@@ -91,6 +67,13 @@ export function getProcessedBlock({
|
|
|
91
67
|
}: {
|
|
92
68
|
block: BuilderBlock;
|
|
93
69
|
} & Pick<BuilderContextInterface, 'localState' | 'context' | 'rootState' | 'rootSetState'>): BuilderBlock {
|
|
70
|
+
const locale = (rootState.locale as string | undefined);
|
|
71
|
+
const canUseCache = !hasBindings(block) && typeof block === 'object' && block !== null && !isEditingOrPreviewing();
|
|
72
|
+
const cacheKey = locale ?? '';
|
|
73
|
+
if (canUseCache) {
|
|
74
|
+
const cached = PROCESSED_BLOCKS_WITHOUT_BINDINGS.get(block);
|
|
75
|
+
if (cached && cached.locale === cacheKey) return cached.block;
|
|
76
|
+
}
|
|
94
77
|
let transformedBlock = transformBlock(block);
|
|
95
78
|
transformedBlock = evaluateBindings({
|
|
96
79
|
block: transformedBlock,
|
|
@@ -99,6 +82,12 @@ export function getProcessedBlock({
|
|
|
99
82
|
rootSetState,
|
|
100
83
|
context
|
|
101
84
|
});
|
|
102
|
-
transformedBlock = resolveLocalizedValues(transformedBlock,
|
|
85
|
+
transformedBlock = resolveLocalizedValues(transformedBlock, locale);
|
|
86
|
+
if (canUseCache) {
|
|
87
|
+
PROCESSED_BLOCKS_WITHOUT_BINDINGS.set(block, {
|
|
88
|
+
locale: cacheKey,
|
|
89
|
+
block: transformedBlock
|
|
90
|
+
});
|
|
91
|
+
}
|
|
103
92
|
return transformedBlock;
|
|
104
93
|
}
|
package/src/functions/set.ts
CHANGED
|
@@ -1,17 +1,102 @@
|
|
|
1
|
+
const parsePath = (path: string) => (path.toString().match(/[^.[\]]+/g) as string[] | null);
|
|
2
|
+
const isArrayIndex = (key: string | undefined) => Math.abs(Number(key)) >> 0 === +key!;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `__proto__` is never allowed. `constructor` and `prototype` are allowed only as
|
|
6
|
+
* the final key, where they are written as ordinary own properties.
|
|
7
|
+
*/
|
|
8
|
+
const hasUnsafeSegment = (path: string[]) => path.some((key, i) => key === '__proto__' || i < path.length - 1 && (key === 'constructor' || key === 'prototype'));
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Own properties only, so a path can never walk into a value shared through a
|
|
12
|
+
* prototype (e.g. `Object.prototype.toString`) and mutate it.
|
|
13
|
+
*/
|
|
14
|
+
const getOwn = (obj: any, key: string) => Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
|
|
15
|
+
|
|
1
16
|
/**
|
|
2
17
|
* Minimal implementation of lodash's _.set
|
|
3
18
|
* https://lodash.com/docs/4.17.15#set
|
|
4
19
|
*
|
|
5
|
-
*
|
|
20
|
+
* Mutates `obj` in place, creating missing objects/arrays along the path:
|
|
21
|
+
*
|
|
22
|
+
* const obj = { a: { b: 1 } };
|
|
23
|
+
* set(obj, 'a.c', 2); // obj is { a: { b: 1, c: 2 } }
|
|
24
|
+
* set(obj, 'list.0', 'x'); // obj.list is ['x']
|
|
25
|
+
*
|
|
26
|
+
* See ./set.test.ts for more usage examples
|
|
6
27
|
*/
|
|
7
28
|
export const set = (obj: any, _path: string | string[], value: any) => {
|
|
8
29
|
if (Object(obj) !== obj) {
|
|
9
30
|
return obj;
|
|
10
31
|
}
|
|
11
|
-
const path: string[] = Array.isArray(_path) ? _path : (_path
|
|
12
|
-
if (!path ||
|
|
32
|
+
const path: string[] = Array.isArray(_path) ? _path : (parsePath(_path) as string[]);
|
|
33
|
+
if (!path || hasUnsafeSegment(path)) {
|
|
13
34
|
return obj;
|
|
14
35
|
}
|
|
15
|
-
path.slice(0, -1).reduce((a, c, i) =>
|
|
36
|
+
path.slice(0, -1).reduce((a, c, i) => {
|
|
37
|
+
const next = getOwn(a, c);
|
|
38
|
+
return Object(next) === next ? next : a[c] = isArrayIndex(path[i + 1]) ? [] : {};
|
|
39
|
+
}, obj)[path[path.length - 1]] = value;
|
|
40
|
+
return obj;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Like `set`, but every object or array along `path` that is not in `copied`
|
|
45
|
+
* is shallow-copied before being written to, so objects shared with the
|
|
46
|
+
* original are never mutated. `obj` itself must already be a copy.
|
|
47
|
+
*
|
|
48
|
+
* const block = { options: { text: 'a' }, style: { color: 'red' } };
|
|
49
|
+
* const copy = { ...block };
|
|
50
|
+
* setCopyOnWrite(copy, 'options.text', 'b', new WeakSet());
|
|
51
|
+
* // copy.options is a new object: { text: 'b' }
|
|
52
|
+
* // block.options.text is still 'a'
|
|
53
|
+
* // copy.style === block.style (untouched branches stay shared)
|
|
54
|
+
*/
|
|
55
|
+
export const setCopyOnWrite = (obj: any, _path: string, value: any, copied: WeakSet<object>) => {
|
|
56
|
+
if (Object(obj) !== obj) {
|
|
57
|
+
return obj;
|
|
58
|
+
}
|
|
59
|
+
const path = parsePath(_path);
|
|
60
|
+
if (!path || hasUnsafeSegment(path)) {
|
|
61
|
+
return obj;
|
|
62
|
+
}
|
|
63
|
+
copied.add(obj);
|
|
64
|
+
let current = obj;
|
|
65
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
66
|
+
const key = path[i];
|
|
67
|
+
let next = getOwn(current, key);
|
|
68
|
+
if (Object(next) !== next) {
|
|
69
|
+
next = isArrayIndex(path[i + 1]) ? [] : {};
|
|
70
|
+
copied.add(next);
|
|
71
|
+
current[key] = next;
|
|
72
|
+
} else if (typeof next === 'object' && !copied.has(next)) {
|
|
73
|
+
next = Array.isArray(next) ? next.slice() : {
|
|
74
|
+
...next
|
|
75
|
+
};
|
|
76
|
+
copied.add(next);
|
|
77
|
+
current[key] = next;
|
|
78
|
+
}
|
|
79
|
+
current = next;
|
|
80
|
+
}
|
|
81
|
+
current[path[path.length - 1]] = value;
|
|
82
|
+
return obj;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Deletes the property at `path`, the inverse of `set` for an array path.
|
|
87
|
+
* Mutates `obj` in place and does nothing when a parent is missing:
|
|
88
|
+
*
|
|
89
|
+
* const obj = { a: { b: 1, c: 2 } };
|
|
90
|
+
* unset(obj, ['a', 'b']); // obj is { a: { c: 2 } }
|
|
91
|
+
* unset(obj, ['x', 'y']); // no-op
|
|
92
|
+
*/
|
|
93
|
+
export const unset = (obj: any, path: string[]) => {
|
|
94
|
+
if (Object(obj) !== obj || !path.length || hasUnsafeSegment(path)) {
|
|
95
|
+
return obj;
|
|
96
|
+
}
|
|
97
|
+
const parent = path.slice(0, -1).reduce((a, c) => Object(a) === a ? getOwn(a, c) : undefined, obj);
|
|
98
|
+
if (Object(parent) === parent) {
|
|
99
|
+
delete parent[path[path.length - 1]];
|
|
100
|
+
}
|
|
16
101
|
return obj;
|
|
17
102
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const createBoundedCache = <V,>(max: number) => {
|
|
2
|
+
const map = new Map<string, V>();
|
|
3
|
+
return {
|
|
4
|
+
get: (key: string): V | undefined => map.get(key),
|
|
5
|
+
set: (key: string, value: V) => {
|
|
6
|
+
if (!map.has(key) && map.size >= max) {
|
|
7
|
+
map.delete((map.keys().next().value as string));
|
|
8
|
+
}
|
|
9
|
+
map.set(key, value);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep-copies plain objects and arrays (anything else is kept by reference), so
|
|
3
|
+
* that state writes made while rendering never reach the content object, which
|
|
4
|
+
* apps often cache and share between requests.
|
|
5
|
+
*/
|
|
6
|
+
export const copyPlainData = <T,>(value: T, seen = new WeakMap<object, any>()): T => {
|
|
7
|
+
if (value === null || typeof value !== 'object') return value;
|
|
8
|
+
if (seen.has(value)) return seen.get(value);
|
|
9
|
+
if (Array.isArray(value)) {
|
|
10
|
+
const copy: any[] = [];
|
|
11
|
+
seen.set(value, copy);
|
|
12
|
+
for (let i = 0; i < value.length; i++) {
|
|
13
|
+
copy[i] = copyPlainData(value[i], seen);
|
|
14
|
+
}
|
|
15
|
+
return (copy as T);
|
|
16
|
+
}
|
|
17
|
+
const proto = Object.getPrototypeOf(value);
|
|
18
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
19
|
+
const copy: Record<string, any> = {};
|
|
20
|
+
seen.set(value, copy);
|
|
21
|
+
for (const key of Object.keys(value)) {
|
|
22
|
+
const copied = copyPlainData((value as any)[key], seen);
|
|
23
|
+
if (key === '__proto__') {
|
|
24
|
+
// Assigning would call the prototype setter; JSON can carry `__proto__` as an own key.
|
|
25
|
+
Object.defineProperty(copy, key, {
|
|
26
|
+
value: copied,
|
|
27
|
+
enumerable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
configurable: true
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
copy[key] = copied;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return (copy as T);
|
|
36
|
+
}
|
|
@@ -7,6 +7,7 @@ export { default as Symbol } from '../blocks/symbol/index';
|
|
|
7
7
|
export { default as Text } from '../blocks/text/index';
|
|
8
8
|
export { default as Video } from '../blocks/video/index';
|
|
9
9
|
export { default as Blocks } from '../components/blocks/index';
|
|
10
|
+
export { default as BuilderScripts } from '../components/builder-scripts.svelte';
|
|
10
11
|
export { default as Content } from '../components/content-variants/index';
|
|
11
12
|
|
|
12
13
|
/**
|