@highstate/designer 0.9.18 → 0.9.20
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/.output/nitro.json +3 -3
- package/.output/public/_nuxt/20zRBBOT.js +276 -0
- package/.output/public/_nuxt/3cWt8vz3.js +1 -0
- package/.output/public/_nuxt/{xVLoeQ-B.js → 4-z0BBBK.js} +1 -1
- package/.output/public/_nuxt/B6Kaf1Zv.js +1 -0
- package/.output/public/_nuxt/B7eyK5kF.js +1 -0
- package/.output/public/_nuxt/{CPSgaaQ0.js → BBm9Ui4P.js} +1 -1
- package/.output/public/_nuxt/BCeRv53V.js +1 -0
- package/.output/public/_nuxt/BFHRoLmv.js +1 -0
- package/.output/public/_nuxt/BKG_vmA6.js +1 -0
- package/.output/public/_nuxt/BMQs3vM5.js +2 -0
- package/.output/public/_nuxt/BTT16DZE.js +1 -0
- package/.output/public/_nuxt/{B7grBCAR.js → BUBm2gu0.js} +1 -1
- package/.output/public/_nuxt/BUVU2BiV.js +1 -0
- package/.output/public/_nuxt/BZsnSVZa.js +1 -0
- package/.output/public/_nuxt/BZxTtwKO.js +1 -0
- package/.output/public/_nuxt/Bc22Y1oD.js +1 -0
- package/.output/public/_nuxt/BdJnfSuv.js +1 -0
- package/.output/public/_nuxt/BfUh6PEC.js +1 -0
- package/.output/public/_nuxt/BhJD15Lv.js +1 -0
- package/.output/public/_nuxt/BvXvCmL7.js +1 -0
- package/.output/public/_nuxt/C1NBlWY6.js +1 -0
- package/.output/public/_nuxt/C3tTPg4E.js +1 -0
- package/.output/public/_nuxt/CHdpI9cE.js +1 -0
- package/.output/public/_nuxt/CJbwedTO.js +1 -0
- package/.output/public/_nuxt/CXMRj2GR.js +1 -0
- package/.output/public/_nuxt/CgH_TWd3.js +1 -0
- package/.output/public/_nuxt/CjzOrk9n.js +1 -0
- package/.output/public/_nuxt/CnSrlJ1t.js +1 -0
- package/.output/public/_nuxt/CpdUDRp-.js +1 -0
- package/.output/public/_nuxt/CucSXtnI.js +16 -0
- package/.output/public/_nuxt/{CNBtkm4J.js → D0GxoeXH.js} +2 -2
- package/.output/public/_nuxt/D2AD0cA7.js +1 -0
- package/.output/public/_nuxt/D2QRMlri.js +1 -0
- package/.output/public/_nuxt/D5OlmvkM.js +1 -0
- package/.output/public/_nuxt/D6E-gKom.js +12 -0
- package/.output/public/_nuxt/DBdpdpK3.js +1 -0
- package/.output/public/_nuxt/DEnsbvQE.js +1 -0
- package/.output/public/_nuxt/DFH86FKQ.js +1 -0
- package/.output/public/_nuxt/DKZb-7H-.js +2 -0
- package/.output/public/_nuxt/DMvBTgJm.js +1 -0
- package/.output/public/_nuxt/DOgaXG8Y.js +1 -0
- package/.output/public/_nuxt/{ClbN2oa7.js → DRIP7i-G.js} +2 -2
- package/.output/public/_nuxt/DUARq8BM.js +1 -0
- package/.output/public/_nuxt/DVV-1Xgo.js +1 -0
- package/.output/public/_nuxt/DW9frVpz.js +1 -0
- package/.output/public/_nuxt/DWDpKQJN.js +1 -0
- package/.output/public/_nuxt/Dbgx9Kfk.js +1 -0
- package/.output/public/_nuxt/DbomWJMC.js +1 -0
- package/.output/public/_nuxt/Df5-uBpS.js +1 -0
- package/.output/public/_nuxt/DgxepGqe.js +1 -0
- package/.output/public/_nuxt/DjN4qVUp.js +1 -0
- package/.output/public/_nuxt/DmQuAe0a.js +1 -0
- package/.output/public/_nuxt/DnkIt1sE.js +1 -0
- package/.output/public/_nuxt/DpdC86Cg.js +1 -0
- package/.output/public/_nuxt/DrMaf3PA.js +5 -0
- package/.output/public/_nuxt/Dsv_PvmI.js +1 -0
- package/.output/public/_nuxt/DuztTtWK.js +1 -0
- package/.output/public/_nuxt/DxhSsuVH.js +1 -0
- package/.output/public/_nuxt/G46Y9AKK.js +1 -0
- package/.output/public/_nuxt/SecretValueField.SMGlmIfE.css +1 -0
- package/.output/public/_nuxt/TqsILp0j.js +2 -0
- package/.output/public/_nuxt/XVH4GPVs.js +1 -0
- package/.output/public/_nuxt/_pageId_.Be9XJqQA.css +1 -0
- package/.output/public/_nuxt/apt5CXWJ.js +2 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/4aa61a2b-8c04-489d-bc5e-b3c10756c7d5.json +1 -0
- package/.output/public/_nuxt/{entry.YsT17dxl.css → entry.B__IA1SB.css} +1 -1
- package/.output/public/_nuxt/error-404.Ctkhr_Pq.css +1 -0
- package/.output/public/_nuxt/error-500.BsWzRwYo.css +1 -0
- package/.output/public/_nuxt/{graph-resolver-ClVztv7P.js → graph-resolver-r_0JlXH_.js} +100 -100
- package/.output/public/_nuxt/gt3opOQe.js +1 -0
- package/.output/public/_nuxt/index.CdaM9XKS.css +1 -0
- package/.output/public/_nuxt/j6gS8Wqd.js +1 -0
- package/.output/public/_nuxt/jhVMpA5V.js +1 -0
- package/.output/public/_nuxt/koatKMQr.js +26 -0
- package/.output/public/_nuxt/oZs8U75K.js +1 -0
- package/.output/public/_nuxt/operations.3bVU1gWl.css +1 -0
- package/.output/public/_nuxt/rwNeRj8A.js +1 -0
- package/.output/public/_nuxt/settings.DE1a_g5Y.css +1 -0
- package/.output/public/_nuxt/{vuetify.C_sYHwU6.css → vuetify.uXRHzFBB.css} +1 -1
- package/.output/public/_nuxt/whD7B6hi.js +1 -0
- package/.output/public/_nuxt/yJRFOr9c.js +1 -0
- package/.output/public/_nuxt/yb5mHxB5.js +1 -0
- package/.output/server/index.mjs +3686 -2213
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/@babel/parser/lib/index.js +7 -2
- package/.output/server/node_modules/@babel/parser/package.json +2 -2
- package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +24 -25
- package/.output/server/node_modules/@vue/compiler-core/package.json +4 -4
- package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +1 -1
- package/.output/server/node_modules/@vue/compiler-dom/package.json +3 -3
- package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1 -1
- package/.output/server/node_modules/@vue/compiler-ssr/package.json +3 -3
- package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +4 -4
- package/.output/server/node_modules/@vue/reactivity/package.json +2 -2
- package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +51 -47
- package/.output/server/node_modules/@vue/runtime-core/package.json +3 -3
- package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +18 -16
- package/.output/server/node_modules/@vue/runtime-dom/package.json +4 -4
- package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +26 -4
- package/.output/server/node_modules/@vue/server-renderer/package.json +4 -4
- package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +14 -3
- package/.output/server/node_modules/@vue/shared/package.json +1 -1
- package/.output/server/node_modules/copy-anything/dist/index.js +36 -0
- package/.output/server/node_modules/copy-anything/package.json +108 -0
- package/.output/server/node_modules/is-what/dist/index.js +171 -0
- package/.output/server/node_modules/is-what/package.json +128 -0
- package/.output/server/node_modules/superjson/dist/accessDeep.js +123 -0
- package/.output/server/node_modules/superjson/dist/class-registry.js +22 -0
- package/.output/server/node_modules/superjson/dist/custom-transformer-registry.js +16 -0
- package/.output/server/node_modules/superjson/dist/double-indexed-kv.js +21 -0
- package/.output/server/node_modules/superjson/dist/index.js +89 -0
- package/.output/server/node_modules/superjson/dist/is.js +35 -0
- package/.output/server/node_modules/superjson/dist/pathstringifier.js +29 -0
- package/.output/server/node_modules/superjson/dist/plainer.js +173 -0
- package/.output/server/node_modules/superjson/dist/registry.js +26 -0
- package/.output/server/node_modules/superjson/dist/transformer.js +197 -0
- package/.output/server/node_modules/superjson/dist/util.js +45 -0
- package/.output/server/node_modules/superjson/package.json +79 -0
- package/.output/server/node_modules/unhead/dist/plugins.mjs +14 -8
- package/.output/server/node_modules/unhead/dist/server.mjs +3 -3
- package/.output/server/node_modules/unhead/dist/shared/{unhead.C13swrCa.mjs → unhead.BYvz9V1x.mjs} +1 -6
- package/.output/server/node_modules/unhead/dist/shared/{unhead.Di5OD67x.mjs → unhead.BpRRHAhY.mjs} +4 -0
- package/.output/server/node_modules/unhead/dist/shared/{unhead.CAk5S5m6.mjs → unhead.DH45uomy.mjs} +1 -1
- package/.output/server/node_modules/unhead/dist/shared/{unhead.DeCxexjU.mjs → unhead.Djo8ep_Y.mjs} +1 -1
- package/.output/server/node_modules/unhead/dist/utils.mjs +2 -2
- package/.output/server/node_modules/unhead/package.json +1 -1
- package/.output/server/node_modules/vue/dist/vue.cjs.js +1 -1
- package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +1 -1
- package/.output/server/node_modules/vue/package.json +6 -6
- package/.output/server/node_modules/vue-bundle-renderer/package.json +13 -13
- package/.output/server/package.json +16 -13
- package/package.json +16 -12
- package/.output/public/_nuxt/84XNjSIe.js +0 -1
- package/.output/public/_nuxt/BKmAPqal.js +0 -1
- package/.output/public/_nuxt/BLOpwnqT.js +0 -1
- package/.output/public/_nuxt/BTEhxafZ.js +0 -1
- package/.output/public/_nuxt/B_wu9Dqv.js +0 -1
- package/.output/public/_nuxt/BebE75YV.js +0 -1
- package/.output/public/_nuxt/Bm_zuxCd.js +0 -1
- package/.output/public/_nuxt/BvYfgXkl.js +0 -1
- package/.output/public/_nuxt/C-_oQ9hf.js +0 -1
- package/.output/public/_nuxt/COWjEZnb.js +0 -1
- package/.output/public/_nuxt/CYRjgJw9.js +0 -26
- package/.output/public/_nuxt/Cj-b45ZR.js +0 -1
- package/.output/public/_nuxt/CtMxL075.js +0 -21
- package/.output/public/_nuxt/D-pF80u_.js +0 -1
- package/.output/public/_nuxt/D0Gq3ULd.js +0 -1
- package/.output/public/_nuxt/DCWrMWBD.js +0 -1
- package/.output/public/_nuxt/DEsY2yuF.js +0 -1
- package/.output/public/_nuxt/DPvdOr2J.js +0 -1
- package/.output/public/_nuxt/DbtIzDGy.js +0 -1
- package/.output/public/_nuxt/DwheRqRn.js +0 -1
- package/.output/public/_nuxt/SVGiTNnK.js +0 -1
- package/.output/public/_nuxt/SettingsDataTable.BLJqwlEK.css +0 -1
- package/.output/public/_nuxt/UQxqNY8s.js +0 -273
- package/.output/public/_nuxt/about.fWlW3EhQ.css +0 -1
- package/.output/public/_nuxt/builds/meta/b0e10f5e-bdc5-4007-9281-161aa323adf1.json +0 -1
- package/.output/public/_nuxt/error-404.CH3riSrg.css +0 -1
- package/.output/public/_nuxt/error-500.C8Qk6cR7.css +0 -1
- package/.output/public/_nuxt/index.smtD6lYF.css +0 -1
- package/.output/public/_nuxt/instances.CGwVkdDM.css +0 -1
- package/.output/public/_nuxt/oVh4WQ21.js +0 -1
- package/.output/public/_nuxt/operations.BfCOaoAx.css +0 -1
- package/.output/public/_nuxt/operations.DvUkbQbt.css +0 -1
- package/.output/public/_nuxt/p5ZwBirz.js +0 -1
- package/.output/public/_nuxt/secrets._PitGGJK.css +0 -1
- package/.output/public/_nuxt/settings.BCRf8MgD.css +0 -1
- package/.output/public/_nuxt/terminals.B07MGsh3.css +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "is-what",
|
|
3
|
+
"version": "4.1.16",
|
|
4
|
+
"description": "JS type check (TypeScript supported) functions like `isPlainObject() isArray()` etc. A simple & small integration.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"require": {
|
|
13
|
+
"types": "./dist/cjs/index.d.cts",
|
|
14
|
+
"default": "./dist/cjs/index.cjs"
|
|
15
|
+
},
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=12.13"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"lint": "tsc --noEmit && eslint ./src --ext .ts",
|
|
31
|
+
"build": "rollup -c ./rollup.config.js",
|
|
32
|
+
"build:docs": "typedoc",
|
|
33
|
+
"release": "npm run lint && del dist && npm run build && np"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/mesqueeb/is-what.git"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"javascript",
|
|
41
|
+
"typescript",
|
|
42
|
+
"typechecker",
|
|
43
|
+
"check-type",
|
|
44
|
+
"javascript-type",
|
|
45
|
+
"primitive-types",
|
|
46
|
+
"plain-object",
|
|
47
|
+
"plain-objects",
|
|
48
|
+
"class-instance",
|
|
49
|
+
"class-identifier",
|
|
50
|
+
"type-checking",
|
|
51
|
+
"type-checker",
|
|
52
|
+
"type-check",
|
|
53
|
+
"define-type",
|
|
54
|
+
"get-type",
|
|
55
|
+
"what-type",
|
|
56
|
+
"is-object",
|
|
57
|
+
"is-plain-obj",
|
|
58
|
+
"is-plain-object"
|
|
59
|
+
],
|
|
60
|
+
"author": "Luca Ban - Mesqueeb",
|
|
61
|
+
"funding": "https://github.com/sponsors/mesqueeb",
|
|
62
|
+
"license": "MIT",
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://github.com/mesqueeb/is-what/issues"
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://github.com/mesqueeb/is-what#readme",
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
69
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
70
|
+
"del-cli": "^5.1.0",
|
|
71
|
+
"eslint-config-prettier": "^8.10.0",
|
|
72
|
+
"eslint-plugin-tree-shaking": "^1.10.1",
|
|
73
|
+
"eslint": "^8.52.0",
|
|
74
|
+
"np": "^8.0.4",
|
|
75
|
+
"prettier-plugin-jsdoc": "^0.4.2",
|
|
76
|
+
"prettier": "^2.8.8",
|
|
77
|
+
"rollup-plugin-dts": "^5.3.1",
|
|
78
|
+
"rollup-plugin-esbuild": "^5.0.0",
|
|
79
|
+
"rollup": "^3.29.4",
|
|
80
|
+
"typedoc": "^0.25.2",
|
|
81
|
+
"typescript": "^5.2.2",
|
|
82
|
+
"vitest": "^0.34.6"
|
|
83
|
+
},
|
|
84
|
+
"np": {
|
|
85
|
+
"branch": "production",
|
|
86
|
+
"publish": false,
|
|
87
|
+
"yarn": false
|
|
88
|
+
},
|
|
89
|
+
"eslintConfig": {
|
|
90
|
+
"ignorePatterns": [
|
|
91
|
+
"node_modules",
|
|
92
|
+
"dist",
|
|
93
|
+
"scripts",
|
|
94
|
+
"test"
|
|
95
|
+
],
|
|
96
|
+
"root": true,
|
|
97
|
+
"parser": "@typescript-eslint/parser",
|
|
98
|
+
"plugins": [
|
|
99
|
+
"@typescript-eslint",
|
|
100
|
+
"tree-shaking"
|
|
101
|
+
],
|
|
102
|
+
"extends": [
|
|
103
|
+
"eslint:recommended",
|
|
104
|
+
"plugin:@typescript-eslint/eslint-recommended",
|
|
105
|
+
"plugin:@typescript-eslint/recommended",
|
|
106
|
+
"prettier"
|
|
107
|
+
],
|
|
108
|
+
"rules": {
|
|
109
|
+
"@typescript-eslint/no-empty-function": "off",
|
|
110
|
+
"@typescript-eslint/no-explicit-any": "off",
|
|
111
|
+
"@typescript-eslint/ban-ts-ignore": "off",
|
|
112
|
+
"tree-shaking/no-side-effects-in-initialization": "error",
|
|
113
|
+
"@typescript-eslint/ban-ts-comment": "off"
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"prettier": {
|
|
117
|
+
"printWidth": 100,
|
|
118
|
+
"tabWidth": 2,
|
|
119
|
+
"singleQuote": true,
|
|
120
|
+
"trailingComma": "es5",
|
|
121
|
+
"semi": false,
|
|
122
|
+
"bracketSpacing": true,
|
|
123
|
+
"quoteProps": "consistent",
|
|
124
|
+
"plugins": [
|
|
125
|
+
"prettier-plugin-jsdoc"
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { isMap, isArray, isPlainObject, isSet } from './is.js';
|
|
2
|
+
import { includes } from './util.js';
|
|
3
|
+
const getNthKey = (value, n) => {
|
|
4
|
+
if (n > value.size)
|
|
5
|
+
throw new Error('index out of bounds');
|
|
6
|
+
const keys = value.keys();
|
|
7
|
+
while (n > 0) {
|
|
8
|
+
keys.next();
|
|
9
|
+
n--;
|
|
10
|
+
}
|
|
11
|
+
return keys.next().value;
|
|
12
|
+
};
|
|
13
|
+
function validatePath(path) {
|
|
14
|
+
if (includes(path, '__proto__')) {
|
|
15
|
+
throw new Error('__proto__ is not allowed as a property');
|
|
16
|
+
}
|
|
17
|
+
if (includes(path, 'prototype')) {
|
|
18
|
+
throw new Error('prototype is not allowed as a property');
|
|
19
|
+
}
|
|
20
|
+
if (includes(path, 'constructor')) {
|
|
21
|
+
throw new Error('constructor is not allowed as a property');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const getDeep = (object, path) => {
|
|
25
|
+
validatePath(path);
|
|
26
|
+
for (let i = 0; i < path.length; i++) {
|
|
27
|
+
const key = path[i];
|
|
28
|
+
if (isSet(object)) {
|
|
29
|
+
object = getNthKey(object, +key);
|
|
30
|
+
}
|
|
31
|
+
else if (isMap(object)) {
|
|
32
|
+
const row = +key;
|
|
33
|
+
const type = +path[++i] === 0 ? 'key' : 'value';
|
|
34
|
+
const keyOfRow = getNthKey(object, row);
|
|
35
|
+
switch (type) {
|
|
36
|
+
case 'key':
|
|
37
|
+
object = keyOfRow;
|
|
38
|
+
break;
|
|
39
|
+
case 'value':
|
|
40
|
+
object = object.get(keyOfRow);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
object = object[key];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return object;
|
|
49
|
+
};
|
|
50
|
+
export const setDeep = (object, path, mapper) => {
|
|
51
|
+
validatePath(path);
|
|
52
|
+
if (path.length === 0) {
|
|
53
|
+
return mapper(object);
|
|
54
|
+
}
|
|
55
|
+
let parent = object;
|
|
56
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
57
|
+
const key = path[i];
|
|
58
|
+
if (isArray(parent)) {
|
|
59
|
+
const index = +key;
|
|
60
|
+
parent = parent[index];
|
|
61
|
+
}
|
|
62
|
+
else if (isPlainObject(parent)) {
|
|
63
|
+
parent = parent[key];
|
|
64
|
+
}
|
|
65
|
+
else if (isSet(parent)) {
|
|
66
|
+
const row = +key;
|
|
67
|
+
parent = getNthKey(parent, row);
|
|
68
|
+
}
|
|
69
|
+
else if (isMap(parent)) {
|
|
70
|
+
const isEnd = i === path.length - 2;
|
|
71
|
+
if (isEnd) {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
const row = +key;
|
|
75
|
+
const type = +path[++i] === 0 ? 'key' : 'value';
|
|
76
|
+
const keyOfRow = getNthKey(parent, row);
|
|
77
|
+
switch (type) {
|
|
78
|
+
case 'key':
|
|
79
|
+
parent = keyOfRow;
|
|
80
|
+
break;
|
|
81
|
+
case 'value':
|
|
82
|
+
parent = parent.get(keyOfRow);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const lastKey = path[path.length - 1];
|
|
88
|
+
if (isArray(parent)) {
|
|
89
|
+
parent[+lastKey] = mapper(parent[+lastKey]);
|
|
90
|
+
}
|
|
91
|
+
else if (isPlainObject(parent)) {
|
|
92
|
+
parent[lastKey] = mapper(parent[lastKey]);
|
|
93
|
+
}
|
|
94
|
+
if (isSet(parent)) {
|
|
95
|
+
const oldValue = getNthKey(parent, +lastKey);
|
|
96
|
+
const newValue = mapper(oldValue);
|
|
97
|
+
if (oldValue !== newValue) {
|
|
98
|
+
parent.delete(oldValue);
|
|
99
|
+
parent.add(newValue);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (isMap(parent)) {
|
|
103
|
+
const row = +path[path.length - 2];
|
|
104
|
+
const keyToRow = getNthKey(parent, row);
|
|
105
|
+
const type = +lastKey === 0 ? 'key' : 'value';
|
|
106
|
+
switch (type) {
|
|
107
|
+
case 'key': {
|
|
108
|
+
const newKey = mapper(keyToRow);
|
|
109
|
+
parent.set(newKey, parent.get(keyToRow));
|
|
110
|
+
if (newKey !== keyToRow) {
|
|
111
|
+
parent.delete(keyToRow);
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'value': {
|
|
116
|
+
parent.set(keyToRow, mapper(parent.get(keyToRow)));
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return object;
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=accessDeep.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Registry } from './registry.js';
|
|
2
|
+
export class ClassRegistry extends Registry {
|
|
3
|
+
constructor() {
|
|
4
|
+
super(c => c.name);
|
|
5
|
+
this.classToAllowedProps = new Map();
|
|
6
|
+
}
|
|
7
|
+
register(value, options) {
|
|
8
|
+
if (typeof options === 'object') {
|
|
9
|
+
if (options.allowProps) {
|
|
10
|
+
this.classToAllowedProps.set(value, options.allowProps);
|
|
11
|
+
}
|
|
12
|
+
super.register(value, options.identifier);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
super.register(value, options);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
getAllowedProps(value) {
|
|
19
|
+
return this.classToAllowedProps.get(value);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=class-registry.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { find } from './util.js';
|
|
2
|
+
export class CustomTransformerRegistry {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.transfomers = {};
|
|
5
|
+
}
|
|
6
|
+
register(transformer) {
|
|
7
|
+
this.transfomers[transformer.name] = transformer;
|
|
8
|
+
}
|
|
9
|
+
findApplicable(v) {
|
|
10
|
+
return find(this.transfomers, transformer => transformer.isApplicable(v));
|
|
11
|
+
}
|
|
12
|
+
findByName(name) {
|
|
13
|
+
return this.transfomers[name];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=custom-transformer-registry.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class DoubleIndexedKV {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.keyToValue = new Map();
|
|
4
|
+
this.valueToKey = new Map();
|
|
5
|
+
}
|
|
6
|
+
set(key, value) {
|
|
7
|
+
this.keyToValue.set(key, value);
|
|
8
|
+
this.valueToKey.set(value, key);
|
|
9
|
+
}
|
|
10
|
+
getByKey(key) {
|
|
11
|
+
return this.keyToValue.get(key);
|
|
12
|
+
}
|
|
13
|
+
getByValue(value) {
|
|
14
|
+
return this.valueToKey.get(value);
|
|
15
|
+
}
|
|
16
|
+
clear() {
|
|
17
|
+
this.keyToValue.clear();
|
|
18
|
+
this.valueToKey.clear();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=double-indexed-kv.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ClassRegistry } from './class-registry.js';
|
|
2
|
+
import { Registry } from './registry.js';
|
|
3
|
+
import { CustomTransformerRegistry, } from './custom-transformer-registry.js';
|
|
4
|
+
import { applyReferentialEqualityAnnotations, applyValueAnnotations, generateReferentialEqualityAnnotations, walker, } from './plainer.js';
|
|
5
|
+
import { copy } from 'copy-anything';
|
|
6
|
+
export default class SuperJSON {
|
|
7
|
+
/**
|
|
8
|
+
* @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`.
|
|
9
|
+
*/
|
|
10
|
+
constructor({ dedupe = false, } = {}) {
|
|
11
|
+
this.classRegistry = new ClassRegistry();
|
|
12
|
+
this.symbolRegistry = new Registry(s => s.description ?? '');
|
|
13
|
+
this.customTransformerRegistry = new CustomTransformerRegistry();
|
|
14
|
+
this.allowedErrorProps = [];
|
|
15
|
+
this.dedupe = dedupe;
|
|
16
|
+
}
|
|
17
|
+
serialize(object) {
|
|
18
|
+
const identities = new Map();
|
|
19
|
+
const output = walker(object, identities, this, this.dedupe);
|
|
20
|
+
const res = {
|
|
21
|
+
json: output.transformedValue,
|
|
22
|
+
};
|
|
23
|
+
if (output.annotations) {
|
|
24
|
+
res.meta = {
|
|
25
|
+
...res.meta,
|
|
26
|
+
values: output.annotations,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe);
|
|
30
|
+
if (equalityAnnotations) {
|
|
31
|
+
res.meta = {
|
|
32
|
+
...res.meta,
|
|
33
|
+
referentialEqualities: equalityAnnotations,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return res;
|
|
37
|
+
}
|
|
38
|
+
deserialize(payload) {
|
|
39
|
+
const { json, meta } = payload;
|
|
40
|
+
let result = copy(json);
|
|
41
|
+
if (meta?.values) {
|
|
42
|
+
result = applyValueAnnotations(result, meta.values, this);
|
|
43
|
+
}
|
|
44
|
+
if (meta?.referentialEqualities) {
|
|
45
|
+
result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
stringify(object) {
|
|
50
|
+
return JSON.stringify(this.serialize(object));
|
|
51
|
+
}
|
|
52
|
+
parse(string) {
|
|
53
|
+
return this.deserialize(JSON.parse(string));
|
|
54
|
+
}
|
|
55
|
+
registerClass(v, options) {
|
|
56
|
+
this.classRegistry.register(v, options);
|
|
57
|
+
}
|
|
58
|
+
registerSymbol(v, identifier) {
|
|
59
|
+
this.symbolRegistry.register(v, identifier);
|
|
60
|
+
}
|
|
61
|
+
registerCustom(transformer, name) {
|
|
62
|
+
this.customTransformerRegistry.register({
|
|
63
|
+
name,
|
|
64
|
+
...transformer,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
allowErrorProps(...props) {
|
|
68
|
+
this.allowedErrorProps.push(...props);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
SuperJSON.defaultInstance = new SuperJSON();
|
|
72
|
+
SuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance);
|
|
73
|
+
SuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance);
|
|
74
|
+
SuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance);
|
|
75
|
+
SuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance);
|
|
76
|
+
SuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance);
|
|
77
|
+
SuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance);
|
|
78
|
+
SuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance);
|
|
79
|
+
SuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance);
|
|
80
|
+
export { SuperJSON };
|
|
81
|
+
export const serialize = SuperJSON.serialize;
|
|
82
|
+
export const deserialize = SuperJSON.deserialize;
|
|
83
|
+
export const stringify = SuperJSON.stringify;
|
|
84
|
+
export const parse = SuperJSON.parse;
|
|
85
|
+
export const registerClass = SuperJSON.registerClass;
|
|
86
|
+
export const registerCustom = SuperJSON.registerCustom;
|
|
87
|
+
export const registerSymbol = SuperJSON.registerSymbol;
|
|
88
|
+
export const allowErrorProps = SuperJSON.allowErrorProps;
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const getType = (payload) => Object.prototype.toString.call(payload).slice(8, -1);
|
|
2
|
+
export const isUndefined = (payload) => typeof payload === 'undefined';
|
|
3
|
+
export const isNull = (payload) => payload === null;
|
|
4
|
+
export const isPlainObject = (payload) => {
|
|
5
|
+
if (typeof payload !== 'object' || payload === null)
|
|
6
|
+
return false;
|
|
7
|
+
if (payload === Object.prototype)
|
|
8
|
+
return false;
|
|
9
|
+
if (Object.getPrototypeOf(payload) === null)
|
|
10
|
+
return true;
|
|
11
|
+
return Object.getPrototypeOf(payload) === Object.prototype;
|
|
12
|
+
};
|
|
13
|
+
export const isEmptyObject = (payload) => isPlainObject(payload) && Object.keys(payload).length === 0;
|
|
14
|
+
export const isArray = (payload) => Array.isArray(payload);
|
|
15
|
+
export const isString = (payload) => typeof payload === 'string';
|
|
16
|
+
export const isNumber = (payload) => typeof payload === 'number' && !isNaN(payload);
|
|
17
|
+
export const isBoolean = (payload) => typeof payload === 'boolean';
|
|
18
|
+
export const isRegExp = (payload) => payload instanceof RegExp;
|
|
19
|
+
export const isMap = (payload) => payload instanceof Map;
|
|
20
|
+
export const isSet = (payload) => payload instanceof Set;
|
|
21
|
+
export const isSymbol = (payload) => getType(payload) === 'Symbol';
|
|
22
|
+
export const isDate = (payload) => payload instanceof Date && !isNaN(payload.valueOf());
|
|
23
|
+
export const isError = (payload) => payload instanceof Error;
|
|
24
|
+
export const isNaNValue = (payload) => typeof payload === 'number' && isNaN(payload);
|
|
25
|
+
export const isPrimitive = (payload) => isBoolean(payload) ||
|
|
26
|
+
isNull(payload) ||
|
|
27
|
+
isUndefined(payload) ||
|
|
28
|
+
isNumber(payload) ||
|
|
29
|
+
isString(payload) ||
|
|
30
|
+
isSymbol(payload);
|
|
31
|
+
export const isBigint = (payload) => typeof payload === 'bigint';
|
|
32
|
+
export const isInfinite = (payload) => payload === Infinity || payload === -Infinity;
|
|
33
|
+
export const isTypedArray = (payload) => ArrayBuffer.isView(payload) && !(payload instanceof DataView);
|
|
34
|
+
export const isURL = (payload) => payload instanceof URL;
|
|
35
|
+
//# sourceMappingURL=is.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const escapeKey = (key) => key.replace(/\./g, '\\.');
|
|
2
|
+
export const stringifyPath = (path) => path
|
|
3
|
+
.map(String)
|
|
4
|
+
.map(escapeKey)
|
|
5
|
+
.join('.');
|
|
6
|
+
export const parsePath = (string) => {
|
|
7
|
+
const result = [];
|
|
8
|
+
let segment = '';
|
|
9
|
+
for (let i = 0; i < string.length; i++) {
|
|
10
|
+
let char = string.charAt(i);
|
|
11
|
+
const isEscapedDot = char === '\\' && string.charAt(i + 1) === '.';
|
|
12
|
+
if (isEscapedDot) {
|
|
13
|
+
segment += '.';
|
|
14
|
+
i++;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const isEndOfSegment = char === '.';
|
|
18
|
+
if (isEndOfSegment) {
|
|
19
|
+
result.push(segment);
|
|
20
|
+
segment = '';
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
segment += char;
|
|
24
|
+
}
|
|
25
|
+
const lastSegment = segment;
|
|
26
|
+
result.push(lastSegment);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=pathstringifier.js.map
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { isArray, isEmptyObject, isMap, isPlainObject, isPrimitive, isSet, } from './is.js';
|
|
2
|
+
import { escapeKey, stringifyPath } from './pathstringifier.js';
|
|
3
|
+
import { isInstanceOfRegisteredClass, transformValue, untransformValue, } from './transformer.js';
|
|
4
|
+
import { includes, forEach } from './util.js';
|
|
5
|
+
import { parsePath } from './pathstringifier.js';
|
|
6
|
+
import { getDeep, setDeep } from './accessDeep.js';
|
|
7
|
+
function traverse(tree, walker, origin = []) {
|
|
8
|
+
if (!tree) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!isArray(tree)) {
|
|
12
|
+
forEach(tree, (subtree, key) => traverse(subtree, walker, [...origin, ...parsePath(key)]));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const [nodeValue, children] = tree;
|
|
16
|
+
if (children) {
|
|
17
|
+
forEach(children, (child, key) => {
|
|
18
|
+
traverse(child, walker, [...origin, ...parsePath(key)]);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
walker(nodeValue, origin);
|
|
22
|
+
}
|
|
23
|
+
export function applyValueAnnotations(plain, annotations, superJson) {
|
|
24
|
+
traverse(annotations, (type, path) => {
|
|
25
|
+
plain = setDeep(plain, path, v => untransformValue(v, type, superJson));
|
|
26
|
+
});
|
|
27
|
+
return plain;
|
|
28
|
+
}
|
|
29
|
+
export function applyReferentialEqualityAnnotations(plain, annotations) {
|
|
30
|
+
function apply(identicalPaths, path) {
|
|
31
|
+
const object = getDeep(plain, parsePath(path));
|
|
32
|
+
identicalPaths.map(parsePath).forEach(identicalObjectPath => {
|
|
33
|
+
plain = setDeep(plain, identicalObjectPath, () => object);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (isArray(annotations)) {
|
|
37
|
+
const [root, other] = annotations;
|
|
38
|
+
root.forEach(identicalPath => {
|
|
39
|
+
plain = setDeep(plain, parsePath(identicalPath), () => plain);
|
|
40
|
+
});
|
|
41
|
+
if (other) {
|
|
42
|
+
forEach(other, apply);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
forEach(annotations, apply);
|
|
47
|
+
}
|
|
48
|
+
return plain;
|
|
49
|
+
}
|
|
50
|
+
const isDeep = (object, superJson) => isPlainObject(object) ||
|
|
51
|
+
isArray(object) ||
|
|
52
|
+
isMap(object) ||
|
|
53
|
+
isSet(object) ||
|
|
54
|
+
isInstanceOfRegisteredClass(object, superJson);
|
|
55
|
+
function addIdentity(object, path, identities) {
|
|
56
|
+
const existingSet = identities.get(object);
|
|
57
|
+
if (existingSet) {
|
|
58
|
+
existingSet.push(path);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
identities.set(object, [path]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function generateReferentialEqualityAnnotations(identitites, dedupe) {
|
|
65
|
+
const result = {};
|
|
66
|
+
let rootEqualityPaths = undefined;
|
|
67
|
+
identitites.forEach(paths => {
|
|
68
|
+
if (paths.length <= 1) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// if we're not deduping, all of these objects continue existing.
|
|
72
|
+
// putting the shortest path first makes it easier to parse for humans
|
|
73
|
+
// if we're deduping though, only the first entry will still exist, so we can't do this optimisation.
|
|
74
|
+
if (!dedupe) {
|
|
75
|
+
paths = paths
|
|
76
|
+
.map(path => path.map(String))
|
|
77
|
+
.sort((a, b) => a.length - b.length);
|
|
78
|
+
}
|
|
79
|
+
const [representativePath, ...identicalPaths] = paths;
|
|
80
|
+
if (representativePath.length === 0) {
|
|
81
|
+
rootEqualityPaths = identicalPaths.map(stringifyPath);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
result[stringifyPath(representativePath)] = identicalPaths.map(stringifyPath);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (rootEqualityPaths) {
|
|
88
|
+
if (isEmptyObject(result)) {
|
|
89
|
+
return [rootEqualityPaths];
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return [rootEqualityPaths, result];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return isEmptyObject(result) ? undefined : result;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export const walker = (object, identities, superJson, dedupe, path = [], objectsInThisPath = [], seenObjects = new Map()) => {
|
|
100
|
+
const primitive = isPrimitive(object);
|
|
101
|
+
if (!primitive) {
|
|
102
|
+
addIdentity(object, path, identities);
|
|
103
|
+
const seen = seenObjects.get(object);
|
|
104
|
+
if (seen) {
|
|
105
|
+
// short-circuit result if we've seen this object before
|
|
106
|
+
return dedupe
|
|
107
|
+
? {
|
|
108
|
+
transformedValue: null,
|
|
109
|
+
}
|
|
110
|
+
: seen;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!isDeep(object, superJson)) {
|
|
114
|
+
const transformed = transformValue(object, superJson);
|
|
115
|
+
const result = transformed
|
|
116
|
+
? {
|
|
117
|
+
transformedValue: transformed.value,
|
|
118
|
+
annotations: [transformed.type],
|
|
119
|
+
}
|
|
120
|
+
: {
|
|
121
|
+
transformedValue: object,
|
|
122
|
+
};
|
|
123
|
+
if (!primitive) {
|
|
124
|
+
seenObjects.set(object, result);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
if (includes(objectsInThisPath, object)) {
|
|
129
|
+
// prevent circular references
|
|
130
|
+
return {
|
|
131
|
+
transformedValue: null,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const transformationResult = transformValue(object, superJson);
|
|
135
|
+
const transformed = transformationResult?.value ?? object;
|
|
136
|
+
const transformedValue = isArray(transformed) ? [] : {};
|
|
137
|
+
const innerAnnotations = {};
|
|
138
|
+
forEach(transformed, (value, index) => {
|
|
139
|
+
if (index === '__proto__' ||
|
|
140
|
+
index === 'constructor' ||
|
|
141
|
+
index === 'prototype') {
|
|
142
|
+
throw new Error(`Detected property ${index}. This is a prototype pollution risk, please remove it from your object.`);
|
|
143
|
+
}
|
|
144
|
+
const recursiveResult = walker(value, identities, superJson, dedupe, [...path, index], [...objectsInThisPath, object], seenObjects);
|
|
145
|
+
transformedValue[index] = recursiveResult.transformedValue;
|
|
146
|
+
if (isArray(recursiveResult.annotations)) {
|
|
147
|
+
innerAnnotations[index] = recursiveResult.annotations;
|
|
148
|
+
}
|
|
149
|
+
else if (isPlainObject(recursiveResult.annotations)) {
|
|
150
|
+
forEach(recursiveResult.annotations, (tree, key) => {
|
|
151
|
+
innerAnnotations[escapeKey(index) + '.' + key] = tree;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
const result = isEmptyObject(innerAnnotations)
|
|
156
|
+
? {
|
|
157
|
+
transformedValue,
|
|
158
|
+
annotations: !!transformationResult
|
|
159
|
+
? [transformationResult.type]
|
|
160
|
+
: undefined,
|
|
161
|
+
}
|
|
162
|
+
: {
|
|
163
|
+
transformedValue,
|
|
164
|
+
annotations: !!transformationResult
|
|
165
|
+
? [transformationResult.type, innerAnnotations]
|
|
166
|
+
: innerAnnotations,
|
|
167
|
+
};
|
|
168
|
+
if (!primitive) {
|
|
169
|
+
seenObjects.set(object, result);
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=plainer.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DoubleIndexedKV } from './double-indexed-kv.js';
|
|
2
|
+
export class Registry {
|
|
3
|
+
constructor(generateIdentifier) {
|
|
4
|
+
this.generateIdentifier = generateIdentifier;
|
|
5
|
+
this.kv = new DoubleIndexedKV();
|
|
6
|
+
}
|
|
7
|
+
register(value, identifier) {
|
|
8
|
+
if (this.kv.getByValue(value)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!identifier) {
|
|
12
|
+
identifier = this.generateIdentifier(value);
|
|
13
|
+
}
|
|
14
|
+
this.kv.set(identifier, value);
|
|
15
|
+
}
|
|
16
|
+
clear() {
|
|
17
|
+
this.kv.clear();
|
|
18
|
+
}
|
|
19
|
+
getIdentifier(value) {
|
|
20
|
+
return this.kv.getByValue(value);
|
|
21
|
+
}
|
|
22
|
+
getValue(identifier) {
|
|
23
|
+
return this.kv.getByKey(identifier);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=registry.js.map
|